0Pricing
R Academy · 강의

rsample을 활용한 재표본추출과 교차 검증

k-겹 CV, 부트스트랩 및 중첩 재표본추출로 모델을 평가합니다.

rsample을 활용한 재표본추출과 교차 검증은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 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)는 각 학습 폴드에서 워크플로를 적합하고 검증 폴드에서 평가하면서 요청한 지표를 수집합니다. 결과의 tibble을 반환하며, 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)는 모든 폴드에서의 모델 성능을 요약한 정돈된 tibble을 반환합니다. 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겹보다 분산이 큽니다.
  • 몬테카를로 CV: 더 유연하며, 시간 제약이 있는 조정에 적합합니다.
  • 반복 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)

빠른 확인

fit_resamples()의 결과에 collect_metrics()를 적용하면 무엇을 반환하나요?

재표집 요약

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 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“rsample을 활용한 재표본추출과 교차 검증”에서 뭘 배우나요?

k-겹 CV, 부트스트랩 및 중첩 재표본추출로 모델을 평가합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“rsample을 활용한 재표본추출과 교차 검증” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. recipes를 활용한 특성 공학
  2. parsnip으로 모델 사양 정의
  3. 워크플로: 레시피와 모델 결합
  4. rsample을 활용한 재표본추출과 교차 검증
← R Academy(으)로 돌아가기