如何在statsmodels的正则化Logit回归中指定Newton求解器?
在statsmodels的fit_regularized中指定Newton求解器的方法
在statsmodels里,普通Logit回归可以通过fit(method='newton')指定Newton求解器,但做正则化时,直接用fit(method='l1')的方式没法指定求解器,这也是它和sklearn的L1正则化模型存在差异的原因。
核心结论
statsmodels的fit_regularized()方法不支持直接指定Newton作为求解器——因为正则化拟合的底层实现依赖专门的优化器(比如默认的lbfgs),这类优化器更适配带正则项的非光滑目标函数,而Newton-Raphson本身对L1这种非光滑正则项的兼容性很差,所以官方没有做直接支持。
两种可行的替代方案
方案一:手动实现带L1正则的Newton迭代
自己写Newton-Raphson迭代逻辑,在每一步参数更新后加入L1正则的软阈值处理,示例代码如下:import statsmodels.api as sm import numpy as np # 初始化Logit模型 logit_model = sm.Logit(y_train, x_train) params = np.zeros(x_train.shape[1]) # 参数初始值 alpha = 0.1 # L1正则强度,可根据需求调整 tol = 1e-6 # 收敛阈值 max_iter = 100 for _ in range(max_iter): # 计算Logit模型的得分函数和海塞矩阵 pred = logit_model.predict(params) score = x_train.T @ (y_train - pred) hessian = -x_train.T @ (np.diag(pred * (1 - pred)) @ x_train) # Newton步更新无正则参数 delta = np.linalg.inv(hessian) @ score params_unreg = params + delta # 应用L1正则的软阈值处理 params = np.sign(params_unreg) * np.maximum(np.abs(params_unreg) - alpha, 0) # 判断是否收敛 if np.linalg.norm(delta) < tol: break # 可选:将拟合后的参数赋值给模型对象,方便后续使用 logit_model.fit_params = params方案二:使用statsmodels支持的正则化优化器
如果不需要严格的Newton方法,可以直接用fit_regularized()指定适配正则化的优化器,比如lbfgs,并设置纯L1正则(通过L1_wt=1):import statsmodels.api as sm # 纯L1正则化Logit回归,使用LBFGS求解器 model_reg = sm.Logit(y_train, x_train).fit_regularized( method='lbfgs', alpha=0.1, # 正则强度 L1_wt=1 # 1表示纯L1正则,0表示纯L2,0-1之间是弹性网 )
内容的提问来源于stack exchange,提问作者David Bidzhoian
相关产品推荐
相关产品推荐

