tidymodels:具有交叉验证的游侠
tidymodels: ranger with cross validation
数据集可以在这里找到:
https://www.kaggle.com/mlg-ulb/creditcardfraud
我正在尝试使用 tidymodels 运行 运行ger 在此数据集上进行 5 折交叉验证。
我有 2 个代码块。第一个代码块是带有完整数据的原始代码。第二个代码块几乎与第一个代码块相同,除了我有一部分数据的子集,所以代码 运行s 更快。第二个代码块只是为了确保我的代码在我 运行 它在原始数据集上之前有效。
这是包含完整数据的第一个代码块:
#load packages
library(tidyverse)
library(tidymodels)
library(tune)
library(workflows)
#load data
df <- read.csv("~creditcard.csv")
#check for NAs and convert Class to factor
anyNA(df)
df$Class <- as.factor(df$Class)
#set seed and split data into training and testing
set.seed(123)
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)
#in the training and testing datasets, how many are fraudulent transactions?
df_train %>% count(Class)
df_test %>% count(Class)
#ranger model with 5-fold cross validation
rf_spec <-
rand_forest() %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
all_wf <-
workflow() %>%
add_formula(Class ~ .) %>%
add_model(rf_spec)
cv_folds <- vfold_cv(df_train, v = 5)
cv_folds
rf_results <-
all_wf %>%
fit_resamples(resamples = cv_folds)
rf_results %>%
collect_metrics()
这是第二个1000行的代码块:
#load packages
library(tidyverse)
library(tidymodels)
library(tune)
library(workflows)
#load data
df <- read.csv("~creditcard.csv")
###################################################################################
#Testing area#
df <- df %>% arrange(-Class) %>% head(1000)
###################################################################################
#check for NAs and convert Class to factor
anyNA(df)
df$Class <- as.factor(df$Class)
#set seed and split data into training and testing
set.seed(123)
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)
#in the training and testing datasets, how many are fraudulent transactions?
df_train %>% count(Class)
df_test %>% count(Class)
#ranger model with 5-fold cross validation
rf_spec <-
rand_forest() %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
all_wf <-
workflow() %>%
add_formula(Class ~ .) %>%
add_model(rf_spec)
cv_folds <- vfold_cv(df_train, v = 5)
cv_folds
rf_results <-
all_wf %>%
fit_resamples(resamples = cv_folds)
rf_results %>%
collect_metrics()
1.) 使用第一个代码块,我可以在控制台中分配和打印 cv 折叠。全球环境数据显示 cv_folds 有 5 个 obs。 2 个变量。当我查看 (cv_folds) 时,我有标记为 splits 和 id 的列,但没有行也没有数据。当我使用 str(cv_folds) 时,我得到 R 是 "thinking" 的空白加载行,但没有我可以按下的红色停止图标。我唯一能做的就是强制退出 RStudio。也许我只需要等待更长的时间?我不知道。当我对较小的第二个代码块执行相同操作时,str() 工作正常。
2) 这个项目的总体目标是将数据集拆分为训练集和测试集。然后使用 5 折交叉验证对训练数据进行划分,并在其上训练 运行ger 模型。接下来,我想检查我的模型在训练数据上的指标。然后我想在测试集上测试我的模型并查看指标。最终,我想将 运行ger 换成 xgboost 之类的东西。请就我可以 add/modify 改进代码的哪些部分给我建议。我仍然缺少在测试集上测试我的模型的部分。
I think the Predictions portion of this article might be what I'm aiming for.
https://rviews.rstudio.com/2019/06/19/a-gentle-intro-to-tidymodels/
3) 当我使用rf_results %>% collect_metrics()时,它只显示准确性和roc_auc。我如何获得灵敏度、特异性、精确度和召回率?
4) 如何绘制重要性?我会用这样的东西吗?
rf_fit <- get_tree_fit(all_wf)
vip::vip(rf_fit, geom = "point")
5) 如何大幅减少模型的训练时间?上次我 运行 运行ger 在这个数据集上使用插入符进行 5 折交叉验证,花了 8 个多小时(6 核,4.0 ghz,16gb RAM,SSD,gtx 1060)。我对任何事情都持开放态度(即重组代码、AWS 计算、并行化等)
编辑:这是我尝试设置的另一种方式
#ranger model with 5-fold cross validation
rf_recipe <- recipe(Class ~ ., data = df_train)
rf_engine <-
rand_forest(mtry = tune(), trees = tune(), min_n = tune()) %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
rf_grid <- grid_random(
mtry() %>% range_set(c(1, 20)),
trees() %>% range_set(c(500, 1000)),
min_n() %>% range_set(c(2, 10)),
size = 30)
all_wf <-
workflow() %>%
add_recipe(rf_recipe) %>%
add_model(rf_engine)
cv_folds <- vfold_cv(df_train, v = 5)
cv_folds
#####
rf_fit <- tune_grid(
all_wf,
resamples = cv_folds,
grid = rf_grid,
metrics = metric_set(roc_auc),
control = control_grid(save_pred = TRUE)
)
collect_metrics(rf_fit)
rf_fit_best <- select_best(rf_fit)
(wf_rf_best <- finalize_workflow(all_wf, rf_fit_best))
我从您的最后一段代码开始,并进行了一些编辑以实现功能性工作流程。我沿着代码回答了你的问题。我冒昧地给你一些建议并重新格式化你的代码。
## Packages, seed and data
library(tidyverse)
library(tidymodels)
set.seed(123)
df <- read_csv("creditcard.csv")
df <-
df %>%
arrange(-Class) %>%
head(1000) %>%
mutate(Class = as_factor(Class))
## Modelisation
# Initial split
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)
你可以看到 df_split
returns <750/250/1000>
(见下文)。
2) 要调整 xgboost 模型,您几乎不需要更改。
# Models
model_rf <-
rand_forest(mtry = tune(), trees = tune(), min_n = tune()) %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
model_xgboost <-
boost_tree(mtry = tune(), trees = tune(), min_n = tune()) %>%
set_engine("xgboost", importance = "impurity") %>%
set_mode("classification")
在这里选择你的超参数网格。我建议您使用非随机网格以最佳方式访问超参数的 space。
# Grid of hyperparameters
grid_rf <-
grid_max_entropy(
mtry(range = c(1, 20)),
trees(range = c(500, 1000)),
min_n(range = c(2, 10)),
size = 30)
如您所见,这些是您的工作流程,几乎没有什么可以改变的。
# Workflow
wkfl_rf <-
workflow() %>%
add_formula(Class ~ .) %>%
add_model(model_rf)
wkfl_wgboost <-
workflow() %>%
add_formula(Class ~ .) %>%
add_model(model_xgboost)
1) <600/150/750>
表示您的训练集中有 600 个观察值,验证集中有 150 个观察值,原始数据集中共有 750 个观察值。请注意,在这里,600 + 150 = 750 但情况并非总是如此(例如,使用带有重采样的 boostrap 方法)。
# Cross validation method
cv_folds <- vfold_cv(df_train, v = 5)
cv_folds
3) 在这里,您可以使用 yardstik 包选择要在调整期间收集的指标。
# Choose metrics
my_metrics <- metric_set(roc_auc, accuracy, sens, spec, precision, recall)
然后就可以根据网格计算出不同的模型了。对于控制参数,不要保存预测和打印进度(恕我直言)。
# Tuning
rf_fit <- tune_grid(
wkfl_rf,
resamples = cv_folds,
grid = grid_rf,
metrics = my_metrics,
control = control_grid(verbose = TRUE) # don't save prediction (imho)
)
这些是处理 rf_fit
对象的一些有用函数。
# Inspect tuning
rf_fit
collect_metrics(rf_fit)
autoplot(rf_fit, metric = "accuracy")
show_best(rf_fit, metric = "accuracy", maximize = TRUE)
select_best(rf_fit, metric = "accuracy", maximize = TRUE)
最后,您可以根据最佳参数拟合您的模型。
# Fit best model
tuned_model <-
wkfl_rf %>%
finalize_workflow(select_best(rf_fit, metric = "accuracy", maximize = TRUE)) %>%
fit(data = df_train)
predict(tuned_model, df_train)
predict(tuned_model, df_test)
4) 不幸的是,处理 randomForest
对象的方法通常不适用于 parnsnip
输出
5)你可以看看vignette关于并行化的
数据集可以在这里找到: https://www.kaggle.com/mlg-ulb/creditcardfraud
我正在尝试使用 tidymodels 运行 运行ger 在此数据集上进行 5 折交叉验证。
我有 2 个代码块。第一个代码块是带有完整数据的原始代码。第二个代码块几乎与第一个代码块相同,除了我有一部分数据的子集,所以代码 运行s 更快。第二个代码块只是为了确保我的代码在我 运行 它在原始数据集上之前有效。
这是包含完整数据的第一个代码块:
#load packages
library(tidyverse)
library(tidymodels)
library(tune)
library(workflows)
#load data
df <- read.csv("~creditcard.csv")
#check for NAs and convert Class to factor
anyNA(df)
df$Class <- as.factor(df$Class)
#set seed and split data into training and testing
set.seed(123)
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)
#in the training and testing datasets, how many are fraudulent transactions?
df_train %>% count(Class)
df_test %>% count(Class)
#ranger model with 5-fold cross validation
rf_spec <-
rand_forest() %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
all_wf <-
workflow() %>%
add_formula(Class ~ .) %>%
add_model(rf_spec)
cv_folds <- vfold_cv(df_train, v = 5)
cv_folds
rf_results <-
all_wf %>%
fit_resamples(resamples = cv_folds)
rf_results %>%
collect_metrics()
这是第二个1000行的代码块:
#load packages
library(tidyverse)
library(tidymodels)
library(tune)
library(workflows)
#load data
df <- read.csv("~creditcard.csv")
###################################################################################
#Testing area#
df <- df %>% arrange(-Class) %>% head(1000)
###################################################################################
#check for NAs and convert Class to factor
anyNA(df)
df$Class <- as.factor(df$Class)
#set seed and split data into training and testing
set.seed(123)
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)
#in the training and testing datasets, how many are fraudulent transactions?
df_train %>% count(Class)
df_test %>% count(Class)
#ranger model with 5-fold cross validation
rf_spec <-
rand_forest() %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
all_wf <-
workflow() %>%
add_formula(Class ~ .) %>%
add_model(rf_spec)
cv_folds <- vfold_cv(df_train, v = 5)
cv_folds
rf_results <-
all_wf %>%
fit_resamples(resamples = cv_folds)
rf_results %>%
collect_metrics()
1.) 使用第一个代码块,我可以在控制台中分配和打印 cv 折叠。全球环境数据显示 cv_folds 有 5 个 obs。 2 个变量。当我查看 (cv_folds) 时,我有标记为 splits 和 id 的列,但没有行也没有数据。当我使用 str(cv_folds) 时,我得到 R 是 "thinking" 的空白加载行,但没有我可以按下的红色停止图标。我唯一能做的就是强制退出 RStudio。也许我只需要等待更长的时间?我不知道。当我对较小的第二个代码块执行相同操作时,str() 工作正常。
2) 这个项目的总体目标是将数据集拆分为训练集和测试集。然后使用 5 折交叉验证对训练数据进行划分,并在其上训练 运行ger 模型。接下来,我想检查我的模型在训练数据上的指标。然后我想在测试集上测试我的模型并查看指标。最终,我想将 运行ger 换成 xgboost 之类的东西。请就我可以 add/modify 改进代码的哪些部分给我建议。我仍然缺少在测试集上测试我的模型的部分。
I think the Predictions portion of this article might be what I'm aiming for.
https://rviews.rstudio.com/2019/06/19/a-gentle-intro-to-tidymodels/
3) 当我使用rf_results %>% collect_metrics()时,它只显示准确性和roc_auc。我如何获得灵敏度、特异性、精确度和召回率?
4) 如何绘制重要性?我会用这样的东西吗?
rf_fit <- get_tree_fit(all_wf)
vip::vip(rf_fit, geom = "point")
5) 如何大幅减少模型的训练时间?上次我 运行 运行ger 在这个数据集上使用插入符进行 5 折交叉验证,花了 8 个多小时(6 核,4.0 ghz,16gb RAM,SSD,gtx 1060)。我对任何事情都持开放态度(即重组代码、AWS 计算、并行化等)
编辑:这是我尝试设置的另一种方式
#ranger model with 5-fold cross validation
rf_recipe <- recipe(Class ~ ., data = df_train)
rf_engine <-
rand_forest(mtry = tune(), trees = tune(), min_n = tune()) %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
rf_grid <- grid_random(
mtry() %>% range_set(c(1, 20)),
trees() %>% range_set(c(500, 1000)),
min_n() %>% range_set(c(2, 10)),
size = 30)
all_wf <-
workflow() %>%
add_recipe(rf_recipe) %>%
add_model(rf_engine)
cv_folds <- vfold_cv(df_train, v = 5)
cv_folds
#####
rf_fit <- tune_grid(
all_wf,
resamples = cv_folds,
grid = rf_grid,
metrics = metric_set(roc_auc),
control = control_grid(save_pred = TRUE)
)
collect_metrics(rf_fit)
rf_fit_best <- select_best(rf_fit)
(wf_rf_best <- finalize_workflow(all_wf, rf_fit_best))
我从您的最后一段代码开始,并进行了一些编辑以实现功能性工作流程。我沿着代码回答了你的问题。我冒昧地给你一些建议并重新格式化你的代码。
## Packages, seed and data
library(tidyverse)
library(tidymodels)
set.seed(123)
df <- read_csv("creditcard.csv")
df <-
df %>%
arrange(-Class) %>%
head(1000) %>%
mutate(Class = as_factor(Class))
## Modelisation
# Initial split
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)
你可以看到 df_split
returns <750/250/1000>
(见下文)。
2) 要调整 xgboost 模型,您几乎不需要更改。
# Models
model_rf <-
rand_forest(mtry = tune(), trees = tune(), min_n = tune()) %>%
set_engine("ranger", importance = "impurity") %>%
set_mode("classification")
model_xgboost <-
boost_tree(mtry = tune(), trees = tune(), min_n = tune()) %>%
set_engine("xgboost", importance = "impurity") %>%
set_mode("classification")
在这里选择你的超参数网格。我建议您使用非随机网格以最佳方式访问超参数的 space。
# Grid of hyperparameters
grid_rf <-
grid_max_entropy(
mtry(range = c(1, 20)),
trees(range = c(500, 1000)),
min_n(range = c(2, 10)),
size = 30)
如您所见,这些是您的工作流程,几乎没有什么可以改变的。
# Workflow
wkfl_rf <-
workflow() %>%
add_formula(Class ~ .) %>%
add_model(model_rf)
wkfl_wgboost <-
workflow() %>%
add_formula(Class ~ .) %>%
add_model(model_xgboost)
1) <600/150/750>
表示您的训练集中有 600 个观察值,验证集中有 150 个观察值,原始数据集中共有 750 个观察值。请注意,在这里,600 + 150 = 750 但情况并非总是如此(例如,使用带有重采样的 boostrap 方法)。
# Cross validation method
cv_folds <- vfold_cv(df_train, v = 5)
cv_folds
3) 在这里,您可以使用 yardstik 包选择要在调整期间收集的指标。
# Choose metrics
my_metrics <- metric_set(roc_auc, accuracy, sens, spec, precision, recall)
然后就可以根据网格计算出不同的模型了。对于控制参数,不要保存预测和打印进度(恕我直言)。
# Tuning
rf_fit <- tune_grid(
wkfl_rf,
resamples = cv_folds,
grid = grid_rf,
metrics = my_metrics,
control = control_grid(verbose = TRUE) # don't save prediction (imho)
)
这些是处理 rf_fit
对象的一些有用函数。
# Inspect tuning
rf_fit
collect_metrics(rf_fit)
autoplot(rf_fit, metric = "accuracy")
show_best(rf_fit, metric = "accuracy", maximize = TRUE)
select_best(rf_fit, metric = "accuracy", maximize = TRUE)
最后,您可以根据最佳参数拟合您的模型。
# Fit best model
tuned_model <-
wkfl_rf %>%
finalize_workflow(select_best(rf_fit, metric = "accuracy", maximize = TRUE)) %>%
fit(data = df_train)
predict(tuned_model, df_train)
predict(tuned_model, df_test)
4) 不幸的是,处理 randomForest
对象的方法通常不适用于 parnsnip
输出
5)你可以看看vignette关于并行化的