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

statsmodels的GLM模型是否实现Ridge/Lasso正则化?能否调用fit_regularized?

正则化GLM在Statsmodels中的实现问题

你触发的NotImplementedError核心原因是:Statsmodels的GLM类并未实现fit_regularized方法——这个错误在调用fit_regularized时就会抛出,和后续的.summary()无关。

可行的替代方案

由于你使用的是Gaussian()族GLM,它与普通最小二乘(OLS)回归本质等价,因此可以直接借助OLS的正则化能力实现需求;如果后续需要扩展到非高斯族,也有其他工具可选:

方案1:改用OLS的正则化拟合

无论是矩阵接口还是公式接口,OLS都支持fit_regularized,完美匹配你当前的高斯GLM场景:

# 公式接口示例
import statsmodels.formula.api as smf

model = smf.ols(formula="wage ~ workhours + gender", data=train)
# method可选'elastic_net',alpha是正则强度,L1_wt=1对应Lasso,0对应Ridge
fitted_model = model.fit_regularized(method='elastic_net', alpha=1.0, L1_wt=1.0)

# 查看系数
print(fitted_model.params)

方案2:用Scikit-learn处理非高斯族正则化GLM

如果后续需要针对泊松、二项式等非高斯族做正则化,Scikit-learn提供了开箱即用的实现:

  • 高斯族:Lasso/Ridge/ElasticNet
  • 二项式(逻辑回归):LogisticRegression(默认带L2正则)
  • 泊松族:PoissonRegressor

示例(Lasso正则化高斯回归):

from sklearn.linear_model import Lasso
from sklearn.preprocessing import OneHotEncoder
import pandas as pd

# 处理分类变量gender的编码
encoder = OneHotEncoder(drop='first', sparse_output=False)
gender_encoded = encoder.fit_transform(train[['gender']])
X = pd.concat([train[['workhours']], pd.DataFrame(gender_encoded, columns=encoder.get_feature_names_out())], axis=1)
y = train['wage']

# 拟合模型
lasso = Lasso(alpha=1.0)
lasso.fit(X, y)

# 输出结果
print("系数:", pd.Series(lasso.coef_, index=X.columns))
print("截距:", lasso.intercept_)

方案3:自定义正则化GLM(进阶)

如果必须在Statsmodels的GLM框架内实现,可通过GenericLikelihoodModel自定义带正则项的目标函数,但需要手动推导正则化后的对数似然,适合有统计基础的用户。


内容的提问来源于stack exchange,提问作者Xtiaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:34:54