R 和 scikit-learn 在分类任务中与逻辑回归的比较
Posted
技术标签:
【中文标题】R 和 scikit-learn 在分类任务中与逻辑回归的比较【英文标题】:Comparison of R and scikit-learn for a classification task with logistic regression 【发布时间】:2015-10-18 17:54:54 【问题描述】:我正在执行 James、Witten、Hastie、Tibshirani(2013 年)所著的“An Introduction to Statistical Learning with Applications in R”一书中描述的逻辑回归。
更具体地说,我将二进制分类模型拟合到第 7.8.1 节中描述的 R 包“ISLR”中的“工资”数据集。
预测变量“年龄”(转换为多项式,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 波段或地毯图,只是概率图。)我在这里遗漏了什么吗?
【问题讨论】:
【参考方案1】:经过更多阅读,我了解到 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/
【讨论】:
以上是关于R 和 scikit-learn 在分类任务中与逻辑回归的比较的主要内容,如果未能解决你的问题,请参考以下文章
python TF IDF在Python中与Scikit-Learn实现一起解释
scikit-learn RandomForestClassifier 产生“意外”结果