我读了介绍tidymodels,我感到困惑的是什么prep(), bake(),并juice()从食谱包做数据。各自做什么?老实说,我发现为函数命名这样的名称令人困惑,对于烹饪类比中的每个函数,有什么更直观的名称?
在设计了基于Tidymodels配方的工作流程(经过调整然后适合一些训练数据)后,我不清楚应该将哪些对象(适合的“工作流程”、“配方”等)保存到磁盘以用于预测新的生产中的数据。我知道我可以使用saveRDS()/ readRDS()、write_rds()/read_rds()或其他选项来实际保存/加载这些对象,但是哪些?
在干净的 R 环境中,我将收到新的原始数据,这些数据需要使用我在训练模型时使用的“配方”进行预处理。然后我想在预处理后根据该数据进行预测。如果我打算像处理训练数据一样使用prep()和bake()函数来预处理新数据,那么我将至少需要配方和原始训练数据,它似乎可以发挥prep()作用。另外,我还需要拟合模型/工作流程来进行预测。看起来是三个物体。如果我将 SESSION 1 中的工作流对象保存到磁盘,那么我可以分别使用pull_workflow_prepped_recipe()和来从 SESSION 2 中提取配方和模型pull_workflow_fit()。但prep()似乎需要原始训练数据,我可以将其保留在工作流程中,并提前使用retain = TRUE...,但在调用 后,它会从工作流程中删除fit()。听到我的呼救声吧!:)
因此,想象两个不同的 R 会话,第一个会话是我进行所有训练和模型构建,第二个会话是一些正在运行的生产应用程序,它使用从第一个会话中学到的知识。我需要 SESSION1 底部箭头以及 SESSION 2 中多个位置的帮助。我使用 Tidymodels入门作为此示例的基础。
第一节
library(tidymodels)
library(nycflights13)
library(readr)
set.seed(123)
flight_data <-
head(flights, 500) %>%
mutate(
arr_delay = ifelse(arr_delay >= 30, "late", "on_time"),
arr_delay = factor(arr_delay),
date = as.Date(time_hour)
) %>% …Run Code Online (Sandbox Code Playgroud) 我为 TidyTuesday 上的最新咖啡数据集整理了一个数据预处理方法。我的目的是生成一个工作流,然后从那里调整一个超参数。我对通过各种update_role()函数手动声明预测变量和结果特别感兴趣,而不是使用公式,因为我对这种类型的变量选择有一些很好的计划(这是一个非常好的主意!)。
下面的示例生成了一个与prep和一起工作的配方bake(coffee_test)。如果我取消选择结果列,它甚至可以工作,例如。coffee_recipe %>% bake(select(coffee_test, -cupper_points)). 但是,当我运行工作流程时tune_grid,出现如图所示的错误。看起来tune_grid找不到没有“预测者”角色的变量,即使bake做得很好。
现在,如果我改为使用公式和step_rm我不关心的变量以正常方式做事,那么事情大多会奏效——我会收到一些缺少country_of_origin值的行的警告,我觉得这很奇怪,因为我应该进行估算那些。我完全有可能误解了角色的目的以及如何使用它们。
library(tidyverse)
library(tidymodels)
#> ?? Attaching packages ????????????????????????????????????????????????????? tidymodels 0.1.1 ??
#> ? broom 0.7.0 ? recipes 0.1.13
#> ? dials 0.0.8 ? rsample 0.0.7
#> ? infer 0.5.3 ? tune 0.1.1
#> ? modeldata 0.0.2 ? workflows 0.1.2
#> ? parsnip 0.1.2 ? yardstick 0.0.7
#> ?? Conflicts ???????????????????????????????????????????????????????? tidymodels_conflicts() ??
#> x …Run Code Online (Sandbox Code Playgroud) 我尝试使用 tidymodels 通过配方和模型参数来调整工作流程。调整单个工作流程时没有问题。但是,当调整具有多个工作流程的工作流程集时,它总是会失败。这是我的代码:
\n# read the training data\ntrain <- read_csv("../../train.csv")\ntrain <- train %>% \n mutate(\n id = row_number(),\n across(where(is.double), as.integer),\n across(where(is.character), as.factor),\n r_yn = fct_relevel(r_yn, "yes")) %>% \n select(id, r_yn, everything())\n\n# setting the recipes\n\n# no precess\nrec_no <- recipe(r_yn ~ ., data = train) %>%\n update_role(id, new_role = "ID")\n\n# downsample: tuning the under_ratio\nrec_ds_tune <- rec_no %>% \n step_downsample(r_yn, under_ratio = tune(), skip = TRUE, seed = 100) %>%\n step_nzv(all_predictors(), freq_cut = 100)\n\n# setting the models\n\n# randomforest\nspec_rf_tune <- rand_forest(trees = 100, …Run Code Online (Sandbox Code Playgroud) recipes作为机器学习管道的一部分,我一直在探索变量转换的新包.我选择了这种方法 - 由于所有新的扩展而从使用caret的preProcess功能升级.但我发现这些包为转换后的数据提供了截然不同的结果:
library(caret) # V6.0-79
library(recipes) # V0.1.2
library(MASS) # V7.3-47
# transform variables using recipes
rec_box <- recipe(~ ., data = as.data.frame(state.x77)) %>%
step_BoxCox(., everything()) %>%
prep(., training = as.data.frame(state.x77)) %>%
bake(., as.data.frame(state.x77))
> head(rec_box)
# A tibble: 6 x 8
Population Income Illiteracy `Life Exp` Murder `HS Grad` Frost Area
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 8.19 138. 0.647 60171653. 6.89 651. 20. 56.0
2 5.90 185. 0.376 61218586. …Run Code Online (Sandbox Code Playgroud) 为了构建堆叠模型,我在同一数据集上使用不同的预处理训练了许多基础模型。为了跟踪构建设计矩阵的方式,我使用了 recipes 包并定义了我自己的步骤。但是,使用带有自定义步骤的配方进入插入符号训练模型比应用相同的预处理并使用手工设计矩阵训练插入符号模型慢 20 倍。知道为什么以及如何改进吗?
我在下面提供了一个可重现的示例:
# Loading libraries
packs <- c("tidyverse", "caret", "e1071", "wavelets", "recipes")
InstIfNec<-function (pack) {
if (!do.call(require,as.list(pack))) {
do.call(install.packages,as.list(pack)) }
do.call(require,as.list(pack)) }
lapply(packs, InstIfNec)
# Getting data
data(biomass)
biomass <- select(biomass,-dataset,-sample)
# Defining custom pretreatment algorithm
HaarTransform <- function(DF1) {
w <- function(k) {
s1 = dwt(k, filter = "haar")
return (s1@V[[1]])
}
Smt = as.matrix(DF1)
Smt = t(base::apply(Smt, 1, w))
return (data.frame(Smt))
}
# Creating the custom step function
step_Haar_new <- function(terms, role, trained, skip, …Run Code Online (Sandbox Code Playgroud) 我想使用recipes包创建一个配方,该包既可以估算缺失的数据,又可以添加指示哪些值缺失的指标列。如果有一个选项可以选择为原始数据框中的每一列包含一个指标列,或者只包含原始数据框中缺少数据的列的指标列,那也很好。我知道我可以使用recipes轻松估算缺失值,但是是否有内置方法来添加缺失的指标列?
例如,如果我有一个这样的数据框:
> data.frame(x = c(1, NA, 3), y = 4:6)
x y
1 1 4
2 NA 5
3 3 6
Run Code Online (Sandbox Code Playgroud)
我希望插补和添加缺失的指标列后的输出看起来像这样:
x y x_missing
1 1 4 FALSE
2 2 5 TRUE
3 3 6 FALSE
Run Code Online (Sandbox Code Playgroud)
当然,对于这样的简单示例,我可以手动完成。但是在机器学习管道中处理大型数据集时,有一种自动化的方式来做到这一点会很有帮助。
根据 docs for recipes::check_missing,有一个columns论点,
列将(最终)由terms 参数填充的变量名称字符串。
但我不确定这意味着什么,因为没有terms论据check_missing.
作为参考,我正在寻找的功能由MissingIndicator类在scikit-learn 中实现。
我总是完成我的模型来拟合和预测,而不使用prep()、bake()或juice():
rec_wflow <-
workflow() %>%
add_model(lr_mod) %>%
add_recipe(rec)
data_fit <-
rec_wflow %>%
fit(data = train_data)
Run Code Online (Sandbox Code Playgroud)
这些 ( prep, bake, juice) 函数是否仅用于直观地检查数据的预处理结果,而不是拟合/训练过程所必需的?
R包“recipes”中的prep/bake/juice有什么区别?
上面的代码是我在官方教程中学习的。
我在另一篇博客中读到,如果使用train_data,就会产生数据泄漏。我想听听更多相关信息;这些功能是否与数据泄露有关?
我想评估同一数据集上多个(主要是)线性回归模型的性能。我想也许使用tidymodels包和workflowsets::workflow_set()可能会起作用。我按照此处的示例进行操作,但我无法弄清楚如何从代码中实际获得拟合结果。
# Load packages
library("tidyverse")
library('workflowsets')
library("parsnip")
library("recipes")
# Data
dat <-
structure(list(q = c(66.65, 75.58, 83.06, 91.28, 119.26, 133.14,
146.32, 153.39, 168.57, 182.36, 210.09, 188.19, 213.42, 296.95,
326.33, 358.63, 475.99, 475.99, 683.44, 683.44, 838.49, 1282.1,
1648.97, 1572.97, 2055.14, 2521.39, 2685.11, 2859.46, 3242.87,
6899.19, 6377.42, 7581.96, 9599.32), c = c(317.06, 283.99, 279.56,
283.99, 227.84, 227.84, 262.5, 242.64, 270.9, 266.67, 210.6,
235.12, 235.12, 210.6, 207.31, 227.84, 220.78, 194.67, 177.13,
207.31, 179.94, 177.13, 182.79, 139.89, 148.98, …Run Code Online (Sandbox Code Playgroud) 这与使用 step_naomit 进行预测并使用 tidymodels 保留 ID是相同的问题,但即使有一个可接受的答案,OP 的最后一条评论指出了“id 变量”被用作预测器的问题,正如在查看时所看到的model$fit$variable.importance.
我有一个我想保留的带有“id 变量”的数据集。我以为我可以通过 recipe() 规范来实现这一点。
library(tidymodels)
# label is an identifier variable I want to keep even though it's not
# a predictor
df <- tibble(label = 1:50,
x = rnorm(50, 0, 5),
f = factor(sample(c('a', 'b', 'c'), 50, replace = TRUE)),
y = factor(sample(c('Y', 'N'), 50, replace = TRUE)) )
df_split <- initial_split(df, prop = 0.70)
# Make up any recipe: just note I specify 'label' as "id …Run Code Online (Sandbox Code Playgroud) 转换回由配方转换的列outcome(在本例中为)的最优雅的方法是什么?mpg该解决方案可以是通用的(如果存在或仅适用于log和normalize步骤(如下编码)。
可能有用的链接:此处
讨论了一般解决方案,但我认为它尚未实施。这里提供了
R 函数的解决方案,但我不确定在这种情况下是否可以提供帮助。scale
library(recipes)
data <- tibble(mtcars) %>%
select(cyl, mpg)
rec <- recipe(mpg ~ ., data = data) %>%
step_log(all_numeric()) %>%
step_normalize(all_numeric()) %>%
prep()
data_baked <- bake(rec, new_data = data)
# model fitting, predictions, etc...
# how to invert/transform back predictions (estimates) and true outcomes
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Tidymodels 预测 R 中的房地产价格。我正在关注本教程。一切都很顺利,直到我尝试对测试数据进行预测时。
\n请参阅下面的代码示例和最后的错误。
\n我看了两个类似的问题(这里和这里),但似乎我已经定义了可变角色,并为我的工作流程提供了未准备好的配方。
\n\n # libraries ---------------------------------------------------------------\n library(tidymodels)\n #> \xe2\x94\x80\xe2\x94\x80 Attaching packages \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 tidymodels 0.1.2 \xe2\x94\x80\xe2\x94\x80\n #> \xe2\x9c\x93 broom 0.7.3 \xe2\x9c\x93 recipes 0.1.15\n #> \xe2\x9c\x93 dials 0.0.9 \xe2\x9c\x93 rsample 0.0.8 \n #> \xe2\x9c\x93 dplyr 1.0.3 \xe2\x9c\x93 tibble 3.0.5 \n #> \xe2\x9c\x93 ggplot2 3.3.3 \xe2\x9c\x93 tidyr 1.1.2 \n #> \xe2\x9c\x93 infer 0.5.4 \xe2\x9c\x93 tune 0.1.2 \n #> \xe2\x9c\x93 modeldata 0.1.0 \xe2\x9c\x93 workflows 0.2.1 \n #> \xe2\x9c\x93 parsnip 0.1.5 \xe2\x9c\x93 …Run Code Online (Sandbox Code Playgroud)