我正在进行《An Introduction to Statistical Learning with Applications in R》一书中描述的逻辑回归研究,该书由James、Witten、Hastie、Tibshirani于2013年撰写。
更具体地说,我正在使用R包‘ISLR’中的‘Wage’数据集拟合二元分类模型,如书中§7.8.1节所述。
将预测变量‘age’(转换为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)
然后我绘制了‘True’值的概率与年龄范围的关系图。但结果/图表看起来相当不同。(这里不讨论置信区间带或地毯图,仅讨论概率图。)我在这里遗漏了什么吗?
回答:
经过进一步阅读,我了解到scikit-learn实现的是正则化的逻辑回归模型,而R中的glm不是正则化的。Statsmodels的GLM实现(Python)是非正则化的,并且与R中的结果相同。
R包LiblineaR与scikit-learn的逻辑回归(使用‘liblinear’求解器时)相似。