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) Вы можете взглянуть на виньетку о распараллеливании.

Другие вопросы по тегам