Python Glmnet 包装器错误,Lambda = 0

Python Glmnet Wrapper Errors with Lamda = 0

我正在使用 python glmnet 包装器将 R 代码转换为 Python,该代码最初是使用 python 中的 glmnet 包编写的。可以在此处找到原始 R 包文档:https://cran.r-project.org/web/packages/glmnet/glmnet.pdf. The Python wrapper can be found here: https://pypi.org/project/glmnet/。 R 模型最初是用参数“lambda = 0”编写的,我似乎无法使用 python 版本的代码正常工作。

原始 R 模型使用以下参数拟合,可以使用以下代码返回系数:

model <- glmnet(X, Y ,
                  family = "gaussian",
                  lambda = 0 , 
                  alpha = 1 ,
                  intercept = FALSE)
coefficients(model)

根据我对文档的理解,R 中的 lambda 参数似乎等同于 Python 包装版本中的 lambda_path 参数。基于此,我第一次尝试翻译如下:

model = ElasticNet(alpha = 1,
                       lambda_path=0,
                       fit_intercept = False)
model.fit(X,Y)
coeff = model.coef_

这返回了以下错误:object of type 'int' has no len()。 随后,我在下一次尝试中将 lambda_path 更改为 np 数组:

model = ElasticNet(alpha = 1,
                       lambda_path=np.array([0]),
                       fit_intercept = False)
model.fit(X,Y)
coeff = model.coef_

这给了我一个新的错误:ValueError: cannot select an axis to squeeze out which has size not equal to one

根据 help(ElasticNet) 中的模块文档,似乎 lambda_path 需要是一个递减顺序的数组,这与 R 中的 lambda 不同,它可以简单地是一个整数(或递减的可说的倍数)命令)。这将我带到了这里的最终解决方案:

model = ElasticNet(alpha = 1,
                       lambda_path=np.array([.01,0]),
                       fit_intercept = False)
model.fit(X,Y)
coeff = model.coef_

现在至少运行没有错误,但是,从 python 返回的系数与 R 中返回的系数有很大不同。我已经验证数据是相同的,我相信这有一些东西处理我必须如何以一种不等同于它们在 R 中使用的方式滥用 python 中的 lambda 参数的方式。如何在 R 包和 python包装器?

事实证明,python 包装器解决了提供的每个 lambda 值。可以在 mode.coef_path_ 方法中访问 lambda 路径的第二个值的系数。下面的代码将使用 lambda 路径中的指定系数覆盖模型的默认系数。

model.coef_ = model.coef_path_[:,1]

同样,如果模型通过使用 .intercept_ 和 .intercept_path_.

适合截距,也可以做同样的事情

上面的解决方案与我的代码的 R 版本的系数几乎相同,精确到小数点后 5 位。