今回は『Kaggleで勝つデータ分析の技術』の第7章、アンサンブルについてです。
遂に最終章、なんとか冬休み中に辿り着くことが出来ました・・・。
以下、第7章の備忘録(メモ、引用)と実装になります。
備忘録
- 分析コンペでは複数のモデルのアンサンブルすることがほとんど(数百個のモデルを組み合わせることもあるが、まずは効果的な特徴量を見付けて単体で高い精度のモデルを作ることを心がける)
- 回帰でのアンサンブル:単に複数のモデルの予測値の平均(算術平均や加重平均など)をとるのがシンプルなアプローチ
タスクやモデルによっては、ハイパーパラメータや特徴量が同じモデルで学習時の乱数シードを変えて平均をとるだけでも精度が上がることがあります。特にニューラルネットは学習ごとの精度がぶれやすいので効果が出やすいです。
- 分類でのアンサンブル:予測値のクラスの多数決をとったり予測確率の平均などを使って分類する
- 評価指標を最適化する場合はアンサンブルの後に最適化をする
- アンサンブルを行う前提であれば、複雑でやや過学習気味のモデルを選ぶ方が良いという意見がある
(多少複雑なモデルにしておいてバイアス(予測値と真値との乖離)を抑え、アンサンブルで複数の予測値を組み合わせることでバリアンス(予測値の不安定性)を抑える戦略)
- スタッキングは効率的かつ効果的に2つ以上のモデルを組み合わせて予測するアンサンブルの手法(特徴量作成の手法とも解釈できる)
→バリデーションデータに対する予測値を特徴量として利用する
原著論文は以下:https://www.sciencedirect.com/science/article/abs/pii/S0893608005800231
- スタッキングにより作成された値は「あるモデルの予測値」という特徴量(「メタ特徴量」と呼ばれる)だと捉えられる。
通常は目的変数を予測するモデルを作るところ、欠損が多い変数の値を予測するモデルや、回帰問題を目的変数の値が0かそうでないかの二値分類問題ととらえ直したモデルを作り、それらの予測値を特徴量にすることもできます。
- スタッキングが効く場合と効かない場合がある
スタッキングは学習データの情報を使いつくそうとする性質があるため、学習データとテストデータが同じ分布で、データ量が多いコンペでは有効です。逆に、時系列データなど学習データとテストデータの分布が異なるコンペでは、スタッキングは学習データに適合しすぎるような印象があり、スタッキングでなくモデルの加重平均によるアンサンブルが用いられることが多いです。
accuracyよりもloglossの方が細かく予測値をチューニングすることによるスコアの向上があるため、スタッキングが有効なようです。特に多クラス分類で評価指標がmulti-class loglossの場合、GBDTとニューラルネットをスタッキングすると大きなスコアの向上がみられることがあります
- 多層のスタッキングを行うこともあるが、徐々にスタッキングによる精度の上り方は弱くなる
- スタッキングでは、バリデーションデータに対する予測値を特徴量として使うが、アーリーストッピングで作成したモデルでは、バリデーションデータに対して学習の進行が最適なところで止まっており、この場合は少しだけ目的変数を知っている予測値になる。テストデータに対してはそうではないので、特徴量が同質になっていないという議論がある(そこまで細かいことは気にしないという意見もある)
- Blending:予測値の加重平均によるアンサンブル。スタッキングではクロスバリデーションの分割ごとに学習させるが、この方法ではhold-outデータを使う。
(データ数が多くク ロスバリデーションを行うための計算量が厳しいケースでは候補になるが、あまり使われない)
- 線形的な関係を良くとらえるモデルと変数間の相互作用を良くとらえるモデルなど、得意な部分が違うモデルを組み合わせることで精度が上がることが期待できる
- アンサンブルでは単体のモデルの精度よりも多様性が重要であり、単体で低い精度のモデルでも、アンサンブルすることで精度改善に寄与する可能性
- 単体で精度が高いモデルであるGBDTとニューラルネットはアンサンブルの初手として良い選択肢
- 効果的なスタッキングのモデル構成例
・2~3つのGBDT(決定木の深さが浅いもの、中くらいのもの、深いもの)
・1~2つのランダムフォレスト(決定木の深さが浅いもの、深いもの)
・1~2つのニューラルネット(1つは層の数が多いもの、1つは少ないもの)
・1つの線形モデル
- スタッキングに含めるモデルの選択にはあまり確立した方法はないらしい
(モデルを作ってスタッキングして、精度が向上すれば残すような単純な方法も選択肢の1つ)
- 過去のコンペソリューションの中には、なぜスタッキングに含まれているかよく分からないモデルもある(すべてを理解する必要はない)
補足:スタッキングのわかりやすい解説
スタッキングについて、Marios Michailidis氏による解説が理解の助けになりました。

以下の動画の5:50~でスタッキングの流れが視覚的にわかりやすく説明されています。
実装
お恥ずかしながら、スタッキングに関して本文とソースコードを読んでもなかなか腑に落ちず、コードを少しずつ実行しながらコメントを沢山書き込み、時間を掛けてようやく理解できました。
(上述の動画を見つけたのはその後。先に調べるべきでした・・・。)
以下のJupyter notebookにその痕跡が残っています・・・もしどなたかの参考になれば幸いです。
さて、何とか冬休み中にKaggle本を終えることができました。
Kaggle本には一般的な機械学習本では学べないようなノウハウやテクニックが沢山載っていて、非常に勉強になりました。Kaggleではないですが、本で仕入れた知識を業務で活かしていきたいと思います。
最後までお付き合い頂きまして、ありがとうございました。
コメント