R Academy · leksjon

Resampling og kryssvalidering med rsample

Evaluer modeller med k-fold-CV, bootstrap og nestet resampling.

Leksjon 4 av 413 trinn

Resampling og kryssvalidering med rsample er en gratis leksjon i R Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i R Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i R Academy inneholder totalt 4 leksjoner.

Hvorfor resample?

Et enkelt trenings-/testskille gir et usikkert estimat av modellens ytelse – De kan ha vært heldig eller uheldig med hvilke observasjoner som havnet i testsettet. Resampling gjentar prosessen flere ganger for å få et stabilt og pålitelig estimat av hvordan modellen generaliserer til nye data.

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) oppretter et enkelt tilfeldig skille i trenings- og testsett. Bruk strata til å stratifisere etter en kolonne, for eksempel målvariabelen, slik at klassebalansen opprettholdes i begge delene.

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-fold-kryssvalidering

vfold_cv(data, v = 10) oppretter 10 fold. Dataene deles i 10 like deler. 9 brukes til trening og 1 til validering, og dette roteres gjennom alle foldene. Resultatet er 10 ytelsesestimater som gjennomsnittberegnes for å gi en stabil metrikk.

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) tilpasser arbeidsflyten på hver treningsfold og evaluerer den på valideringsfolden, samtidig som de etterspurte metrikkene samles inn. Den returnerer en tibble med resultater som De oppsummerer med 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) returnerer en ryddig tibble som oppsummerer modellens ytelse på tvers av alle foldene. Kolonnen mean er den gjennomsnittlige metrikken, og std_err er standardfeilen. Dette gir Dem et inntrykk av variasjonen i estimatet.

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

bootstraps(data, times = 25) oppretter bootstrap-utvalg: hvert utvalg er et tilfeldig trekk med tilbakelegging og har samme størrelse som det opprinnelige datasettet. Observasjoner som ikke trekkes ut, danner vurderingssettet out-of-bag (OOB). Bootstrap har høyere varians enn k-fold, men fungerer godt med små datasett.

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

Monte Carlo-kryssvalidering

mc_cv(data, prop, times) oppretter times tilfeldige skiller, der prop av dataene brukes til trening i hvert skille. I motsetning til k-fold kan den samme observasjonen forekomme i valideringssettet flere ganger. Dette er nyttig når De trenger flere resampling-iterasjoner enn k-fold gir.

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() — Søk etter hyperparametere

Når arbeidsflyten inneholder tune()-plassholdere, bruker De tune_grid(wf, resamples, grid) til å søke gjennom et rutenett av hyperparameterverdier. Hver kombinasjon evalueres på alle foldene, og den beste konfigurasjonen velges med 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() og finalize_workflow()

Etter tuning velger select_best(tune_res, metric) hyperparameterkombinasjonen med den beste gjennomsnittlige metrikken. finalize_workflow(wf, best_params) oppretter en ny arbeidsflyt der disse verdiene settes inn i stedet for 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)

Nested kryssvalidering

For en virkelig objektiv evaluering når De også tuner hyperparametere, kan De bruke nested cross validation: en ytre løkke for estimering av ytelse og en indre løkke for tuning. I rsample oppretter De en ytre vfold_cv og tuner innenfor hver ytre fold ved hjelp av de indre foldene.

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

Sammenligning av resampling-strategier

Hver resampling-strategi har sine avveininger. Velg basert på størrelsen på datasettet og tilgjengelige beregningsressurser:

  • k-fold (v=10): Lav skjevhet, moderat varians. Standardvalget for de fleste problemer.
  • Bootstrap: Fungerer med svært lite data, men har høyere varians enn k-fold.
  • Monte Carlo CV: Mer fleksibelt, og godt egnet for tuning med tidsbegrensninger.
  • Gjentatt k-fold: Lavere varians. Bruk dette når De har råd til mer beregning.
# 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)

Kort kontroll

Hva returnerer collect_metrics() når den brukes på et resultat fra fit_resamples()?

Oppsummering av resampling

Viktigste punkter fra Resampling og kryssvalidering med rsample:

  • initial_split(data, prop, strata) oppretter et stratifisert trenings-/testskille.
  • vfold_cv(data, v = 10) oppretter fold for k-fold-kryssvalidering.
  • bootstraps(data, times) oppretter bootstrap-utvalg for små datasett.
  • fit_resamples(wf, folds, metrics) evaluerer en arbeidsflyt på tvers av alle foldene.
  • collect_metrics() oppsummerer resultatene med gjennomsnitt og standardfeil.
  • tune_grid() søker etter hyperparametere, mens select_best() velger vinneren.
  • finalize_workflow() + last_fit() fullfører arbeidsflyten fra tuning til produksjonssetting.
# 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()
Gratis å komme i gang

Lær deg R med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
43
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Resampling og kryssvalidering med rsample» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien R Academy, inkludert «Resampling og kryssvalidering med rsample», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i R Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Resampling og kryssvalidering med rsample»?

Evaluer modeller med k-fold-CV, bootstrap og nestet resampling. Du øver på R Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med R Academy?

Ingen tidligere erfaring er nødvendig. R Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Resampling og kryssvalidering med rsample»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne R Academy-leksjonen?

Ja. Alle R Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Feature engineering med recipes
  2. Modellspesifikasjoner med parsnip
  3. Arbeidsflyter: kombinere oppskrifter og modeller
  4. Resampling og kryssvalidering med rsample
← Tilbake til R Academy