Tidymodels: рейнджер с перекрестной проверкой - PullRequest
6 голосов
/ 24 февраля 2020

Набор данных можно найти здесь: https://www.kaggle.com/mlg-ulb/creditcardfraud

Я пытаюсь использовать тидимодели для запуска рейнджера с 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.) С помощью первого блока кода я могу назначить и распечатать cv-сгибы в консоли. Данные Global Enviornment говорят, что у cv_folds есть 5 наблюдений. из 2 переменных. Когда я просматриваю (cv_folds), у меня есть столбцы, помеченные как split и id, но нет ни строк, ни данных. Когда я использую str (cv_folds), я получаю пустую строку загрузки, которую R «думает», но нет красного значка STOP, который я могу сделать pu sh. Единственное, что я могу сделать, это принудительно выйти из RStudio. Может, мне просто нужно подождать дольше? Я не уверена. Когда я делаю то же самое с меньшим вторым блоком кода, str () работает нормально.

2) Моя общая цель этого проекта - разделить набор данных на наборы для обучения и тестирования. Затем разделите данные обучения с 5-кратной перекрестной проверкой и обучите модель рейнджера. Далее я хочу изучить метрики моей модели на тренировочных данных. Затем я хочу проверить свою модель на тестовом наборе и просмотреть показатели. В конце концов, я хочу поменять Ranger на что-то вроде 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_au c. Как мне получить чувствительность, специфичность, точность и отзыв?

4) Как изобразить важность? Буду ли я использовать что-то вроде этого?

rf_fit <- get_tree_fit(all_wf)
vip::vip(rf_fit, geom = "point")

5) Как я могу радикально сократить время, необходимое для тренировки модели? В прошлый раз, когда я запускал рейнджер с 5-кратной перекрестной проверкой с использованием каретки для этого набора данных, это заняло 8+ часов (6 ядер, 4,0 ГГц, 16 ГБ ОЗУ, SSD, GTX 1060). Я открыт для всего (ie. Код реструктуризации, AWS вычисления, распараллеливание и т. Д. c.)


Редактировать: это еще один способ, которым я пытался настроить это

#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 Ответ

4 голосов
/ 05 марта 2020

Я начал с вашего последнего блока кода и внес некоторые изменения, чтобы иметь функциональный рабочий процесс. Я ответил на ваши вопросы по коду. Я взял на себя смелость дать вам несколько советов и переформатировать ваш код.

## 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, но это не всегда так (например, с методами 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)

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

...