Caret vs Tidymodels: как использовать оба пакета вместе?

Опубликовано: 09/01/2021 Время на прочтение: 5 минут

Фото Криса Барбалиса на Unsplash

Обзор

Импорт данных

библиотека(tidymodels)
библиотека(каретка)
библиотека(lubridate)
библиотека(tidyverse)
библиотека(моменты)
библиотека(corrr)
библиотека(randomForest)
велосипед <- read_csv("велосипед-обмен-набор данных/час.КШМ")
велосипед %>% тусклый()
## [1] 17379 17

велосипед %>%
mutate (instant = NULL, yr = yr + 2011) %>%
переименовать(
дата = dtday,
год = год,
месяц = мес,
час = час,
погода = weathersit,
влажность = гул,
итого = УНТ
) ->
велосипед
предварительный просмотр заголовка кадра данных head (bike)

Просмотр данных

Целевая переменная

велосипед %>%
pivot_longer(
cols = c (случайный, зарегистрированный, общий),
names_to = «пользовательского»,
values_to = «граф»
) %>%
ggplot(aes(count, color = usertype)) +
geom_density () +
лаборатории(
title = » распределение количества прокатных велосипедов»,
x = «число в час», y = » плотность»
) +
scale_colour_discrete(
name = » тип пользователя»,
перерывы = c(«случайные», «зарегистрированные», » всего»),
метки = c(«незарегистрированный»,» зарегистрированный», » всего»)
)
Распределение целевых переменных

Взаимосвязь

велосипед %>%
выберите (где (is. numeric)) %>%
коррелят () %>%
перестановка (абсолютная = ложная) %>%
бритье () — >
bike_cor
Rplot (bike_cor, print_cor = TRUE)
корреляционный график

Подготовка данных

Целевая переменная

bike_all <- велосипед %>%
выберите (- случайный, — зарегистрированный)

# Оригинал
асимметрия (bike_all$total)
## [1] 1.277301

# Журнал
асимметрия (log10(bike_all$total))
## [1] -0.936101

# Log + константа
асимметрия (log1p(bike_all$total))
## [1] -0.8181098

# Квадратный корень
асимметрия (sqrt(bike_all$total))
## [1] 0.2864499

# Кубический корень
асимметрия (bike_all$total^(1/3))
## [1] -0.0831688

# Преобразование с кубическим корнем
bike_all$итого <- bike_all$Итого^(1 / 3)

Предикторы

сезон bike_all$<- фактор(
bike_all$сезон,
уровни = c(1, 2, 3, 4),
метки = c («весна», «лето», «осень», » зима»)
)
bike_all$праздника <- фактор(
bike_all$праздник,
уровни = c(0, 1), метки = c (FALSE, TRUE)
)
bike_all$рабочийдень <- фактор(
bike_all$рабочийдень,
уровни = c(0, 1), метки = c (FALSE, TRUE)
)
bike_all$погода <- фактор(
bike_all$погода,
уровни = c(1, 2, 3, 4),
метки = c («ясно», «облачно», «дождливо», » сильный дождь»),
ordered = TRUE
)
руководитель(bike_all)
Предварительный просмотр заголовка фрейма данных

Разделение данных (поезд/тест, кросс-валидация)

tidymodels

набор семян (25)
сплит <- initial_split(bike_all, проп = 0.8)
train_data <- тренировки(сплит)
train_data %>% Дим()
## [1] 13904 14

test_data <- тестирование(сплит)
test_data %>% Дим()
## [1] 3475 14

train_cv <- vfold_cv(train_data, в = 10)

каретка

набор семян (25)
train_index <- createDataPartition(
bike_all$total, p = 0.8, times = 1, list = FALSE
)
train_data <- микрофоны[ train_index, ]
test_data <- микрофоны[-train_index, ] fold_index <- createFolds(
train_data$итого,
k = 10, returnTrain = TRUE, list = TRUE
)
train_cv <- trainControl(метод="резюме", показатель = fold_index)

train_cv_caret <- rsample2caret(train_cv)
ctrl_caret <- trainControl(
метод = » cv»,
индекс = индекс train_cv_caret$,
indexOut = train_cv_caret$indexOut
)

Предварительная обработка данных

tidymodels

prep_recipe <-
рецепт (всего ~ ., data = train_data) %>%
step_rm (год, месяц, день недели) %>%
step_date (дата) %>%
step_corr(all_numeric(), порог = 0.8) %>%
step_dummy(all_nominal())

каретка

преп <- предварительной обработки(среза = 0.8)

train_data_caret <-
преп(prep_recipe) %>% испечь(new_data = нуль)

test_data_caret <-
преп(prep_recipe) %>% испечь(new_data = test_data)

Модели поездов

# Создание прогнозных таблиц
predict_table < - функция(модель, данные, tidy_flag) {
если (tidy_flag == правда) {
результат < - модель %>%
прогноз (данные) %>%
переименовать (pred = .pred) %>%
мутировать(
фактические = данные$итого,
pred_real = pred^3,
actual_real = Факт^3
)
} еще {
результат < - модель %>%
прогноз (данные) %>%
as_tibble_col(имя_столбца = «пред») %>%
мутировать(
фактические = данные$итого,
pred_real = pred^3,
actual_real = Факт^3
)
}
результат
}

# Извлечение RMSE для моделей
pull_rmse < - функция(result_table) {
rmse_result <- СКО(result_table, пред, фактический) %>%
тянуть(.оценка)
rmse_result_real <- СКО(result_table, pred_real, actual_real) %>%
тянуть(.оценка)
результат <- с(СКО = rmse_result, real_rmse = rmse_result_real)
}

Основание

base_train_pred <-
тиббл(
фактический = train_data$итого,
actual_real = train_data$итого^3
) %>%
мутировать(пред = среднее(фактическое), pred_real = среднее(actual_real))
base_test_pred <-
тиббл(
фактический = test_data$итого,
actual_real = test_data$total^3
) %>%
мутировать(пред = среднее(фактическое), pred_real = среднее(actual_real))
base_train_rmse <- pull_rmse(base_train_pred)
печати(base_train_rmse)
## СКО real_rmse
## 2.032927 181.063306
base_test_rmse <- pull_rmse(base_test_pred)
печати(base_test_rmse)
## СКО real_rmse
## 2.02608 182.61370

Деревья решений с tidymodels

# Сложность затрат для параметра дерева решений
tree_cp <- сл(0.01, 0.1, 0.01) набор семян (25)
tree_tidy_time1 <- Представление sys.время() # Указать модель
tree_engine <-
decision_tree (mode = «регрессия», cost_complexity = tune ()) %>%
set_engine («rpart»)

# Набор рабочего процесса (предварительная обработка и модель)
tree_workflow <-
рабочий процесс() %>%
add_recipe (prep_recipe) %>%
add_model(tree_engine)

# Настройка параметров с помощью перекрестной проверки
tree_tune <- tune_grid(
tree_workflow,
пересчитывает = train_cv,



прокрутка вверх