多数の中の最良は大半が運
GridSearchCV はグリッド上の各設定を試し、交差検証でスコアを付け、最良のものを残します。金融データでは分割は時間順に進めなければならず、TimeSeriesSplit(5) は過去で学習し、続くブロックで検証することを5回行います。スコアにはAUC(scoring='roc_auc')を使えます。パイプラインでは、設定はステップ名、アンダースコア2つ、パラメータ名で指定します:'logit__C'。探索後、best_params_ が勝者、cv_results_['mean_test_score'] が各グリッド点のスコアを持ち、既定の refit=True では探索オブジェクト自身が、受け取った全データで再学習した最良モデルで予測します。設定が少なくスコアが滑らかなら、最良の検証スコアはわずかな過大評価にとどまります。60列のリターンでは、Cのグリッドは AUC 0.512、0.500、0.504 を与え、見つけるものがないので調整しても何も変わりません。
危険は候補の数とともに大きくなります。真の能力がゼロの n 個のモデルを引くと、検証スコアは標準偏差 σ で平均の周りに散らばり、最良のものは平均より約 σ((1-γ)Φ⁻¹(1-1/n)+γΦ⁻¹(1-1/ne)) 高くなります。γ=0.5772 はオイラー定数、Φ⁻¹ は正規分布の分位点です。60列のうち3列ずつを使う 12 個のランダムなモデルを試すと、最良の検証AUCは 0.523 で、運だけで予測される値は 0.523 です。勝者を学習行で再学習し、見たことのない後半30%の日で採点すると、AUCは 0.478 でコイン以下です。これが勝者の呪いです。防御策は、どの探索も触れない最終ホールドアウト、候補を減らすこと、そして最良スコアのどれだけをこの式がすでに説明するかを冷静に見ることです。
- 時間順に進める:時系列では探索に
TimeSeriesSplitを使い、シャッフルしたフォールドは使わない。 - n 個の最良は、何も効かなくても平均を約 σ Φ⁻¹(1-1/n) 上回る。
- どの探索も触れない最終ホールドアウトを取っておき、検証スコアではなくそのスコアを報告する。
ラボ:採点される内容
- パイプライン5点
- グリッド探索20点
- 検証スコア10点
- 多数の小さなモデル20点
- 運による期待最良値10点
- 勝者の呪い15点
- 研究20点