我正在做James, Witten, Hastie, Tibshirani(2013)的《An Introduction to Statistical Learning with Applications in R》一书中描述的逻辑回归。
更具体地说,我正在将二元分类模型拟合到§7.8.1中描述的R包"ISLR"中的"工资"数据集。
预测器"年龄"(转换为多项式,度4)拟合针对二元分类工资>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)
然后我根据年龄范围绘制了"真实"值的概率。但结果/情节看起来完全不同。(这里说的不是CI波段或rugplot,而是概率图。)我遗漏了什么吗?
在进一步阅读之后,我了解到scikit-learn实现了一个正则化的逻辑回归模型,而R中的glm不是正则化的。statmodels的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/