Kaggle Tutorial

平均・加重平均・ランク平均・blending

最も手軽なアンサンブルである各種平均と blending の使い分けと、重みの決め方を学びます。

単純平均#

最もシンプルなアンサンブルは、複数モデルの予測の単純平均です。実装が容易で過学習しにくいのが利点です。

import numpy as np

pred = (pred_lgbm + pred_xgb + pred_linear) / 3

加重平均#

モデルの強さに応じて重みを変えます。重みは 交差検証OOF 予測で決めると過学習しにくくなります。

# OOF でスコアが最大になる重みを探索(簡易グリッド)
best = None
for w1 in np.linspace(0, 1, 21):
    for w2 in np.linspace(0, 1 - w1, 21):
        w3 = 1 - w1 - w2
        blend = w1 * oof_lgbm + w2 * oof_xgb + w3 * oof_linear
        score = roc_auc_score(y, blend)
        if best is None or score > best[0]:
            best = (score, (w1, w2, w3))

注意

重みは必ず OOF(検証側) で最適化します。テストの Public LB を見ながら重みを合わせ込むと、 LB へ過学習してシェイクアップを招きます。

ランク平均#

評価指標が AUC のように順位で決まる場合、確率の平均より順位の平均が有効なことがあります。 スケールの異なるモデル出力をそろえる効果もあります。

from scipy.stats import rankdata

rank = (rankdata(pred_lgbm) + rankdata(pred_xgb)) / 2

blending とは#

ここまでの「予測値を後段で混ぜる」手法を総称して ブレンディング と呼びます。 学習済みモデルの出力だけを使うため手軽で、コンペ終盤の定番です。

ヒント

まずは単純平均から試し、OOF で改善するなら加重・ランク平均へ。指標が順位ベースなら ランク平均、確率の質が重要なら確率平均、と評価指標に合わせて選びます。

理解度チェック#

Quizブレンドの重みはどこで最適化すべき?

次のステップ#

次は、より強力な stacking(out-of-fold 予測をメタモデルで統合)を学びます。