4.1.6
Nested CV
まとめ
- ネスト交差検証はハイパーパラメーター探索と汎化評価を分離する検証手法です。
- 外側・内側のループを構成して過学習を抑える仕組みをコードで確認します。
- 計算コストやデータ量を踏まえた適用場面と注意点を整理します。
- 交差検証 — ネステッド CV は交差検証を二重に組み合わせた手法です
1. 仕組み #
- 外側ループ:データを
K_outer分割し、各分割をテストセットとして保持。 - 内側ループ:残りのデータで
K_innerの交差検証を行い、グリッドサーチやランダムサーチで最適ハイパーパラメーターを選択。 - 評価:選ばれたハイパーパラメーターで再学習し、外側ループのテストセットでスコアを計算。
これを
K_outer回繰り返し、スコアの平均と分散を算出します。
2. Python での実装例 #
| |
cross_val_score にサーチオブジェクトを渡すだけでネステッド CV を実行できます。
3. 利点 #
- ハイパーパラメーター調整のリークを防ぐ:同じデータでチューニングと評価を行うことによる過大評価を防止。
- 複数モデルの公平な比較:モデルごとに最適なハイパーパラメーターを選びつつ、汎化性能を同じ条件で比較できる。
- 分散の推定:外側ループのスコアを用いて性能分散を推定し、信頼区間を計算できる。
4. 注意点 #
計算コストが高い:
K_outer × K_inner回モデルを学習するため、モデルが重い場合は時間がかかる。グリッドサーチの範囲を広げすぎると現実的な時間で終わらない。ランダムサーチやベイズ最適化を検討する。
データサイズが小さい場合は、分割を工夫したり、過剰な CV を避ける。
5. 実務でのヒント #
- 小規模データ:データが少ないほどハイパーパラメーター調整のリークが問題になりやすく、ネステッド CV の価値が高い。
- 主要モデルのみ:全モデルで実施すると時間がかかるため、候補を絞った上でネステッド CV を実行する。
- 報告書への記載:探索範囲や分割数を明記し、過学習リスクを適切に管理したことを示す。
まとめ #
ネステッド交差検証はハイパーパラメーター探索を組み込んだ汎化性能推定法で、過大評価を防げる。
GridSearchCVとcross_val_scoreを組み合わせるだけで実装できるが、計算コストには注意。重要なモデルの最終評価に用い、信頼できる性能指標を報告しよう。
よくある質問 #
通常のCVとNested CVはどう違う? #
通常のCVはハイパーパラメーター探索と汎化性能評価を同じデータで行うため、最適化バイアスが生じます(選ばれたパラメーターがたまたまそのデータに合っているだけかもしれない)。Nested CVは外側ループで性能評価、内側ループでパラメーター探索を分離するため、過楽観的な評価を防げます。
いつNested CVが必要? #
データ量が少なく(数百〜数千件)、複数モデルやハイパーパラメーターを比較したい場合にとくに有効です。大規模データセットやモデル選択の不確実性が低い場合は計算コストが高いため、標準のCVで十分なこともあります。
計算コストを下げるには? #
- 内側ループの分割数を減らす:K_inner=3〜5程度に設定する
- ランダムサーチ:GridSearchCVの代わりにRandomizedSearchCVで探索数を制限する
- 早期停止:XGBoostなど対応するモデルではearly stoppingを使用する
- 並列化:
n_jobs=-1で全CPUコアを使う
Nested CVのスコアが通常CVより大幅に低い場合は? #
過学習が発生している可能性があります。ハイパーパラメーター空間を広げすぎている、または特徴量が多すぎる可能性があります。特徴量選択やより強い正則化を試みてください。差が大きい(例:5%以上)場合は最適化バイアスが強く、Nested CVのスコアがより信頼できる真の性能です。
分割数と交差検証 #
分割数 k を変えると訓練・検証の比率がどう変わるか確認できます。