我读了介绍tidymodels,我感到困惑的是什么prep(), bake(),并juice()从食谱包做数据。各自做什么?老实说,我发现为函数命名这样的名称令人困惑,对于烹饪类比中的每个函数,有什么更直观的名称?
这个问题指的是在 R 中使用 tidymodels 获取 catboost 模型的摘要形状图。鉴于问题下方的评论,OP 找到了解决方案,但到目前为止尚未与社区分享。
我想分析我的带有tidymodelsSHAP 值图的软件包的树整体,例如单个观测值的图,例如
并总结我的数据集所有特征的影响,例如
DALEXtra 提供为 tidymodels 创建 SHAP 值的函数explain.tidymodels()。 force_plot该fastshap包为底层 python 包的绘图函数提供了一个包装器SHAP。但我无法理解如何使该函数与函数的输出一起工作explain.tidymodels()。
问题:如何在 R 中使用tidymodels和生成这样的 SHAP 图explain.tidymodels?
MWE(对于带有 的 SHAP 值explain.tidymodels)
library(MASS)
library(tidyverse)
library(tidymodels)
library(parsnip)
library(treesnip)
library(catboost)
library(fastshap)
library(DALEXtra)
set.seed(1337)
rec <- recipe(crim ~ ., data = Boston)
split <- initial_split(Boston)
train_data <- training(split)
test_data <- testing(split) %>% dplyr::select(-crim) %>% as.matrix()
model_default<-
parsnip::boost_tree( …Run Code Online (Sandbox Code Playgroud) 这个问题的答案清楚地解释了在通过 dplyr 管道运行回归时如何按组检索整洁的回归结果,但该解决方案不再可重现。
如何组合使用 dplyr 和 broom 来按组运行回归并使用 R 4.02、dplyr 1.0.0 和 broom 0.7.0 检索整洁的结果?
具体来说,上面链接的问题的示例答案,
library(dplyr)
library(broom)
df.h = data.frame(
hour = factor(rep(1:24, each = 21)),
price = runif(504, min = -10, max = 125),
wind = runif(504, min = 0, max = 2500),
temp = runif(504, min = - 10, max = 25)
)
dfHour = df.h %>% group_by(hour) %>%
do(fitHour = lm(price ~ wind + temp, data = .))
# get the coefficients by group in …Run Code Online (Sandbox Code Playgroud) 在设计了基于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) 我正在尝试将 tidymodels 采用到我的流程中,但我在保存工作流程方面遇到了挑战。工作流对象的文件大小比用于构建模型的数据大很多倍,因此在尝试将工作流应用于新数据时,我最终耗尽了内存。我无法判断这是否是正确的结果或者我是否遗漏了某些内容。
为了对新数据进行预测,我们是否只需要配方步骤、模型系数以及可能来自训练集的一些汇总数据(例如用于缩放目的的训练数据的标准差和平均值)?那么为什么工作流对象这么大呢?
这是使用数据集的简单示例iris。我尝试按照Julia 的示例进行操作,但工作流程最终仍然比数据本身大 24 倍。我知道 tidymodels 发展很快,所以也许现在有更好的方法?任何建议表示赞赏!
library(tidyverse)
library(tidymodels)
library(lobstr)
library(butcher)
set.seed(8675309)
#Create an indicator for whether the species is Setosa
df <- iris %>%
mutate(is_setosa = factor(Species == "setosa"))
#Split into train/test
df_split <- initial_split(df, prop = 0.80)
df_train <- training(df_split)
df_test <- testing(df_split)
#Create the workflow object
my_workflow <- workflow() %>%
#use a logistic regression model using glm
add_model({
logistic_reg() %>%
set_engine("glm")
}) %>%
#Add the recipe
add_recipe({
recipe(is_setosa ~ Sepal.Length …Run Code Online (Sandbox Code Playgroud) The dataset can be found here: https://www.kaggle.com/mlg-ulb/creditcardfraud
I am trying to use tidymodels to run ranger with 5 fold cross validation on this dataset.
I have have 2 code blocks. The first code block is the original code with the full data. The second code block is almost identical to the first code block, except I have subset a portion of the data so the code runs faster. The second block of code is just to make sure my code …
我为 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创建随机福雷斯特预测。我的测试数据包含训练数据中不存在的新因子级别,这会导致错误:
1: Novel levels found in column 'Siblings': '4'. The levels have been removed, and values have been coerced to 'NA'.
2: There are new levels in a factor: NA
> test_predict
Fehler: Objekt 'test_predict' nicht gefunden
Run Code Online (Sandbox Code Playgroud)
我尝试在“兄弟姐妹”列中包含“step_novel和” step_dummy,但这并不能解决错误。我应该如何处理训练数据中不存在的新因素?
library(tidyverse)
library(tidymodels)
data <-
data.frame(
Survived = as.factor(c(0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0)),
Siblings = as.factor(c(1,1,0,1,0,0,0,3,1,1,0,1,0,0,0,3)),
Class = as.factor(c(0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,0)),
Embarked = as.factor(c("s","c","m","m","s","c","s","m","m","s","s","s","s","s","s","s"))
)
test <-
data.frame(
Siblings = as.factor(c(1,1,0,1,0,0,0,3,1,1,0,1,0,0,0,4)), #New factor level
Class = as.factor(c(0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,0)),
Embarked = as.factor(c("s","c","m","m","s","c","s","m","m","s","s","s","s","s","s","s"))
)
#Model
rf_model …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) 我有一个如下所示的大型数据集。我想知道是否有一种聪明的方法可以在每一行(又名基因)中应用 t 检验,并比较人类和小鼠之间的计数。
我想在每一行 ( human_A, human_B, human_C) 与 (mouse_A, mouse_B) 进行比赛
human_A = rnorm(20, 10, 1)
human_B <- rnorm(20, 10, 2)
human_C <- rnorm(20, 20, 3)
mouse_A = rnorm(20, 5, 1)
mouse_B <- rnorm(20, 10, 2)
genes <- paste0("gene_",rep(1:20))
df <- data.frame(genes,human_A,human_B,human_C,mouse_A,mouse_B)
head(df)
#> genes human_A human_B human_C mouse_A mouse_B
#> 1 gene_1 8.482934 10.396456 21.88825 6.070031 6.136563
#> 2 gene_2 9.836256 13.170547 23.04314 4.247680 11.781652
#> 3 gene_3 9.280803 11.184282 19.64985 6.010297 6.430591
#> 4 gene_4 9.069052 8.884374 …Run Code Online (Sandbox Code Playgroud)