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

如何在statsmodels中实现带L1惩罚与类别权重的逻辑回归?

问题描述

由于存在类别不平衡问题,需要在statsmodels中运行同时带有L1惩罚(Lasso)和类别权重的逻辑回归。已分别实现过带L1惩罚的逻辑回归,以及带类别权重的逻辑回归,但无法将两者结合:

  • 使用sm.Logit的fit_regularized(method='l1')可以实现L1惩罚,但不知道如何加入类别权重
  • 使用sm.GLM并传入freq_weights可以实现加权逻辑回归,但调用fit_regularized(method='l1')会报错,因为该方法不支持L1参数

已在scikit-learn中实现需求,但需要statsmodels提供的额外统计信息。

之前的尝试代码片段:

# 带L1惩罚的Logit模型
import numpy as np
import statsmodels.api as sm
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=6, shuffle=True, stratify=y)
logit_model_l1 = sm.Logit(y_train, sm.add_constant(X_train))
result_l1 = logit_model_l1.fit_regularized(method='l1')
# 带类别权重的GLM模型
logit_model_weighted = sm.GLM(y_train, sm.add_constant(X_train), family=sm.families.Binomial(), freq_weights=np.asarray(y_train))
result_weighted = logit_model_weighted.fit()
# 改为fit_regularized(method='l1')会报错
解决方案

可以直接使用sm.Logit的fit_regularized方法,通过weights参数传入类别权重,即可同时实现L1惩罚和类别加权。

完整代码示例

import numpy as np
import statsmodels.api as sm
from sklearn.model_selection import train_test_split

# 生成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=6, shuffle=True, stratify=y)

# 计算类别权重(二分类场景:逆类别频率权重)
n_samples = len(y_train)
n_classes = len(np.unique(y_train))
class_counts = np.bincount(y_train)
# 每个样本的权重:总样本数 / (类别数 * 对应类别的样本数)
sample_weights = n_samples / (n_classes * class_counts[y_train])

# 构建带常数项的特征矩阵
X_train_const = sm.add_constant(X_train)

# 构建Logit模型并拟合(同时传入L1惩罚和样本权重)
logit_model = sm.Logit(y_train, X_train_const)
result = logit_model.fit_regularized(
    method='l1',
    weights=sample_weights,  # 传入类别权重
    alpha=1.0,  # L1惩罚强度,可根据需求调整
    maxiter=1000
)

# 查看回归结果
print(result.summary())
关键说明
  • 权重计算:示例中使用的是逆类别频率权重,目的是让少数类样本获得更高的权重,缓解类别不平衡问题。你也可以根据需求自定义权重(比如手动指定少数类权重为5,多数类为1)。
  • fit_regularized的weights参数:该参数接受与训练样本数长度一致的数组,每个元素对应一个样本的权重,statsmodels会在正则化拟合过程中考虑这些权重。
  • GLM的限制:statsmodels的GLM模块的fit_regularized方法目前仅支持L2(Ridge)惩罚,不支持L1(Lasso),因此无法通过GLM实现需求。而Logit模块的正则化实现同时支持L1惩罚和样本权重,是更合适的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:50:34