Resampling og krydsvalidering med rsample
Evaluér modeller med k-fold-CV, bootstrap og nested resampling.
Resampling og krydsvalidering med rsample er en gratis R Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i R Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. R Academy-kurset indeholder 4 lektioner i alt.
Hvorfor genudtage stikprøver?
En enkelt opdeling i trænings- og testdata giver et usikkert estimat af modellens ydeevne — du kan have været heldig eller uheldig med, hvilke observationer der endte i testsættet. Genudtagning gentager processen flere gange for at få et stabilt og pålideligt estimat af, hvordan din model 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) opretter en enkelt tilfældig opdeling i trænings- og testsæt. Brug strata til at stratificere efter en kolonne, f.eks. udfaldsvariablen, så klassebalancen bevares i begge dele.
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-krydsvalidering
vfold_cv(data, v = 10) opretter 10 fold. Dataene opdeles i 10 lige store dele; 9 bruges til træning og 1 til validering, mens alle fold skiftevis bruges. Det giver 10 estimater af ydeevnen, som gennemsnittes til et stabilt måltal.
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 dit workflow på hver træningsfold og evaluerer det på valideringsfolden, mens de ønskede måltal indsamles. Den returnerer en tibble med resultater, som du opsummerer 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 ryddelig tibble, der opsummerer modellens ydeevne på tværs af alle fold. Kolonnen mean er det gennemsnitlige måltal, og std_err er standardfejlen, som giver dig en fornemmelse af variationen 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-genudtagning
bootstraps(data, times = 25) opretter bootstrap-stikprøver: Hver stikprøve er en tilfældig udtagning med tilbagelægning og samme størrelse som det oprindelige datasæt. Observationer, der ikke blev udtaget, udgør vurderingssættet uden for stikprøven (OOB). Bootstrap har større varians end k-fold, men fungerer godt med små datasæt.
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-krydsvalidering
mc_cv(data, prop, times) opretter times tilfældige opdelinger, hvor prop af dataene hver gang bruges til træning. I modsætning til k-fold kan den samme observation optræde i valideringssættet flere gange. Det er nyttigt, når du har brug for flere genudtagningsiterationer, end k-fold giver.
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øgning efter hyperparametre
Når dit workflow indeholder pladsholdere fra tune(), kan du bruge tune_grid(wf, resamples, grid) til at søge gennem et gitter af hyperparameterværdier. Hver kombination evalueres på alle fold, og den bedste konfiguration vælges 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()
Efter justering vælger select_best(tune_res, metric) den hyperparameterkombination, der har det bedste gennemsnitlige måltal. finalize_workflow(wf, best_params) opretter et nyt workflow, hvor disse værdier indsættes 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)Indlejret krydsvalidering
Brug indlejret krydsvalidering for at få en helt uvildig evaluering, når du også justerer hyperparametre: en ydre løkke til estimering af ydeevnen og en indre løkke til justering. I rsample opretter du en ydre vfold_cv og justerer inden for hver ydre fold ved hjælp af de indre fold.
# 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 af strategier til genudtagning
Hver strategi til genudtagning har sine fordele og ulemper. Vælg ud fra datasættets størrelse og dit beregningsbudget:
- k-fold (v=10): Lav bias, moderat varians. Standardvalget til de fleste problemer.
- Bootstrap: Fungerer med meget få data, men har større varians end k-fold.
- Monte Carlo CV: Mere fleksibel, god til justering under tidsbegrænsninger.
- Gentaget k-fold: Lavere varians, brug det når du har råd til flere beregninger.
# 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)Hurtigt tjek
Hvad returnerer collect_metrics(), når den anvendes på et resultat fra fit_resamples()?
Opsummering af genudtagning
Vigtigste pointer fra genudtagning og krydsvalidering med rsample:
initial_split(data, prop, strata)opretter en stratificeret opdeling i trænings- og testdata.vfold_cv(data, v = 10)opretter fold til k-fold-krydsvalidering.bootstraps(data, times)opretter bootstrap-stikprøver til små datasæt.fit_resamples(wf, folds, metrics)evaluerer et workflow på tværs af alle fold.collect_metrics()opsummerer resultater med gennemsnit og standardfejl.tune_grid()søger efter hyperparametre, ogselect_best()vælger vinderen.finalize_workflow()+last_fit()fuldfører processen fra justering til implementering.
# 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()Lær R med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 43
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Resampling og krydsvalidering med rsample” gratis?
Ja — alle 3 lektioner i læringssporet R Academy, inklusive “Resampling og krydsvalidering med rsample”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. R Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Resampling og krydsvalidering med rsample”?
Evaluér modeller med k-fold-CV, bootstrap og nested resampling. Du øver dig i R Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på R Academy?
Der kræves ingen tidligere erfaring. R Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Resampling og krydsvalidering med rsample”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne R Academy-lektion?
Ja. Alle R Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Feature engineering med recipes
- Model specifikationer med parsnip
- Workflows: Kombination af recipes og modeller
- Resampling og krydsvalidering med rsample