我正在尝试在glmnet中使用exact = TRUE功能。但我收到一条错误消息。
> fit = glmnet(as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty)
> coef.exact = coef(fit, s = 0.03, exact = TRUE)
Error: used coef.glmnet() or predict.glmnet() with `exact=TRUE` so must in addition supply original argument(s) x and y and penalty.factor in order to safely rerun glmnet
如何向coef.exact提供penalty.factor?
尝试了选项: -
> coef.exact = coef(as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty, s = 0.03, exact = TRUE)
Error: $ operator is invalid for atomic vectors
>
> coef.exact = coef((as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty), s = 0.03, exact = TRUE)
Error: unexpected ',' in "coef.exact = coef((as.matrix(((x_values))),"
>
> coef.exact = coef((as.matrix(((x_values))) (as.matrix(y_values)) penalty=variable.list$penalty), s = 0.03, exact = TRUE)
Error: unexpected symbol in "coef.exact = coef((as.matrix(((x_values))) (as.matrix(y_values)) penalty"
>
> coef.exact = coef(fit(as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty), s = 0.03, exact = TRUE)
Error in fit(as.matrix(((x_values))), (as.matrix(y_values)), penalty = variable.list$penalty) :
could not find function "fit"
>
> coef.exact = coef(glmnet(as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty), s = 0.03, exact = TRUE)
Error: used coef.glmnet() or predict.glmnet() with `exact=TRUE` so must in addition supply original argument(s) x and y and penalty.factor in order to safely rerun glmnet
>
答案 0 :(得分:1)
以下是使用mtcars
作为示例数据的示例。请注意,在SO上发布时,始终建议提供包含样本数据的minimal & reproducible code example。
# Fit mpg ~ wt + disp
x <- as.matrix(mtcars[c("wt", "disp")]);
y <- mtcars[, "mpg"];
fit <- glmnet(x, y, penalty = 0.1);
# s is our regularisation parameter, and since we want exact results
# for s=0.035, we need to refit the model using the full data (x,y)
coef.exact <- coef(fit, s = 0.035, exact = TRUE, x = x, y = y, penalty.factor = 0.1);
coef.exact;
#3 x 1 sparse Matrix of class "dgCMatrix"
# 1
#(Intercept) 34.40289989
#wt -3.00225110
#disp -0.02016836
您明确需要再次提供x
和y
的原因在?coef.glmnet
中提供(另请参阅@FelipeAlvarenga帖子)。
因此,在您的情况下,以下内容应该有效:
fit = glmnet(x = as.matrix(x_values), y = y_values, penalty=variable.list$penalty)
coef.exact = coef(
fit,
s = 0.03,
exact = TRUE,
x = as.matrix(x_values),
y = y_values,
penalty.factor = variable.list$penalty)
也许混淆源于模型的整体规则参数(s
或lambda)与penalty.factor
之间的差异,您可以应用于每个系数。后者允许各个参数的差分正则化,而s
控制整体L1 / L2正则化的影响。
答案 1 :(得分:0)
在coef
中,参数s
对应于惩罚参数。在帮助文件中:
预测所依据的惩罚参数lambda的值 需要。默认值是用于创建模型的整个序列。
[...]
如果exact = TRUE,则会合并(并排序)这些不同的s值 使用对象$ lambda,模型在预测之前重新编译 制作。在这种情况下,需要提供原始数据x =和 y =作为predict()或coef()的附加命名参数。主力 predict.glmnet()需要更新模型,因此需要使用的数据 创造它。权重,偏移,惩罚也是如此。 lower.limits,upper.limits如果在原始调用中使用它们。 如果不这样做将导致错误。
因此,要使用exact = T
,您必须指定原始惩罚,x,y和您在原始模型中输入的任何其他参数