0Pricing
R Academy · Урок

Ресэмплинг и перекрёстная проверка с 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 — локальная установка не требуется.

Все уроки этого курса

  1. Создание признаков с помощью recipes
  2. Спецификация моделей с помощью parsnip
  3. Рабочие процессы: объединение рецептов и моделей
  4. Ресэмплинг и перекрёстная проверка с rsample
← Назад к R Academy