为何seaborn regplot与statsmodels logit逻辑回归系数不一致?
问题原因与修复方案
核心错误
你存在两个关键问题:
- 混淆了逻辑回归的线性预测项与概率输出:
- statsmodels的
logit输出的截距和系数,对应的是**对数几率(Logit值)**的线性公式:log(p/(1-p)) = Intercept + x*coef,其中p是y=1的概率。 - seaborn的
regplot(logistic=True)绘制的是概率p随x变化的S型曲线,也就是把对数几率通过sigmoid函数转换后的结果:p = 1/(1 + exp(-(Intercept + x*coef)))。 - 你用
plt.axline绘制的是对数几率的直线,和seaborn的概率曲线完全不是同一维度的结果,必然出现差异。
- statsmodels的
- 模型拟合的底层实现差异(次要):
- seaborn的
regplot(logistic=True)底层使用scikit-learn的LogisticRegression,默认会对特征做标准化;而statsmodels的logit直接基于原始特征拟合,这也会导致系数数值上的不同,但这不是可视化差异的主因。
- seaborn的
修正后的代码
要让statsmodels的模型结果和seaborn的可视化匹配,需要计算模型的概率预测值并绘制曲线,而非直接画线性直线:
import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt from statsmodels.formula.api import logit np.random.seed(2022) # 固定随机种子 df = pd.DataFrame({ 'y': np.random.randint(2, size=10), 'x': np.random.rand(10) }) mdl = logit("y ~ x", data=df).fit() print(mdl.summary()) # 生成覆盖x取值范围的序列,用于绘制平滑曲线 x_seq = np.linspace(df['x'].min(), df['x'].max(), 100) # 用statsmodels模型预测对应x的概率 y_pred_prob = mdl.predict(pd.DataFrame({'x': x_seq})) # 绘制seaborn的逻辑回归概率曲线 sns.regplot(y='y', x='x', data=df, logistic=True, ci=None) # 绘制statsmodels模型的概率曲线(黑色虚线) plt.plot(x_seq, y_pred_prob, color='black', linestyle='--') plt.show()
额外说明:让两个模型系数一致
如果需要让seaborn和statsmodels的模型系数完全匹配,可以关闭seaborn底层模型的特征标准化,修改regplot的参数:
sns.regplot( y='y', x='x', data=df, logistic=True, ci=None, logistic_kws={'normalize': False} # 适配scikit-learn旧版本 # 新版本scikit-learn需改用:logistic_kws={'preprocessor': None} )
内容的提问来源于stack exchange,提问作者antobzzll
相关产品推荐
相关产品推荐

