DEVELOPER’s BLOG
技術ブログ
機械学習におけるアンサンブル手法のスタッキングを図説
本記事では、スタッキングの仕組みについて解説します。
この記事を読めば、スタッキングの理解、実装が円滑になると思います。
この記事の対象者
スタッキングの仕組みが分からないけど実装してみたい人
記事の目的
スタッキングのシンプルな仕組みを知り、実装しやすくする。
どういうときにスタッキングが有効なのか、どのようなモデルを組み合わせればよいのかを知る。
※コード実装部分は書いていません!
スタッキングとは
スタッキングとはアンサンブルの手法の一つであり、モデルを積み上げていく方法です。
・クロスバリデーションを用いる
・目的変数の予測結果を特徴量として用いる
・アンサンブル手法でもあり特徴エンジニアリング手法でもある
といった特徴があり、trainデータとtestデータの分布が似ているとき、特に良い精度が出せます。
スタッキングの手順解説
以下がスタッキングの手順です。
- クロスバリデーションでtrainデータとtestデータの目的変数を予測する
- 1の予測をそれぞれの特徴量に追加する
- 1,2を色々なモデルで行う
- 1~2で追加した特徴量も含めて、testデータの目的変数の予測を行う
それでは手順について細かく見ていきましょう。
1. クロスバリデーションでtrainデータとtestデータの目的変数を予測する
クロスバリデーションでtrainデータとtestデータの目的変数をそれぞれ予測します。
①,trainデータを分割(fold1~4)し、分割の内の1つ(青の丸部分)を、それ以外の残りのデータ(オレンジの丸部分)を用いて予測する
②,オレンジ丸部分を用いてtestデータの目的変数(青の長丸)を予測する。
③,①と②を全ての組み合わせで行う
下の図は、①〜③を図にしたもので、クロスバリデーションのやり方です。
※trainデータの方ではtrainデータの目的変数の一部(分割の少数側)を予測するのに対し、testデータの方ではtestデータの目的変数の全体を予測していることに注意してください。
※trainデータの説明変数をtrainX、目的変数をtrainY。testデータの説明変数をtestX、目的変数をtestYとしています。
1枚目:fold2~4を用いて学習させたモデルでfold1のtrainYとtestデータ全体の目的変数を予測
2枚目:fold1,3,4を用いて学習させたモデルでfold2のtrainYとtestデータ全体の目的変数を予測
3枚目:fold1,2,4を用いて学習させたモデルでfold3のtrainYとtestデータ全体の目的変数を予測
4枚目:fold1~3を用いて学習させたモデルでfold4のtrainYとtestデータ全体の目的変数を予測
以上が全ての分割の組み合わせで各目的変数を予測するイメージです。
これでtrainデータとtestデータの目的変数の全体を予測することができました。(下図)
1枚目:クロスバリデーションでtrainデータの目的変数を予測したもの
2枚目:クロスバリデーションでtestデータの目的変数を予測し、4つの予測結果を平均します。
2. 1で行った目的変数の予測結果をそれぞれの特徴量に追加する
見出しの通りですが、下図のように追加します。
3. 1,2を色々なモデルで行う
1,2の作業、つまり、「クロスバリデーション→trainデータ、testデータの目的変数の予測→特徴量に追加」を色々なモデルで行いましょう。
複数のモデル(今回は3つ)で行ってみました。その結果、このような感じで特徴量が増えていきます。
4. 1~3で追加した特徴量を含めて、testデータの目的変数の予測を行う
スタッキングのコツ
ところで、
「どのようなモデルを組み合わせれば良いのだろう?」とか「最後の予測では全ての特徴量を含めたほうがいいの?」とか、疑問に思いませんでしたか?自分が社内のインターン生で勉強会を行った時、これらのような質問が飛んできました。
Q,どのモデルを組み合わせれば良いのですか?
A,ごめんなさいわかりません!後日調べます!
ということで、Kaggle本や様々なネット記事を検索して調べてみました。
結局、確立した方法はみつかりませんでした。色々な組み合わせを試してみて、精度の上がったものを選択するようです。
ただ、スタッキングはアンサンブル手法ですので、汎化性能があがるようにモデルを組み合わせるのが良いです。
例えば、相関の近いモデルどうしを組み合わせても汎化性能は上がりません。モデル同士の相関を調べてみて、組み合わせて実験するのが良いのではないでしょうか。
次の質問です。
Q,最後の予測では元々合った特徴量含めるべき?
A,場合によるのではないでしょうか...?(わかってない)
ということで、同じように調べて考えてみました。
・元々の特徴量を加えた場合
過学習しやすい。同じデータの使われる回数が増え過学習しやすくなります。
その代わり、元々合った特徴量と予測値の関係性を分析することができます。
・加えなかった場合
過学習しづらい。学習時間が短く済む。アンサンブルの目的として、汎化性能を高めることがあるので過学習しづらい点は評価できます。
加えた場合も加えなかった場合も一長一短あるようなので、時間があればどちらも試すのが良いのではないでしょうか。
最後の質問です。
Q,どういうときにスタッキングは使えるの?
A, trainデータとtestデータの分布が似ていれば精度が上がりやすいです。
なので、時系列データの場合は分布が異なる場合が多いので、注意が必要です。
分布が似ているかどうかは、"Adversarial Validation"を使えば判断できます。
まとめ
本記事では、スタッキングの仕組みを図を用いて簡潔に解説しました。
- クロスバリデーションでtrainデータとtestデータの目的変数を予測する
- 1の予測をそれぞれの特徴量に追加する
- 1,2を色々なモデルで行う
- 1~2で追加した特徴量も含めて、testデータの目的変数の予測を行う
以上の手順で実装することができました。
スタッキングの実装は、仕組みを知ってしまえば難しいことではないと思います。
ただし、スタッキングが良い影響をでるかどうか、どのモデルを混ぜるか、など扱うのが難しい手法です。
テクニカルな利用方法はKaggleのnotebookや技術本などで研究する必要がありそうです。
参考文献
門脇大輔・阪田隆司・保坂桂佑・平松雄司(2019)『Kaggleで勝つデータ分析の技術』 技術評論社