0

所以我一直在尝试使用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调试消息。我确保所有变量都是数字的dfdf_slice但仍然不确定发生了什么。如果我要进行训练测试拆分,我只想获得预测/拟合值以及“未来”值。为什么这不起作用?

4

1 回答 1

2

您正在使用 a glmnet,并且penalty您正在调整的是 L2 规范,也称为lambdaglmnet,请参阅帮助页面

如果设置penalty = varying(),则表示您正在跨一系列 L2 范数运行 glmnet,并且当您调用 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,然后通过它来重新拟合模型:

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)
于 2021-06-18T08:49:03.830 回答