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 位。
我正在使用 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 位。