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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:31:38