发布于2026-07-18 阅读(0)
扫一扫,手机访问
做线性回归,Python 里最常用的两套工具就是 statsmodels 和 sklearn。很多新手(甚至老手)在切换使用时,经常被一些看似微小的细节卡住:报错说维度不对、截距莫名其妙多了一个、预测时特征数不匹配……今天就把这些最常见的坑一次性说清楚,顺便把两个库的核心差异也理一理。

OLS 为什么总报 ValueError: endog must be 1-dimensional这个错误几乎天天有人问。原因很简单:statsmodels.api.OLS 要求因变量(endog)必须是严格的一维数组,而你传进去的恰恰是 shape 为 (n, 1) 的二维结构——最常见的就是用了 df[['y']] 而不是 df['y'],或者从 sklearn 那边拿过来的数据没做压平处理。
y = df['y'].values.ra vel() 或 y = df['y'].squeeze(),确保 y.shape == (n,)。df['y'] 返回的是 Series,天然一维;而 df[['y']] 返回的是 DataFrame,二维——这个区别很多人一开始没留意。OLS 不会自动对齐索引。如果 X 和 y 的索引不一致(比如删过行),结果会静默错位,建议先 reset_index(drop=True) 再建模。LinearRegression 需不需要手动加截距项不需要。默认就带截距(fit_intercept=True),而且它把截距当参数单独学,不在 X 里拼一列 1。这一点和 statsmodels 的思路完全不同。
X 前面加了一列 np.ones(n),又没关掉 fit_intercept,模型会拟合出两个截距项,结果完全不可靠。fit_intercept=False,这时才需要确认 X 里没有冗余的常数列。sklearn 要求输入 X 必须是二维(哪怕只有一个特征也要用 reshape(-1, 1)),而 y 是一维——这和 statsmodels 的要求刚好相反,切换时最容易搞混。predict() 报 ValueError: X has 1 features, but LinearRegression is expecting 2 features这说明训练时 X 是二维(比如 df[['x']]),但预测时却传了一维数据(比如 [x0] 或 np.array([x0]))。
model.predict([[x0]]) 或 model.predict(np.array([[x0]]))。X_new.shape[1] 和训练时一致;用 df[['x']].values 比 df['x'].values 更安全,因为前者始终是二维。statsmodels 的 predict() 相对宽松些,能接受一维输入,但前提是你建模时用了 add_constant() 且维度匹配——很多人会漏掉这一步。sklearn 输出系数,statsmodels 输出完整统计表两者定位不同。sklearn 给你 coef_ 和 intercept_,干净利落,适合快速部署和预测;statsmodels 的 summary() 则包含 t 值、p 值、R²、置信区间,更适合做推断和假设检验。
sklearn,.predict() 直接可用,模型序列化也简单(joblib)。statsmodels,而且记得调用 add_constant(X) 再传给 OLS。statsmodels 默认报告调整 R²(Adj. R-squared),更严谨。实际用的时候,最常卡住的真不是公式理解,而是维度对不上、索引没对齐、还有那个神出鬼没的常数列。多打两次 shape 和 ndim,比硬猜快得多。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8