如何基于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
相关产品推荐
相关产品推荐

