tidymodels: рейнджер с перекрестной проверкой
Набор данных можно найти здесь:https://www.kaggle.com/mlg-ulb/creditcardfraud
Я пытаюсь использовать tidymodels для запуска рейнджера с 5-кратной перекрестной проверкой этого набора данных.
У меня есть 2 блока кода. Первый блок кода - это исходный код с полными данными. Второй блок кода почти идентичен первому блоку кода, за исключением того, что я выделил часть данных, поэтому код выполняется быстрее. Второй блок кода предназначен только для того, чтобы убедиться, что мой код работает, прежде чем я запустил его в исходном наборе данных.
Вот первый блок кода с полными данными:
#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.) С помощью первого блока кода я могу назначать и печатать складки резюме в консоли. По данным Global Enviornment, cv_folds имеет 5 obs. 2 переменных. Когда я просматриваю (cv_folds), у меня есть столбцы с метками splits и id, но нет ни строк, ни данных. Когда я использую str(cv_folds), я получаю пустую строку загрузки, что R "думает", но нет красного значка STOP, который я могу нажать. Единственное, что я могу сделать, - это принудительно закрыть RStudio. Может мне просто нужно подождать подольше? Я не уверена. Когда я делаю то же самое с меньшим вторым блоком кода, str() работает нормально.
2) Моя общая цель в этом проекте - разделить набор данных на обучающие и тестовые наборы. Затем разделите данные обучения с помощью 5-кратной перекрестной проверки и обучите на нем модель рейнджера. Затем я хочу изучить метрики моей модели на данных обучения. Затем я хочу протестировать свою модель на тестовом наборе и просмотреть показатели. В конце концов, я хочу поменять рейнджера на что-то вроде xgboost. Пожалуйста, дайте мне совет, какие части моего кода я могу добавить / изменить для улучшения. Мне все еще не хватает части тестирования моей модели на тестовом наборе.
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) Как я могу кардинально сократить время на обучение модели? В прошлый раз, когда я запускал ranger с 5-кратной перекрестной проверкой с использованием каретки в этом наборе данных, это заняло 8+ часов (6 ядер, 4,0 ГГц, 16 ГБ ОЗУ, 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))
1 ответ
Я начал с вашего последнего блока кода и внес некоторые изменения, чтобы рабочий процесс работал нормально. Я ответил на ваши вопросы по коду. Я взял на себя смелость дать вам несколько советов и переформатировать ваш код.
## 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
возвращается <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")
Здесь вы выбираете сетку гиперпараметров. Я советую вам использовать неслучайную сетку, чтобы оптимальным образом посещать пространство гиперпараметров.
# 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, но это не всегда так (например, с методами ускоренной обработки с передискретизацией).
# 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)
Затем вы можете рассчитывать разные модели в соответствии с сеткой. Для контрольных параметров не сохраняйте прогноз и прогресс печати (imho).
# 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) Вы можете взглянуть на виньетку о распараллеливании.