Ресэмплинг и перекрёстная проверка с rsample
Оценивайте модели с помощью k-блочной CV, бутстрепа и вложенного ресэмплинга
«Ресэмплинг и перекрёстная проверка с rsample» — бесплатный урок R Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Зачем выполнять повторную выборку
Одно разделение на обучающую и тестовую выборки даёт зашумлённую оценку качества модели: вам могло повезти или не повезти с тем, какие наблюдения попали в тестовую выборку. Повторная выборка многократно повторяет этот процесс, чтобы получить стабильную и надёжную оценку того, как модель обобщается на новые данные.
library(rsample)
# Single split — performance estimate depends heavily
# on which 20% ended up as test data
split <- initial_split(mtcars, prop = 0.8)
train <- training(split)
test <- testing(split)
cat('Train:', nrow(train), '| Test:', nrow(test))initial_split()
initial_split(data, prop, strata) создаёт одно случайное разделение на обучающую и тестовую выборки. Используйте strata, чтобы выполнить стратификацию по столбцу (например, по переменной отклика) и сохранить баланс классов в обеих частях.
library(rsample)
# Stratified split by outcome variable
split <- initial_split(ames, prop = 0.8, strata = Sale_Price)
train <- training(split)
test <- testing(split)
cat('Train rows:', nrow(train))
cat('Test rows:', nrow(test))vfold_cv() — перекрёстная проверка по k блокам
vfold_cv(data, v = 10) создаёт 10 блоков. Данные разделяются на 10 равных частей: 9 используются для обучения, а 1 — для проверки, после чего блоки по очереди меняются ролями. В результате получаются 10 оценок качества, усредняемых для получения стабильной метрики.
folds <- vfold_cv(housing_train, v = 10, strata = price)
# Each fold is a split object
print(folds)
# Inspect one fold
fold_1 <- folds$splits[[1]]
train_1 <- analysis(fold_1)
val_1 <- assessment(fold_1)
cat('Fold 1 — Train:', nrow(train_1), '| Val:', nrow(val_1))fit_resamples()
fit_resamples(workflow, resamples, metrics) обучает рабочий процесс на каждом обучающем блоке и оценивает его на проверочном блоке, собирая запрошенные метрики. Функция возвращает таблицу результатов, которую можно обобщить с помощью collect_metrics().
library(tune)
folds <- vfold_cv(housing_train, v = 10)
res <- fit_resamples(
wf, # your workflow
folds,
metrics = metric_set(rmse, rsq)
)
# Average metric across all 10 folds
collect_metrics(res)collect_metrics()
collect_metrics(resample_result) возвращает аккуратную таблицу, обобщающую качество модели по всем блокам. Столбец mean содержит среднее значение метрики, а std_err — стандартную ошибку, показывая степень разброса оценки.
metrics_df <- collect_metrics(res)
print(metrics_df)
# .metric .estimator mean n std_err .config
# rmse standard 24500 10 1200 Preprocessor1_Model1
# rsq standard 0.882 10 0.012 Preprocessor1_Model1
# Pull a single metric
collect_metrics(res) |>
dplyr::filter(.metric == 'rmse') |>
dplyr::pull(mean)bootstraps() — бутстрэп-повторная выборка
bootstraps(data, times = 25) создаёт бутстрэп-выборки: каждая выборка формируется случайным выбором с возвращением и имеет тот же размер, что и исходный набор данных. Наблюдения, не попавшие в выборку, образуют оценочную выборку вне пакета (OOB). Бутстрэп-выборки обладают большей дисперсией, чем метод k блоков, но хорошо работают на небольших наборах данных.
boot_samples <- bootstraps(housing_train, times = 25, strata = price)
print(boot_samples)
# Average proportion of unique rows in each bootstrap
mean(sapply(boot_samples$splits, function(s) {
nrow(analysis(s)) / nrow(housing_train)
}))Перекрёстная проверка методом Монте-Карло
mc_cv(data, prop, times) создаёт times случайных разделений, используя в каждом prop долю данных для обучения. В отличие от метода k блоков, одно и то же наблюдение может несколько раз оказаться в проверочной выборке. Это полезно, когда требуется больше итераций повторной выборки, чем предоставляет метод k блоков.
mc_splits <- mc_cv(housing_train, prop = 0.8, times = 20)
res_mc <- fit_resamples(
wf,
mc_splits,
metrics = metric_set(rmse, rsq)
)
collect_metrics(res_mc)tune_grid() — поиск гиперпараметров
Если рабочий процесс содержит заполнители tune(), используйте tune_grid(wf, resamples, grid) для поиска по сетке значений гиперпараметров. Каждая комбинация оценивается на всех блоках, а лучшая конфигурация выбирается с помощью select_best().
rf_spec <- rand_forest(mtry = tune(), trees = tune()) |>
set_engine('ranger') |>
set_mode('regression')
wf_tune <- workflow() |> add_recipe(rec) |> add_model(rf_spec)
grid <- grid_regular(mtry(range = c(2, 10)), trees(range = c(100, 500)), levels = 3)
tune_res <- tune_grid(wf_tune, resamples = folds, grid = grid)
collect_metrics(tune_res) |> head()select_best() и finalize_workflow()
После настройки select_best(tune_res, metric) выбирает комбинацию гиперпараметров с лучшим средним значением метрики. finalize_workflow(wf, best_params) создаёт новый рабочий процесс, подставляя эти значения вместо tune().
best_params <- select_best(tune_res, metric = 'rmse')
print(best_params)
# Substitute best values into the workflow
final_wf <- finalize_workflow(wf_tune, best_params)
# Fit on all training data, evaluate on test
final_fit <- last_fit(final_wf, split)
collect_metrics(final_fit)Вложенная перекрёстная проверка
Для действительно непредвзятой оценки при одновременной настройке гиперпараметров используйте вложенную перекрёстную проверку: внешний цикл — для оценки качества, внутренний — для настройки. В rsample создайте внешнюю vfold_cv и выполняйте настройку внутри каждого внешнего блока, используя внутренние блоки.
# Outer folds for unbiased evaluation
outer_folds <- vfold_cv(housing_train, v = 5)
# For each outer fold, tune on the inner training data
res_nested <- tune_grid(
wf_tune,
resamples = outer_folds,
grid = 10, # 10 random configurations
metrics = metric_set(rmse)
)
collect_metrics(res_nested)Сравнение стратегий повторной выборки
У каждой стратегии повторной выборки есть свои компромиссы. Выбирайте стратегию с учётом размера набора данных и доступных вычислительных ресурсов:
- Метод k блоков (v=10): небольшое смещение и умеренная дисперсия. Стандартный выбор для большинства задач.
- Бутстрэп: подходит для очень небольших наборов данных, но имеет большую дисперсию, чем метод k блоков.
- Перекрёстная проверка методом Монте-Карло: более гибкая и хорошо подходит для настройки при ограниченном времени.
- Повторный метод k блоков: меньшая дисперсия; используйте, если можете позволить себе дополнительные вычисления.
# Repeated k-fold: 5-fold repeated 3 times = 15 models fitted
repeated_folds <- vfold_cv(housing_train, v = 5, repeats = 3)
res_rep <- fit_resamples(
wf,
repeated_folds,
metrics = metric_set(rmse, rsq)
)
collect_metrics(res_rep)Быстрая проверка
Что возвращает collect_metrics() при применении к результату fit_resamples()?
Итоги по повторной выборке
Основные выводы из раздела «Повторная выборка и перекрёстная проверка с rsample»:
initial_split(data, prop, strata)создаёт стратифицированное разделение на обучающую и тестовую выборки.vfold_cv(data, v = 10)создаёт блоки для перекрёстной проверки по k блокам.bootstraps(data, times)создаёт бутстрэп-выборки для небольших наборов данных.fit_resamples(wf, folds, metrics)оценивает рабочий процесс по всем блокам.collect_metrics()обобщает результаты с помощью среднего значения и стандартной ошибки.tune_grid()выполняет поиск гиперпараметров, аselect_best()выбирает лучший вариант.finalize_workflow()+last_fit()завершают конвейер от настройки до развёртывания.
# Full rsample pipeline
split <- initial_split(data, prop = 0.8, strata = y)
train <- training(split)
folds <- vfold_cv(train, v = 10)
res <- fit_resamples(wf, folds, metrics = metric_set(rmse, rsq))
collect_metrics(res)
# After tuning
best <- select_best(tune_res, metric = 'rmse')
fin_wf <- finalize_workflow(wf_tune, best)
last_fit(fin_wf, split) |> collect_metrics()Часто задаваемые вопросы
Урок «Ресэмплинг и перекрёстная проверка с rsample» бесплатный?
Да — полный текст урока «Ресэмплинг и перекрёстная проверка с rsample» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Ресэмплинг и перекрёстная проверка с rsample»?
Оценивайте модели с помощью k-блочной CV, бутстрепа и вложенного ресэмплинга Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Ресэмплинг и перекрёстная проверка с rsample»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание признаков с помощью recipes
- Спецификация моделей с помощью parsnip
- Рабочие процессы: объединение рецептов и моделей
- Ресэмплинг и перекрёстная проверка с rsample