R 和 scikit-learn 用于逻辑回归分类任务的比较

Comparison of R and scikit-learn for a classification task with logistic regression

我正在做 James、Witten、Hastie、Tibshirani(2013)一书中描述的逻辑回归。

更具体地说,我正在将二进制分类模型拟合到来自 R 包 'ISLR' 的 'Wage' 数据集,如 §7.8.1 中所述。

预测器'age'(转换为多项式,4次)针对二元分类wage>250进行拟合。然后根据 'True' 值的预测概率绘制年龄。

R中的模型拟合如下:

fit=glm(I(wage>250)~poly(age,4),data=Wage, family=binomial)

agelims=range(age) 
age.grid=seq(from=agelims[1],to=agelims[2])
preds=predict(fit,newdata=list(age=age.grid),se=T)
pfit=exp(preds$fit)/(1+exp(preds$fit))

完整代码(作者站点):http://www-bcf.usc.edu/~gareth/ISL/Chapter%207%20Lab.txt
书中对应情节:http://www-bcf.usc.edu/~gareth/ISL/Chapter7/7.1.pdf(右)

我尝试将模型拟合到 scikit-learn 中的相同数据:

poly = PolynomialFeatures(4)
X = poly.fit_transform(df.age.reshape(-1,1))
y = (df.wage > 250).map({False:0, True:1}).as_matrix()
clf = LogisticRegression()
clf.fit(X,y)

X_test = poly.fit_transform(np.arange(df.age.min(), df.age.max()).reshape(-1,1))
prob = clf.predict_proba(X_test)

然后我根据年龄范围绘制了 'True' 值的概率。但是 result/plot 看起来很不一样。 (不是在谈论 CI 乐队或地毯图,只是概率图。)我在这里遗漏了什么吗?

经过更多阅读,我了解到 scikit-learn 实现了正则化逻辑回归模型,而 R 中的 glm 未正则化。 Statsmodels 的 GLM 实现 (python) 未正则化并给出与 R 中相同的结果。

http://statsmodels.sourceforge.net/stable/generated/statsmodels.genmod.generalized_linear_model.GLM.html#statsmodels.genmod.generalized_linear_model.GLM

R 包 LiblineaR 类似于 scikit-learn 的逻辑回归(使用 'liblinear' 求解器时)。

https://cran.r-project.org/web/packages/LiblineaR/