エスティメータの約束事
scikit-learnのモデルはどれもひとつの約束事に従い、だからこそモデルを入れ替え、連結し、調整できます。__init__ は受け取ったパラメータを同じ名前で保存するだけで、検査も計算もしません。これで get_params、set_params、clone が動きます。fit(X, y) はデータから学び、学んだものを末尾がアンダースコアの属性(coef_、intercept_、n_features_in_)に保存して self を返すので、呼び出しをつなげられます。predict(X) はまず check_is_fitted を呼び(fit 未実行なら NotFittedError)、check_array で X を検証してから学んだものを適用します。パラメータ処理のために BaseEstimator を、無料の score メソッドのために RegressorMixin を継承します(ミックスインを先に置く)。
このラボのモデルはリッジ回帰です。中心化したデータで (XᵀX+αI) w=Xᵀy を解き、切片は ȳ-x̄·w です。α が大きいほど係数はゼロに縮みます。ノイズの多いラグ付きリターンを特徴量にするときの良い習慣です。クラスが約束事を守っているので、make_pipeline(StandardScaler(), ShrinkageRegressor())、cross_val_score、GridSearchCV がそのまま使え、clone(model) は未学習の新しいコピーを返します。この最後の点はウォークフォワード評価で重要です。各学習期間ではモデル自身でなくクローンを学習させないと、ある分割の情報が次へ漏れます。リターン予測のスコアは、テスト行での予測と結果のスピアマン順位相関、つまり情報係数です。
- 入力はパラメータ、出力は学習済み属性:
__init__は保存し、fitは末尾が_の名前に学習結果を入れてselfを返す。 - 予測の前に検査する:
check_is_fittedとcheck_arrayはパイプラインや利用者が期待する標準のエラーを出す。 - クローンを学習させる:ウォークフォワードのループでは
clone(model).fit(...)が各分割を独立に保つ。
ラボ:採点される内容
- ラグ付き特徴量10点
- 正規方程式によるリッジ15点
- コンストラクタ10点
- 学習と予測20点
- PipelineとGridSearchCVでの利用10点
- ウォークフォワードの順位相関15点
- SPYの過去は翌日を予測するか20点