0Pricing
R Academy · レッスン

rsample による再標本化と交差検証

k 分割交差検証、ブートストラップ、ネストした再標本化でモデルを評価します。

「rsample による再標本化と交差検証」はCoddyKit上の無料R Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

再サンプリングを行う理由

単一のtrain/test分割では、モデル性能の推定値が不安定になります。どの観測値がテストセットに入るかによって、運が良かったり悪かったりするためです。再サンプリングではこの手順を複数回繰り返し、モデルが新しいデータにどの程度一般化できるかについて、安定した信頼性の高い推定値を得ます。

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)は、データを学習用セットとテスト用セットにランダムに1回分割します。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個を検証に使い、すべてのフォールドが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()で要約できる結果のtibbleが返されます。

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)はブートストラップサンプルを作成します。各サンプルは、元のデータセットと同じサイズになるよう復元抽出したランダムなサンプルです。抽出されなかった観測値が、out-of-bag(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)は、層化されたtrain/test分割を作成します。
  • 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時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「rsample による再標本化と交差検証」で何を学びますか?

k 分割交差検証、ブートストラップ、ネストした再標本化でモデルを評価します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応の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に戻る