🔄
CHAPTER 16

リサンプリング戦略 - rsample

信頼性の高いモデル評価のために。rsampleでクロスバリデーション、ブートストラップ、時系列分割など、様々なリサンプリング戦略をマスターしよう。

🎯 リサンプリングの重要性

リサンプリングは、限られたデータから信頼性の高いモデル評価を行うための統計的手法です。rsampleパッケージを使用して、様々なリサンプリング戦略を実装します。

📦 環境のセットアップ

リサンプリング環境の準備
# リサンプリングエコシステムの読み込み library(tidyverse) library(rsample) # 機械学習パッケージ library(tidymodels) library(yardstick) # サンプルデータの作成 set.seed(123) # 回帰用データセット regression_data <- tibble( x1 = rnorm(1000), x2 = rnorm(1000), y = 2 * x1 + 1.5 * x2 + rnorm(1000) ) glimpse(regression_data)

✂️ 基本的なデータ分割

initial_split()を使用して、データを訓練用とテスト用に分割します。これが全てのモデル評価の出発点です。

🎯 いつ・なぜ使うか?

📋 適用シチュエーション
  • 最終的なモデル性能を公正に評価したい
  • 新しいデータに対する予測精度を知りたい
  • モデルの汎化能力を測定したい
  • 過学習(オーバーフィッティング)を検出したい
🎯 具体的な目的
  • Hold-out評価:未見データでの性能測定
  • 層化分割:クラス比率や分布の保持
  • 時系列分割:時間的順序の考慮
  • 最終判定:プロダクション投入前の品質保証

💡 重要な注意点: テストデータは一度だけ使用し、モデル選択や調整には絶対に使わないこと!

訓練・テスト分割
# 基本的な分割 data_split <- regression_data %>% initial_split(prop = 0.8) # 訓練データ取得 train_data <- training(data_split) test_data <- testing(data_split) print(paste("訓練データ:", nrow(train_data))) print(paste("テストデータ:", nrow(test_data))) # 層化抽出 stratified_split <- regression_data %>% mutate(y_group = cut(y, breaks = 3)) %>% initial_split(prop = 0.8, strata = y_group) print("層化抽出完了")

🔄 クロスバリデーション

クロスバリデーションにより、モデルの汎化性能を信頼性高く評価できます。k-fold、leave-one-out、Monte Carloなど様々な手法があります。

🔍 いつ・なぜ使うか?

📋 適用シチュエーション
  • モデル選択時の性能比較をしたい
  • ハイパーパラメータを調整したい
  • 小さなデータセットを有効活用したい
  • 統計的に安定した評価が必要
🎯 具体的な目的
  • K-fold CV:バランスの取れた評価
  • 層化CV:不均衡データでの公正評価
  • Repeated CV:より安定した推定
  • Leave-one-out:極小データでの最大活用

実用のコツ: 5-10 fold CVが一般的。計算コストと精度のバランスを考慮して選択!

k-fold クロスバリデーション
# 10-fold クロスバリデーション cv_folds <- train_data %>% vfold_cv(v = 10) print(cv_folds) # 層化CV stratified_cv <- train_data %>% mutate(y_group = cut(y, breaks = 3)) %>% vfold_cv(v = 5, strata = y_group) print("層化CV作成完了")

👢 ブートストラップリサンプリング

ブートストラップは復元抽出によるリサンプリング手法で、信頼区間の推定や分散の評価に有用です。

🎲 いつ・なぜ使うか?

📋 適用シチュエーション
  • 不確実性の定量化をしたい
  • 信頼区間を推定したい
  • 分散バイアスを評価したい
  • アンサンブル学習に活用したい
🎯 具体的な目的
  • Bootstrap CI:予測の信頼区間算出
  • Out-of-bag評価:OOBエラーでの性能測定
  • Bagging:ランダムフォレスト等の基盤
  • 安定性評価:モデルの頑健性チェック

🚀 パワフルな特徴: 元データの約63%を含み、37%はOut-of-bagとして独立評価に使用可能!

