🎯 リサンプリングの重要性
リサンプリングは、限られたデータから信頼性の高いモデル評価を行うための統計的手法です。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が一般的。計算コストと精度のバランスを考慮して選択!
cv_folds <- train_data %>%
vfold_cv(v = 10)
print(cv_folds)
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と異なり重複なし分割で、大データでも高速実行可能!
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_splits <- ts_data %>%
rolling_origin(
initial = 365,
assess = 30,
skip = 30
)
print(rolling_splits)
📊 リサンプリングを用いたモデル評価
作成したリサンプリングオブジェクトを使用して、実際にモデルを評価します。
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_results <- lm_workflow %>%
fit_resamples(cv_folds)
print(collect_metrics(cv_results))
✅ バリデーションセット
3分割(train/validation/test)によるモデル開発とパラメータ調整の戦略を学びます。
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))
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パッケージを使用した様々なリサンプリング戦略を学習しました。
- 基本的な訓練・テスト分割の実装
- k-fold クロスバリデーションの活用
- ブートストラップリサンプリングの理解
- Monte Carlo クロスバリデーション
- 時系列データの特殊分割戦略
- バリデーションセットの設計
- カスタム分割戦略の実装
これらの技術により、信頼性の高いモデル評価と汎化性能の推定が可能になります。