【问题标题】:How to incorporate tidy models PCA into the workflow of a model and make predictions如何将 tidy 模型 PCA 纳入模型的工作流程并进行预测
【发布时间】:2020-10-03 18:21:04
【问题描述】:

我正在尝试将 tidy 模型 PCA 合并到模型的工作流程中。我想要一个使用 PCA 作为预处理步骤的预测模型,然后使用该模型进行预测。

我尝试了以下方法,

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_test <-vfold_cv(diamonds_train)

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())

preprocesados <- prep(diamonds_recipe)

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

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

lr_fitted_workflow <-  pca_workflow %>%  #option A workflow full dataset
  last_fit(diamonds_split)

performance <- lr_fitted_workflow %>% collect_metrics()

test_predictions <- lr_fitted_workflow %>% collect_predictions()

但我收到此错误:

x Resample1:模型(预测):错误:penalty 应该是单个数值。 ... 警告信息: “所有模型在 [fit_resamples()] 中都失败了。请参阅.notes 列。”

按照其他教程,我尝试使用这种其他方法,但我不知道如何使用该模型进行新的预测,因为新数据以原始(非 pca)形式出现。所以我尝试了这个:

pca_fit <- juice(preprocesados) %>%  #option C no work flow at all
  lm(price ~ ., data = .)

prep_test <- prep(diamonds_recipe, new_data = diamonds_test)

truths <- juice(prep_test) %>%
          select(price)

ans <- predict(pca_fit, new_data = prep_test)

tib <- tibble(row = 1:length(ans),ans, truths)

ggplot(data = tib) +
  geom_smooth(mapping = aes(x = row, y = ans, colour = "predicted")) +
  geom_smooth(mapping = aes(x = row, y = price, colour = "true")) 

它打印的东西看起来很合理,但到现在我已经失去了信心,非常感谢一些指导。 :D

【问题讨论】:

    标签: r pca prediction tidymodels


    【解决方案1】:

    问题不在于您的配方或工作流程。如chapter 7 of TidyModels with R 中所述,拟合模型的函数是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。我猜想在许多不同的方面中,这一方面不知何故被遗漏了。我已将possible issue 添加到workflows 包github 站点。答案通常很快就会出现,因此其中一位开发人员可能很快就会回复。

    至于交叉验证,假设您适合使用?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 chapter 10 & 11中都有描述

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 2022-11-11
      • 1970-01-01
      • 2017-07-16
      • 2021-07-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2017-11-22
      相关资源
      最近更新 更多