sklearn.LinearRegression predict 全为 nan 的常见原因是输入特征含 NaN 或 inf,因该模型不检查缺失值;应训练前用 np.isnan(X).any() 和 np.isinf(X).any() 检查,并优先用 SimpleImputer(strategy='median') 处理缺失值。

sklearn.LinearRegression 为什么训练完 predict 出来全是 nan?
常见错误是传了含 NaN 或 inf 的特征矩阵进去,LinearRegression 不做任何缺失值检查,直接计算失败,后续 predict 返回全 nan。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 训练前务必用
np.isnan(X).any()和np.isinf(X).any()检查输入 - 别依赖
fillna()盲填——线性回归对异常值敏感,优先用SimpleImputer(strategy='median')替换数值型缺失 - 如果用了
StandardScaler,记得先fit_transform训练集、再transform测试集,顺序错会导致 scale 不一致,预测值漂移
statsmodels.OLS 和 sklearn.LinearRegression 算出来的系数为啥不一样?
根本区别在是否默认加截距项,以及是否中心化处理。statsmodels.OLS 默认不加常数列,必须显式调用 sm.add_constant(X);而 sklearn.LinearRegression(fit_intercept=True) 默认加,且内部会对 X 和 y 做中心化再求解。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 要严格比对系数,两边都设
fit_intercept=True(sklearn)+sm.add_constant(X)(statsmodels) -
statsmodels.OLS返回的summary()里std err和p-value是基于解析解的标准误推导,sklearn不提供这些统计量,别拿coef_直接去套 t 检验 - 如果数据量大(>10⁵ 样本),
sklearn底层用 LAPACK 的dgelss更快;statsmodels在小样本下更利于诊断多重共线性(看 condition number)
最小二乘法的矩阵解 (XᵀX)⁻¹Xᵀy 在 Python 里真这么算吗?
几乎从不手动算。直接求逆 np.linalg.inv(X.T @ X) 数值不稳定,尤其当 X 接近秩亏(比如有高度相关特征)时,(XᵀX) 条件数爆炸,结果完全不可信。
实操建议:
立即学习“Python免费学习笔记(深入)”;
-
sklearn.LinearRegression底层调用的是scipy.linalg.lstsq,用 SVD 分解求最小二乘解,天然抗病态 - 自己手写验证时,用
np.linalg.lstsq(X, y, rcond=None)[0],别碰inv或pinv - 如果硬要观察 (XᵀX)⁻¹,先检查
np.linalg.cond(X.T @ X)—— 超过 1e12 就别信逆矩阵了
用 LinearRegression 做预测,test set R² 是负数正常吗?
正常,而且很说明问题:模型在测试集上连“直接用训练集 y 均值预测”都不如。不是代码写错了,是模型严重过拟合或特征与目标毫无线性关系。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- R² 负值意味着
1 - (SS_res / SS_tot)中的SS_res > SS_tot,即残差平方和大于总离差平方和 - 先画
y_testvsy_pred散点图,看是否完全散乱无趋势;再检查特征是否漏做了标准化(尤其混入了量纲差异极大的变量) - 别急着换模型——先用
VarianceThreshold剔除方差为 0 的特征,再用SelectKBest看单变量 F 值,确认至少有几个特征和 y 有基本线性关联
最小二乘对输入质量极度敏感,不是算法不够强,而是它把数据里的问题照单全收。上线前多看一眼 X.shape、np.isfinite(X).all()、np.corrcoef(X, y, rowvar=False)[-1, :-1],比调参重要得多。










