【问题标题】:Different probabilities output in logistic regression - sklearn and Stata逻辑回归中的不同概率输出 - sklearn 和 Stata
【发布时间】:2023-04-04 22:45:01
【问题描述】:

这是我第一次尝试在python中使用逻辑回归,但遇到了一个严重的问题。

我感兴趣的结果不是零一输出,意思是关于 logit 选择的“决定”。相反,我想获得选择一个选项的概率。我也有来自 Stata 的概率输出以供比较。

我有三个包含数据的列表:scLL、scLL2 和 scLLchoice。我读到 Stata 忽略了 NaN 数据,所以因为有时 scLL 和 scLL2 可能包含 NaN 我尝试了两种不同的方法。如果行中的数据为 NaN,我刚刚删除了 scLL、scLL2 和 scLLchoice 中的行。另一种选择是使用 imputer - (正如您在代码中看到的那样),但效果是一样的。这是一个代码:

X=list(zip(scLL, scLL2))
y=scLLchoice
probStim2a=[]



imputer = SimpleImputer(missing_values=float("nan"), strategy='mean')
X_imputed = imputer.fit_transform(X)
logistic_regression= LogisticRegression()
logistic_regression.fit(X_imputed,y)
y_pred=logistic_regression.predict(X_imputed)


probStim2a=list(logistic_regression.predict_proba(X_imputed)[:,1])

for i in range(len(probStim2a)):
        print (probStim2a[i])

这是我输出的一部分:

0.5146826469187935
0.5891472587984292
0.596839657578841
0.5570721046966637
0.35240422902193136

问题是Stata的输出完全不同:

0,5313423
0,6109276
0,6185878
0,5741577
0,3578928

我检查了输入是否相同(确实如此)。 我还尝试使用 statsmodel 进行比较,我再次得到了不同的输出(不仅与来自 Stata 的数据不同,而且与 sklearn 输出相比也不同)。这些不同的工具是否有可能产生如此不同的输出,而我的代码中不是一些错误?我知道这是根据概率计算的,但 2 + 2 不应该等于 5,因为我使用了不同的计算器...

我该怎么办?

【问题讨论】:

  • 这些答案是针对完全相同的测试集的吗?
  • 是的,它们是一样的
  • 如果输入的顺序相同并且两个程序中的参数相同并且它们都使用相同的舍入近似值,那么它们应该是相同的。否则会有差异
  • 在一天结束时,每个程序中的代码编写不同,多次迭代的微小变化可能会导致最终结果的微小变化。没什么好担心的。在我看来

标签: python scikit-learn statistics stata logistic-regression


【解决方案1】:

好吧,可以说结果并没有那么不同;它们确实具有质的相似性,这意味着两种实现之间存在一些不同的设置。

在这种情况下,最可能的嫌疑是sklearn的逻辑回归(LR)默认使用penalty='l2'参数(docs);换句话说,sklearn 的实现不是“vanilla” LR,实际上是 Ridge LR。我不熟悉Stata(并且您没有发布相关代码),但是从他们自己的documentation看来,这里并非如此,因此结果不同。

要获得相同的结果,请尝试去除 sklearn 中的 L2 惩罚,即:

logistic_regression= LogisticRegression(penalty='none')

关于 statsmodels,它们有自己的特殊默认值(即没有截距);有关详细信息,请参阅交叉验证线程 Logistic Regression: Scikit Learn vs Statsmodels

【讨论】:

  • 谢谢!我实际上尝试了惩罚 ='none' 选项。它确实改变了输出,但它们仍然与 Stata 中的不同。感谢您的链接,我能够使用 (fit_intercept = False, C = 1e9) 选项重现统计模型的结果。
  • @Kubaaaa C=1e9 参数应该不再需要 - penalty='none'(在撰写原始答案时不可用 - 请参阅更新)应该可以完成这项工作。
猜你喜欢
  • 2015-05-04
  • 2013-12-24
  • 2018-09-24
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2019-04-04
  • 2019-04-06
  • 2020-06-13
相关资源
最近更新 更多