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

我正在做一个Logistic回归,描述在James,Witten,Hastie,Tibshirani(2013)的“R中应用统计学习的介绍”一书中.

更具体地说,我将二进制分类模型拟合到§7.8.1中描述的R包’ISLR’中的’Wage’数据集.

将预测器’年龄'(变换为多项式,阶数4)与二进制分类工资> 250进行拟合.然后根据“真实”值的预测概率绘制年龄.

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)

然后,我绘制了“真实”值与年龄范围的概率.但结果/情节看起来很不一样. (不是谈论CI乐队或rugplot,只是概率图.)我在这里遗漏了什么?

最佳答案 经过一些阅读后,我理解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/

点赞