简单的 glmnet 模型,predict() 结果 'Error in lambda[1] - s : non-numeric argument to binary operator'
Simple glmnet model, predict() results in 'Error in lambda[1] - s : non-numeric argument to binary operator'
所以我一直在尝试将 predict()
与各种形式的数据帧格式一起使用,但它们似乎不起作用。我试过 1) 排除因变量,2) 包括带有切片数据的因变量,3) 包括带有 NA 值的因变量,以及许多其他事情。
R 4.1.0
R Studio 1.4.1717
下面的代码演示了3).
library(tidyverse)
library(lubridate)
library(tidymodels)
df <- data.frame(y = sample(5000000:120000000, 100, replace = TRUE),
yearr = sample(2015:2021, 100, replace = TRUE),
monthh = sample(1:12, 100, replace = TRUE),
dayy = sample(1:31, 100, replace = TRUE))
rm(df_slice)
df_slice = df |>
slice(1:50) |>
select(yearr, monthh, dayy) |>
mutate(y = NA)
m = linear_reg(mode = 'regression', penalty = varying(), mixture = 0.6) |>
set_engine("glmnet") |>
fit(y ~ ., data = df)
predict(m, df_slice)
predict.model_fit(m, df_slice)
predict_raw(m, df_slice)
最后三行代码抛出 Error in lambda[1] - s : non-numeric argument to binary operator
调试消息。我确保 df
和 df_slice
中的所有变量都是数字,但仍然不确定发生了什么。我只想获得 predicted/fitted 值,以及 'future' 值(如果我要进行训练测试拆分)。为什么这不起作用?
您正在使用 glmnet
,您正在调整的 penalty
是 L2 范数,在 glmnet 中也称为 lambda
,请参阅 the help page
如果你设置了penalty = varying()
,你就是运行glmnet跨越了一系列的L2范数,调用predict的时候需要提供一个lambda值来进行预测。所以现在用你的例子,你不应该使用 penalty = varying()
而是提供 lambda
的值:
library(tidyverse)
library(lubridate)
library(tidymodels)
m = linear_reg(mode = 'regression', penalty = 1, mixture = 0.6) %>%
set_engine("glmnet") %>%
fit(y ~ ., data = df)
predict(m, df_slice)
否则需要自己调优,找到合适的lambda
,然后传这个去refit模型:
my_cv = vfold_cv(df)
rec = recipe(y ~. ,data=df) %>% prep(training = df,retain=TRUE)
fit = linear_reg(mode = 'regression', penalty = tune(), mixture = 0.6) %>%
set_engine("glmnet")
wflow = workflow() %>%
add_recipe(rec) %>%
add_model(fit)
res = wflow %>% tune_grid(my_cv)
best_params = res %>% select_best(metric = "rmse")
m = wflow %>%
finalize_workflow(best_params) %>%
fit(data = df)
predict(m,df_slice)
所以我一直在尝试将 predict()
与各种形式的数据帧格式一起使用,但它们似乎不起作用。我试过 1) 排除因变量,2) 包括带有切片数据的因变量,3) 包括带有 NA 值的因变量,以及许多其他事情。
R 4.1.0
R Studio 1.4.1717
下面的代码演示了3).
library(tidyverse)
library(lubridate)
library(tidymodels)
df <- data.frame(y = sample(5000000:120000000, 100, replace = TRUE),
yearr = sample(2015:2021, 100, replace = TRUE),
monthh = sample(1:12, 100, replace = TRUE),
dayy = sample(1:31, 100, replace = TRUE))
rm(df_slice)
df_slice = df |>
slice(1:50) |>
select(yearr, monthh, dayy) |>
mutate(y = NA)
m = linear_reg(mode = 'regression', penalty = varying(), mixture = 0.6) |>
set_engine("glmnet") |>
fit(y ~ ., data = df)
predict(m, df_slice)
predict.model_fit(m, df_slice)
predict_raw(m, df_slice)
最后三行代码抛出 Error in lambda[1] - s : non-numeric argument to binary operator
调试消息。我确保 df
和 df_slice
中的所有变量都是数字,但仍然不确定发生了什么。我只想获得 predicted/fitted 值,以及 'future' 值(如果我要进行训练测试拆分)。为什么这不起作用?
您正在使用 glmnet
,您正在调整的 penalty
是 L2 范数,在 glmnet 中也称为 lambda
,请参阅 the help page
如果你设置了penalty = varying()
,你就是运行glmnet跨越了一系列的L2范数,调用predict的时候需要提供一个lambda值来进行预测。所以现在用你的例子,你不应该使用 penalty = varying()
而是提供 lambda
的值:
library(tidyverse)
library(lubridate)
library(tidymodels)
m = linear_reg(mode = 'regression', penalty = 1, mixture = 0.6) %>%
set_engine("glmnet") %>%
fit(y ~ ., data = df)
predict(m, df_slice)
否则需要自己调优,找到合适的lambda
,然后传这个去refit模型:
my_cv = vfold_cv(df)
rec = recipe(y ~. ,data=df) %>% prep(training = df,retain=TRUE)
fit = linear_reg(mode = 'regression', penalty = tune(), mixture = 0.6) %>%
set_engine("glmnet")
wflow = workflow() %>%
add_recipe(rec) %>%
add_model(fit)
res = wflow %>% tune_grid(my_cv)
best_params = res %>% select_best(metric = "rmse")
m = wflow %>%
finalize_workflow(best_params) %>%
fit(data = df)
predict(m,df_slice)