0Pricing
R Academy · Lekcja

Próbkowanie i walidacja krzyżowa za pomocą rsample

Oceniaj modele za pomocą walidacji krzyżowej k-fold, bootstrappingu i próbkowania zagnieżdżonego.

Próbkowanie i walidacja krzyżowa za pomocą rsample to bezpłatna lekcja R Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

Po co stosować resampling?

Pojedynczy podział na zbiór treningowy i testowy daje obarczone szumem oszacowanie jakości modelu — może mieć Pan/Pani szczęście lub pecha w zależności od tego, które obserwacje trafiły do zbioru testowego. Resampling wielokrotnie powtarza ten proces, aby uzyskać stabilne i wiarygodne oszacowanie tego, jak model uogólnia się na nowe dane.

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) tworzy pojedynczy losowy podział na zbiory treningowy i testowy. Użyj strata, aby dokonać stratyfikacji według kolumny (np. zmiennej wynikowej) i zachować równowagę klas w obu częściach.

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() — walidacja krzyżowa k-fold

vfold_cv(data, v = 10) tworzy 10 foldów. Dane są dzielone na 10 równych części; 9 służy do trenowania, a 1 do walidacji, po czym części są kolejno zamieniane. Daje to 10 oszacowań jakości, które są uśredniane w celu uzyskania stabilnej metryki.

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) dopasowuje workflow na każdym foldzie treningowym i ocenia go na foldzie walidacyjnym, zbierając żądane metryki. Zwraca tibble z wynikami, który można podsumować za pomocą 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) zwraca uporządkowany tibble podsumowujący jakość modelu we wszystkich foldach. Kolumna mean zawiera średnią wartość metryki, a std_err — błąd standardowy, który daje obraz zmienności oszacowania.

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() — resampling bootstrapowy

bootstraps(data, times = 25) tworzy próbki bootstrapowe: każda próbka jest losowaniem ze zwracaniem o takim samym rozmiarze jak oryginalny zbiór danych. Niewylosowane obserwacje tworzą zbiór oceny out-of-bag (OOB). Bootstrap ma większą wariancję niż k-fold, ale dobrze sprawdza się w przypadku małych zbiorów danych.

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)
}))

Walidacja krzyżowa Monte Carlo

mc_cv(data, prop, times) tworzy times losowych podziałów, z których każdy wykorzystuje prop danych do trenowania. W przeciwieństwie do k-fold ta sama obserwacja może wielokrotnie pojawić się w zbiorze walidacyjnym. Jest to przydatne, gdy potrzebnych jest więcej iteracji resamplingu niż zapewnia k-fold.

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() — wyszukiwanie hiperparametrów

Gdy workflow zawiera symbole zastępcze tune(), użyj tune_grid(wf, resamples, grid), aby przeszukać siatkę wartości hiperparametrów. Każda kombinacja jest oceniana na wszystkich foldach, a najlepsza konfiguracja jest wybierana za pomocą 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() i finalize_workflow()

Po dostrojeniu select_best(tune_res, metric) wybiera kombinację hiperparametrów z najlepszą średnią wartością metryki. finalize_workflow(wf, best_params) tworzy nowy workflow, w którym te wartości zastępują 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)

Zagnieżdżona walidacja krzyżowa

Aby uzyskać naprawdę bezstronną ocenę podczas jednoczesnego dostrajania hiperparametrów, należy użyć zagnieżdżonej walidacji krzyżowej: zewnętrzna pętla służy do oszacowania jakości, a wewnętrzna do dostrajania. W rsample należy utworzyć zewnętrzny vfold_cv i dostrajać model w każdym zewnętrznym foldzie, korzystając z foldów wewnętrznych.

# 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)

Porównywanie strategii resamplingu

Każda strategia resamplingu ma swoje zalety i kompromisy. Należy wybrać ją na podstawie rozmiaru zbioru danych i dostępnego budżetu obliczeniowego:

  • k-fold (v=10): małe obciążenie, umiarkowana wariancja. Domyślny wybór w większości problemów.
  • Bootstrap: działa przy bardzo małych zbiorach danych; ma większą wariancję niż k-fold.
  • Monte Carlo CV: większa elastyczność; dobre rozwiązanie przy ograniczonym czasie dostrajania.
  • Powtarzany k-fold: mniejsza wariancja; należy go używać, gdy można przeznaczyć więcej zasobów obliczeniowych.
# 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)

Szybkie sprawdzenie

Co zwraca collect_metrics() zastosowane do wyniku fit_resamples()?

Podsumowanie resamplingu

Najważniejsze informacje z lekcji Resampling i walidacja krzyżowa w rsample:

  • initial_split(data, prop, strata) tworzy stratyfikowany podział na zbiory treningowy i testowy.
  • vfold_cv(data, v = 10) tworzy foldy walidacji krzyżowej k-fold.
  • bootstraps(data, times) tworzy próbki bootstrapowe dla małych zbiorów danych.
  • fit_resamples(wf, folds, metrics) ocenia workflow na wszystkich foldach.
  • collect_metrics() podsumowuje wyniki za pomocą średniej i błędu standardowego.
  • tune_grid() przeszukuje hiperparametry, a select_best() wybiera najlepszą konfigurację.
  • finalize_workflow() + last_fit() zamykają proces od dostrajania do wdrożenia.
# 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()

Często zadawane pytania

Czy lekcja „Próbkowanie i walidacja krzyżowa za pomocą rsample” jest bezpłatna?

Tak — pełny tekst „Próbkowanie i walidacja krzyżowa za pomocą rsample” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Próbkowanie i walidacja krzyżowa za pomocą rsample”?

Oceniaj modele za pomocą walidacji krzyżowej k-fold, bootstrappingu i próbkowania zagnieżdżonego. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Próbkowanie i walidacja krzyżowa za pomocą rsample”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Inżynieria cech za pomocą recipes
  2. Specyfikacje modeli za pomocą parsnip
  3. Workflowy: łączenie recipes i modeli
  4. Próbkowanie i walidacja krzyżowa za pomocą rsample
← Powrót do R Academy