ブートストラップサンプル
# ブートストラップ作成 bootstrap_samples <- train_data %>% bootstraps(times = 25) print(bootstrap_samples) # 一つのブートストラップサンプル確認 first_boot <- bootstrap_samples$splits[[1]] boot_data <- analysis(first_boot) print(paste("ブートストラップサンプルサイズ:", nrow(boot_data)))

🎲 Monte Carlo クロスバリデーション

Monte Carlo CVは、ランダムな分割を繰り返す手法で、計算効率が良く大規模データセットに適しています。

🌟 いつ・なぜ使うか?

📋 適用シチュエーション
  • 大規模データで計算効率を重視
  • 柔軟な分割比率を設定したい
  • より多くの評価を効率的に実行
  • 統計的変動を詳細に把握したい
🎯 具体的な目的
  • 高速評価:計算時間の大幅短縮
  • カスタム比率:任意のtrain/test比率
  • 並列処理:独立分割による効率化
  • 信頼性向上:多数回評価による安定性

💪 効率性の秘密: K-fold CVと異なり重複なし分割で、大データでも高速実行可能!

Monte Carlo リサンプリング
# Monte Carlo CV mc_cv <- train_data %>% mc_cv(prop = 0.8, times = 20) print(mc_cv) # 繰り返し検証 repeated_cv <- train_data %>% vfold_cv(v = 5, repeats = 3) print("繰り返しCV作成完了")

📊 時系列データ分割

時系列データでは、時間の順序を保持した特別な分割戦略が必要です。rolling_origin()とsliding_window()を使用します。

⏰ いつ・なぜ使うか?

📋 適用シチュエーション
  • 時系列データの予測モデル構築
  • 時間的依存性があるデータ分析
  • 季節性トレンドを考慮
  • 未来予測の精度を正しく評価
🎯 具体的な目的
  • Rolling Forecast:逐次予測評価
  • Walk-forward:リアルタイム環境模擬
  • Temporal Leakage防止:未来情報の遮断
  • Dynamic Model:時間変化への対応

⚠️ 重要な原則: 時系列では絶対に未来のデータを過去の予測に使ってはいけない!

時系列リサンプリング
# 時系列データ作成 ts_data <- tibble( date = seq(as.Date("2020-01-01"), as.Date("2023-12-31"), by = "day"), value = cumsum(rnorm(1461)) ) # Rolling Origin rolling_splits <- ts_data %>% rolling_origin( initial = 365, assess = 30, skip = 30 ) print(rolling_splits)

📊 リサンプリングを用いたモデル評価

作成したリサンプリングオブジェクトを使用して、実際にモデルを評価します。

CV評価の実行
# モデル定義 lm_model <- linear_reg() %>% set_engine("lm") # レシピ定義 basic_recipe <- recipe(y ~ ., data = train_data) # ワークフロー作成 lm_workflow <- workflow() %>% add_model(lm_model) %>% add_recipe(basic_recipe) # CV評価 cv_results <- lm_workflow %>% fit_resamples(cv_folds) print(collect_metrics(cv_results))

✅ バリデーションセット

3分割(train/validation/test)によるモデル開発とパラメータ調整の戦略を学びます。

バリデーション分割
# 3分割作成 val_split <- train_data %>% initial_validation_split(prop = c(0.6, 0.2)) train_set <- training(val_split) validation_set <- validation(val_split) test_set <- testing(val_split) print(paste( "Train:", nrow(train_set), "Validation:", nrow(validation_set), "Test:", nrow(test_set) ))

🛠️ カスタム分割戦略

特殊なデータ構造や要件に対応するための、カスタムリサンプリング戦略を作成します。

カスタム分割の実装
# グループ別分割 grouped_data <- regression_data %>% mutate(group = sample(letters[1:5], n(), replace = TRUE)) # グループCV group_cv <- grouped_data %>% group_vfold_cv(group) print(group_cv) # リーブワンアウト small_data <- regression_data %>% slice_head(n = 50) loo_cv <- small_data %>% loo_cv() print("Leave-one-out CV作成完了")

🎯 まとめ

本章では、rsampleパッケージを使用した様々なリサンプリング戦略を学習しました。

これらの技術により、信頼性の高いモデル評価と汎化性能の推定が可能になります。

前の章
第15章: 高度なデータ可視化統合
次の章
第17章: ハイパーパラメータチューニング