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

2024-09-28 23:37:07 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次尝试在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,因为我使用了不同的计算器

我该怎么办


Tags: 数据代码nan概率listfitlogisticstata
1条回答
网友
1楼 · 发布于 2024-09-28 23:37:07

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

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

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

logistic_regression= LogisticRegression(penalty='none')

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

相关问题 更多 >