You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Pandas DataFrame将OLS回归改为Lasso与Ridge回归?

如何将OLS回归改写为Lasso和Ridge回归(从statsmodels到scikit-learn)

嘿,我来帮你梳理清楚这个问题!你之前用statsmodels跑OLS得心应手,现在想切换到Lasso和Ridge回归——其实statsmodels里确实没有像sklearn那样封装好的Lasso/Ridge实现,所以转向scikit-learn是完全正确的选择,不过你的代码还有几个小细节可以调整得更规范,我来一步步给你说明:

核心注意点:sklearn线性模型的截距处理

首先要明确:sklearn的线性模型默认不会把常数项作为特征输入,而是通过fit_intercept=True参数(默认开启)自动拟合截距项。所以你之前用sm.add_constant(x)给特征矩阵加常数列的操作是多余的,反而可能导致模型把这个常数列当成普通特征,最终截距计算出现偏差。


1. Lasso回归的完整实现

import pandas as pd
from sklearn import linear_model

# 假设你的数据集df、窗口参数window、特征列cols已经定义完成
y = df['SPXR_{}D'.format(window)]
x = df[cols]

# 初始化Lasso模型,alpha是正则化强度(值越大,惩罚越重,系数压缩越明显)
lasso_model = linear_model.Lasso(alpha=1.0, fit_intercept=True)
# 拟合模型
lasso_result = lasso_model.fit(x, y)

# 查看模型结果
print("Lasso回归系数:", lasso_result.coef_)
print("Lasso回归截距:", lasso_result.intercept_)
# 还可以输出模型的R²拟合优度
print("Lasso模型R²分数:", lasso_result.score(x, y))

2. Ridge回归的完整实现

Ridge的写法和Lasso几乎一致,只是换用linear_model.Ridge类:

# 初始化Ridge模型,同样通过alpha控制正则化强度
ridge_model = linear_model.Ridge(alpha=1.0, fit_intercept=True)
ridge_result = ridge_model.fit(x, y)

# 输出结果
print("Ridge回归系数:", ridge_result.coef_)
print("Ridge回归截距:", ridge_result.intercept_)
print("Ridge模型R²分数:", ridge_result.score(x, y))

额外补充说明

  • alpha参数的作用:alpha是正则化惩罚的强度,当alpha=0时,Lasso/Ridge会退化为普通的OLS回归(不过Lasso在alpha=0时可能存在数值稳定性问题,此时更建议用sklearn的linear_model.LinearRegression来跑OLS)。你可以根据自己的数据集调整alpha值,比如通过交叉验证选择最优alpha。
  • 如果非要用statsmodels?:statsmodels没有专门的Lasso/Ridge封装,虽然可以手动给OLS损失函数加正则项,但实现起来非常繁琐,远不如sklearn的方案简洁高效,所以更推荐使用scikit-learn完成正则化回归任务。

内容的提问来源于stack exchange,提问作者Évariste Galois

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:42:00