使用R的glmnet的Ridge回归和Python的scikit-learn有什么区别?


11

我正在阅读James,Witten,Hastie,Tibshirani(2013)写的《 R语言中的统计学习及其应用入门》一书中关于Ridge回归/套索的LAB部分§6.6 。

更具体地说,我尝试将scikit-learn Ridge模型应用于R包“ ISLR”中的“ Hitters”数据集。我已经创建了与R代码所示相同的一组功能。但是,我无法接近glmnet()模型的结果。我选择了一个L2调整参数进行比较。(scikit-learn中的“ alpha”参数)。

蟒蛇:

regr = Ridge(alpha=11498)
regr.fit(X, y)

http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb

R:

请注意,alpha=0in 参数glmnet()表示应采用L2惩罚(Ridge回归)。文档警告不要为输入单个值lambda,但结果与使用向量的ISL中的结果相同。

ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)

是什么导致差异?

编辑:从R中的惩罚包
使用时penalized(),系数与scikit-learn相同。

ridge.mod2 <- penalized(y,x,lambda2=11498)

也许问题可能还会是:“ 进行Ridge回归glmnet()penalized()进行回归时有什么区别?

用于R包glmnet中的实际Fortran代码的新python包装器
https://github.com/civisanalytics/python-glmnet


5
完全不熟悉glmnet岭回归。但默认情况下,sklearn.linear_model.Ridge会进行非罚分截取估计(标准),并且惩罚会使得||Xb - y - intercept||^2 + alpha ||b||^2最小化b。惩罚前面可能有因素1/21/n_samples或两者兼而有之,使结果立即不同。为了排除罚金缩放问题,请将两种情况下的罚金都设置为0,解决那里的所有差异,然后检查加回罚金的结果。顺便说一句,恕我直言,这里是问这个问题的正确地方。

Answers:


9

我的答案缺少的因数,请参见下面的@visitors答案以进行正确的比较。1N


这是两个应该阐明关系的参考。

sklearn文档说可以linear_model.Ridge优化以下目标函数

|Xβy|22+α|β|22

glmnet论文说,弹性网优化了以下目标函数

|Xβy|22+λ(12(1α)|β|22+α|β|1)

请注意,这两种实现使用以完全不同的方式,sklearn用途为正规化建设的整体水平,同时glmnet用途为目的,保留的脊和套索正规化之间的交易。 α λ αααλα

比较这些公式,看起来在glmnet中设置和应该可以从中恢复解决方案。λ = 2 α sklearnα=0λ=2αsklearnlinear_model.Ridge


我也完全没有想到@eickenberg的评论。我必须使用standardize = FALSEglmnet()得到相同的结果。
Jordi

@Jordi如果linear_model.Ridge用于任何现实世界分析,则绝对应该标准化。
马修·德鲁里

我了解sklearn linear_model.Ridge模型会自动将功能标准化。规范化是可选的。我想知道为什么我然后需要停用标准化glmnet()才能使模型产生相同的结果。
Jordi

10

马修·德鲁里(Matthew Drury)的答案应该为1 / N。更确切地说...

glmnet文件指出弹性净减少损失函数

1个ñXβ-ÿ22+λ1个21个-αβ22+αβ1个

sklearn文件说,linear_model.Ridge最小化损失函数

Xβ-ÿ22+αβ22

相当于最小化

1个ñXβ-ÿ22+αñβ22

为了从glmnet和sklearn获得相同的解决方案,它们的损失函数必须相等。这意味着在glmnet中设置和。α=0λ=2ñα斯克莱恩

library(glmnet)
X = matrix(c(1, 1, 2, 3, 4, 2, 6, 5, 2, 5, 5, 3), byrow = TRUE, ncol = 3)
y = c(1, 0, 0, 1)
reg = glmnet(X, y, alpha = 0, lambda = 2 / nrow(X))
coef(reg)

glmnet输出:–0.03862100,–0.03997036,–0.07276511、0.42727955

import numpy as np
from sklearn.linear_model import Ridge
X = np.array([[1, 1, 2], [3, 4, 2], [6, 5, 2], [5, 5, 3]])
y = np.array([1, 0, 0, 1])
reg = Ridge(alpha = 1, fit_intercept = True, normalize = True)
reg.fit(X, y)
np.hstack((reg.intercept_, reg.coef_))

sklearn输出:–0.03862178,–0.0399697,–0.07276535、0.42727921


4
参数的不同定义及其在不同库中使用的缩放比例是造成混淆的常见原因。
AaronDefazio

1
我不希望Gung和我都会错。
Michael R. Chernick

2
是的,你们两个都错了。您拒绝我的修改的原因清楚地表明,你们两个都没有在stats.stackexchange.com/review/suggested-edits/139985上看到我的评论“ 1 / N的缺失因子”
访客

您所做的修改可能被拒绝了,因为它所做的更改不仅限于声明的内容。如果您想编辑我的帖子并且仅更改丢失的因素,请这样做,但是更改我的链接,措辞和代码也太过分了。答案中关于您不公平待遇的评论是不适当的,并且与问题的内容无关,请删除它们。您的措辞也使我的回答显得pla贬不一,这不是回应被拒绝的编辑的正确方法。我们希望您能为我们的社区做出宝贵的贡献,但是请在戒除我们之前先熟悉一下我们的准则。
马修·德鲁里

1
@visor对不起,如果我有点不高兴。我真的应该只是在尝试传达您似乎是该站点的潜在潜在贡献者,并且我希望您拥有良好的经验。就像其他团体一样,我们也有一些社会规范,如果您始终了解这些规范,将会有更好的体验。我仍然认为“ Matthew Drury的答案是错误的”非常苛刻,肯定有更好的方法来传达我的答案错误地缺少的因子。“ X的答案是错误的”理解为人身攻击。1个ñ
马修·德鲁里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.