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

