Python logistic回归中的不同概率输出-sklearn和Stata

Python logistic回归中的不同概率输出-sklearn和Stata,python,scikit-learn,statistics,stata,logistic-regression,Python,Scikit Learn,Statistics,Stata,Logistic Regression,这是我第一次尝试在python中使用逻辑回归,我遇到了一个严重的问题 我感兴趣的结果不是0-1输出,这意味着在logit中选择的“决定”。相反,我想得到选择一个选项的概率。我还有Stata的概率输出,以供比较 我有三个数据列表:scLL、scLL2和scLLchoice。我读到Stata忽略了NaN数据,所以因为有时scLL和scLL2可能包含NaN,所以我尝试了两种不同的方法。我只是删除了scLL、scLL2和scLLchoice中的行(若行中的数据为NaN)。另一种选择是使用插补器(正如您在

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

我感兴趣的结果不是0-1输出,这意味着在logit中选择的“决定”。相反,我想得到选择一个选项的概率。我还有Stata的概率输出,以供比较

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

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,因为我使用了不同的计算器


我该怎么办呢?

好吧,可以说结果并没有那么不同;它们在质量上是相似的,这意味着两个实现之间的设置不同

在这种情况下,最可能的怀疑是sklearn的逻辑回归(LR)默认使用
penal='l2'
参数();换句话说,sklearn的实现不是“普通的”LR,而是实际的Ridge LR。我不熟悉Stata(您也不发布相关代码),但从他们自己的角度来看,这里的情况似乎不是这样,因此结果不同

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

logistic_regression= LogisticRegression(penalty='none')

关于statsmodels,它们有自己独特的默认值(即没有截距);有关详细信息,请参阅交叉验证线程。

这些答案适用于完全相同的测试集?是的,它们是相同的。如果输入以相同的顺序输入,并且两个程序中的参数相同,并且它们都使用相同的舍入近似值,则它们应该是相同的。否则会有差异在一天结束时,每个程序中的代码都是以不同的方式编写的。多次迭代中的微小更改可能会导致最终结果的微小更改。没什么好担心的。依我看!实际上,我尝试了“无”选项。它确实改变了输出,但它们仍然与Stata中的不同。感谢您的链接,我能够使用(fit_intercept=False,C=1e9)选项从统计模型中复制结果。@Kubaaaa不再需要
C=1e9
参数-
penal='none'
(在编写原始答案时不可用-请参阅更新)应该完成这项工作。