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

为何seaborn regplot与statsmodels logit逻辑回归系数不一致?

问题原因与修复方案

核心错误

你存在两个关键问题:

  1. 混淆了逻辑回归的线性预测项与概率输出:
    • 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的概率曲线完全不是同一维度的结果,必然出现差异。
  2. 模型拟合的底层实现差异(次要):
    • seaborn的regplot(logistic=True)底层使用scikit-learn的LogisticRegression,默认会对特征做标准化;而statsmodels的logit直接基于原始特征拟合,这也会导致系数数值上的不同,但这不是可视化差异的主因。

修正后的代码

要让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:18:14