繁体   English   中英

比较 Scikit-learn (Python) 和 glm (R) 中的逻辑回归

[英]Comparing logistic regression in Scikit-learn (Python) and glm (R)

我正在尝试比较 R glm stats 包和 Scikit-learn Python 中的逻辑回归。 这是我的数据集。 数据集

这是python代码

import pandas as pd
from sklearn.linear_model import LogisticRegression

df = pd.read_csv("dataset.csv")
df = df.join(pd.get_dummies(df['var2'], prefix = 'var2', drop_first= True))
df.drop(columns = ['var2'], inplace = True)

X = df.loc[:,df.columns != 'y']
y = df.y

model = LogisticRegression(fit_intercept=True, penalty = 'none' )
model.fit(X, y)
prob = model.predict_proba(X)
model.coef_

以下是系数:

var1, var3, var4, var2_B, var2_C
-1.833653e-07, 2.823982e-12, 2.568188e-12, -4.116901e-13, 5.514602e-14

这是相应的R代码:

df=read_csv(file = "dataset.csv")
glm_fit <- glm(y ~.,data = df,   family=binomial(link = 'logit'))
summary(glm_fit)

以下是系数:

(Intercept) -6.459e-01 
var1        -1.042e-07  
var2B       -7.731e-01  
var2C        1.880e+00  
var3        -1.124e-04  
var4         2.994e-03

很容易检查进入求解器的矩阵在这两种情况下是否相同。 如您所见,系数完全不同。 R 中的 ROC AUC 也比 Python 中的要好得多。 我知道使用了不同的求解器,但解决方案的差异似乎太大了。 有没有办法解决它?

实际上,这似乎是lbfgs求解器( sklearn使用的默认值)无法在未缩放的输入数据上正常工作的问题。 首先缩放输入并相应地修改系数,我基本上恢复了您从glm报告的相同系数:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_sc = scaler.fit_transform(X)
model.fit(X_sc, y)
model.coef_ / scaler.scale_

sagsaga求解器遭受同样的命运,而newton-cg实际上接近并抛出收敛警告。 增加迭代次数只会增加一个关于舍入错误的警告,防止更好的收敛。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM