Lamda=0的Python Glmnet包装错误

2024-09-27 21:33:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python glmnet包装器将R代码翻译成python,该代码最初是用python中的glmnet包编写的。原始的R包文档可以在这里找到:https://cran.r-project.org/web/packages/glmnet/glmnet.pdf。Python包装可以在这里找到: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_路径更改为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中返回的系数明显不同。我已经验证了数据是相同的,我相信这与我在python中误用lambda参数的方式不等同于在R中使用的方式有关。我如何正确地转换lambda=R包和python包装器之间的0参数


Tags: pathlambda代码文档alphafalse参数model
1条回答
网友
1楼 · 发布于 2024-09-27 21:33:44

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

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

类似地,如果模型通过使用.intercept_uu和.intercept_upath_u与截距相匹配,则可以执行相同的操作

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

相关问题 更多 >

    热门问题