1
4

1 回答 1

1

问题不在您的食谱或工作流程中。正如TidyModels with R的第 7 章所述,拟合模型的功能是fit并且要使其工作,您必须提供拟合过程的数据(此处diamonds)。权衡是您不必使用prep您的配方,因为工作流程会自行处理。

所以稍微减少你的代码,下面的例子就可以了。

library(tidymodels)
data(diamonds)
diamonds <- diamonds %>%
  select(-clarity, -cut, - color)

diamonds_split <- initial_split(diamonds, prop = 4/5)

diamonds_train <- training(diamonds_split)
diamonds_test <- testing(diamonds_split)

diamonds_recipe <- 
  # La fórmula básica y todos los datos (outcome ~ predictors)
  recipe(price ~ ., data = diamonds_train) %>%
  step_log(all_outcomes(),skip = T) %>%
  step_normalize(all_predictors(), -all_nominal()) %>% 
  step_pca(all_predictors())

linear_model <- 
  linear_reg() %>%
  set_engine("glmnet") %>%
  set_mode("regression")

pca_workflow <- workflow() %>%
  add_recipe(diamonds_recipe) %>%
  add_model(linear_model)

pca_fit <- fit(pca_workflow, data = diamonds_train)

至于交叉验证,必须使用fit_resamples并且应该拆分训练集而不是测试集。但是在这里我目前遇到了同样的错误(如果我找出原因,我的答案将会更新)

编辑

现在我做了一些挖掘,交叉验证的问题源于引擎是glmnet. 我猜想在许多不同的方面中,这一方面不知何故被遗漏了。我在包 github 站点中添加了一个可能的问题。workflows通常答案很快就会出现,因此其中一位开发人员可能很快就会回复。

至于交叉验证,假设您改为使用中描述的任何其他引擎,?linear_reg那么我们可以这样做

linear_model_base <- 
  linear_reg() %>%
  set_engine("lm") %>%
  set_mode("regression")
pca_workflow <- update_model(pca_workflow, linear_model_base)
folds <- vfold_cv(diamonds_train, 10)
pca_folds_fit <- fit_resamples(pca_workflow, resamples = folds)

在感兴趣的指标的情况下,这些确实可以像您使用的那样收集collect_metrics

pca_folds_fit %>% collect_metrics()

如果我们对预测感兴趣,您必须告诉模型您要在拟合过程中保存这些预测,然后使用collect_predictions

pca_folds_fit <- fit_resamples(pca_workflow, resamples = folds, control = control_resamples(save_pred = TRUE))
collect_predictions(pca_folds_fit)

但是请注意,此输出是每个模型的预测,fold因为您实际上是在拟合 10 个模型。

通常交叉验证用于比较多个模型或调整参数(例如随机森林与线性模型)。collect_metrics然后将选择使用交叉验证性能( )的最佳模型,并使用test数据集来评估该模型的准确性。这在TMwR 第 10 章和第 11 章中都有描述

于 2020-10-03T19:07:42.623 回答