隣り合う行がラベルを共有するとき
日 t のラベルを、日 t の終値から日 t+h の終値までのリターン(h=5)とします。すると日 t と日 t+1 のラベルは5つの日次リターンのうち4つを共有し、ほぼ同じ数値です。日 t を学習に、日 t+1 をテストに入れるK分割では、モデルはテスト対象の答えを見てしまいます。最近傍法のような柔軟なモデルは、覚えているだけで優秀に見えます。漏れの形は正確に決まります。行 i のラベルは行 i+h で初めて分かるので、i+h≥t₀ かつ i≤t₁ のとき、行 i はテストブロック [t₀,t₁] と重なります。
パージは、テストブロックと重なる学習行をすべて取り除きます。エンバーゴは、ブロックの直後のさらにいくつかの行を取り除きます。20日リターンのようなゆっくり動く特徴量が情報を前へ運び続けるからです。scikit-learnの分割器は、(train, test) のインデックス配列を返す split(X) と get_n_splits() を持つ任意のオブジェクトで、cross_val_score や GridSearchCV に cv= として渡せます。SPYの5,340日、4つの低速な特徴量、5日ラベルでは、最近傍モデルのR2はシャッフルしたフォールドで0.039、パージしたフォールドで-0.36です。モデルに能力はなく、シャッフルの数字は漏れが語っているのです。シャッフルしない普通のK分割ははるかに良いですが、4つの境界に120組の重なりが残ります。パージした分割器には1組もありません。
- 重なるラベルは分割の両側にほぼ同じ行を置き、シャッフルK分割は記憶を高く評価してしまう。
- i+h≥t₀ かつ i≤t₁ の行をパージし、t₁ の後の数行をエンバーゴする。
- 分割器は
splitとget_n_splitsだけ。両方を持つ任意のオブジェクトがcv=として使える。
ラボ:採点される内容
- パージとエンバーゴ25点
- 分割器25点
- スコア関数10点
- 重なりの数え上げ15点
- 漏れの研究25点