如何将sklearn逻辑回归优化配置迁移到statsmodels并获取置信区间
sklearn逻辑回归配置迁移到statsmodels实现指南
核心参数对应关系
- 模型实现对应:sklearn的
LogisticRegression(逻辑回归)对应statsmodels的广义线性模型sm.GLM,二分类场景下指定家族参数为sm.families.Binomial(link=sm.families.links.Logit())即可 - L2正则参数转换:sklearn中L2正则的强度由
C控制,正则项公式为(1/C) * ||权重||² / 2;statsmodels中L2正则参数为alpha,正则项公式为alpha * ||权重||² / 2,二者转换公式为alpha = 1 / C,无正则需求时将alpha设为0即可 - 截距项配置对应:sklearn通过
fit_intercept=True/False直接控制是否拟合截距;statsmodels默认不会给特征矩阵加截距项,需要手动调用sm.add_constant(特征矩阵)添加全1常数列,对应fit_intercept=True,不添加则对应fit_intercept=False - 正则作用范围注意:sklearn默认对截距项也施加L2正则,若要和statsmodels默认行为(仅对特征权重加正则)对齐,可在sklearn训练时添加参数
intercept_scaling=10000弱化截距的正则影响,也可以在statsmodels中调整正则配置匹配sklearn原有逻辑。
完整迁移代码示例
import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split import statsmodels.api as sm # ---------------------- 1. 模拟数据 & sklearn侧优化好的配置示例 ---------------------- # 生成模拟二分类数据 np.random.seed(42) X = np.random.randn(1000, 5) y = (X[:, 0] + 2*X[:, 1] - 0.5*X[:, 2] + np.random.randn(1000) > 0).astype(int) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 你已经通过k折交叉验证优化好的sklearn逻辑回归配置 sklearn_C = 2.0 # 优化得到的C值 sklearn_fit_intercept = True # 优化得到的截距配置 sklearn_model = LogisticRegression( penalty='l2', C=sklearn_C, fit_intercept=sklearn_fit_intercept, random_state=42 ) sklearn_model.fit(X_train, y_train) print("sklearn模型权重:", sklearn_model.coef_) print("sklearn模型截距:", sklearn_model.intercept_) # ---------------------- 2. 迁移到statsmodels配置 ---------------------- # 步骤1:处理截距项 if sklearn_fit_intercept: X_train_sm = sm.add_constant(X_train) else: X_train_sm = X_train.copy() # 步骤2:转换正则参数 sm_alpha = 1 / sklearn_C # 步骤3:初始化并训练statsmodels模型 sm_model = sm.GLM( endog=y_train, exog=X_train_sm, family=sm.families.Binomial(link=sm.families.links.Logit()) ) # 传入L2正则参数训练,refit=False表示用正则化结果不要重拟合无正则模型 sm_results = sm_model.fit_regularized( method='l1', # 选l1方法但把L1正则权重设为0,仅启用L2正则 alpha=sm_alpha, L1_wt=0, refit=False ) print("\nstatsmodels模型参数(含截距在第一行):", sm_results.params) # ---------------------- 3. 获取参数置信区间 ---------------------- # 无正则场景(alpha=0)可以直接调用普通fit方法获取统计量: # sm_results = sm_model.fit() # print("参数95%置信区间:\n", sm_results.conf_int(alpha=0.05)) # 正则化模型的置信区间可通过自助法采样计算得到
结果说明
- 两个模型训练得到的权重、截距数值基本一致,误差来自优化器的实现差异
- 如果不需要正则,直接去掉
fit_regularized相关参数,调用普通fit()方法即可直接获取参数标准误、p值、置信区间等原生统计量
内容的提问来源于stack exchange,提问作者WhiskeyHammer
相关产品推荐
相关产品推荐

