stacking — out-of-fold 予測とメタモデル
OOF 予測を特徴量としてメタモデルで統合する stacking の仕組みと、正しい組み方を学びます。
stacking とは#
スタッキングは、複数モデル(ベースモデル)の予測を入力特徴量として、 別のモデル(メタモデル)に学習させて統合する手法です。 加重平均より柔軟に、モデル間の関係を学習できます。
ベースモデル群 → 各 OOF 予測 → それを特徴量にメタモデルを学習 → 最終予測鍵は out-of-fold 予測#
メタモデルの学習データは、ベースモデルの OOF(out-of-fold)予測で作ります。 各サンプルの予測は、そのサンプルを含まない fold で学習したモデルから得るため、リークしません。
import numpy as np
from sklearn.model_selection import StratifiedKFold
def make_oof(model_fn, X, y, X_test, n_splits=5):
oof = np.zeros(len(X))
test_pred = np.zeros(len(X_test))
skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)
for tr, va in skf.split(X, y):
model = model_fn()
model.fit(X[tr], y[tr])
oof[va] = model.predict_proba(X[va])[:, 1] # 検証側 = OOF
test_pred += model.predict_proba(X_test)[:, 1] / n_splits
return oof, test_predメタモデルの学習#
各ベースモデルの OOF を列に並べ、メタモデル(よく使うのは単純な線形/ロジスティック回帰)を学習します。
oof_lgbm, test_lgbm = make_oof(make_lgbm, X, y, X_test)
oof_xgb, test_xgb = make_oof(make_xgb, X, y, X_test)
meta_X = np.column_stack([oof_lgbm, oof_xgb]) # メタ特徴量
meta_test = np.column_stack([test_lgbm, test_xgb])
from sklearn.linear_model import LogisticRegression
meta = LogisticRegression().fit(meta_X, y)
final = meta.predict_proba(meta_test)[:, 1]注意
メタモデルにベースモデルの 訓練データへの予測(in-fold) を使うと、強烈なデータリークになります。 必ず OOF を使い、メタモデルの評価も交差検証で行います。
ヒント
メタモデルは複雑にしすぎないのが定石です。線形モデルやリッジが安定し、過学習を抑えられます。
理解度チェック#
次のステップ#
次は、stacking を多段にする際の注意点とリーク防止を学びます。