スタッキング(stacked generalization)の発想とやり方

最終更新日 2019/07/14

スタッキングと呼ばれる、アンサンブル学習の手法を紹介します。Stacked generalization と呼ばれることもあります。やや複雑な手法ですが、精度が高いモデルを構築することができるため、Kaggle などのデータ分析コンペではよく使われています。

スタッキングの発想

スタッキングとは、あるモデル(1段目のモデル)を使った予測値を特徴量として、さらに別のモデル(2段目のモデル)を作るようなアンサンブル学習の手法です。
スタッキングのイメージ

1段目のモデルは複数あっても構いません。

1段目モデルの結果を使うことで、2段目のモデルはさらに精度の良い予測をしてくれることが多いです。このように、発想自体は難しくありませんが、具体的な手順はやや複雑です。

スタッキングの具体的なやり方

スタッキングの具体的な手順としては、例えば以下の方法が挙げられます。
スタッキングのやり方

【スタッキングによる学習の手順】
1. 訓練データを $N$ 個に分割(以下、$N=3$ として説明)

2. 1段目の学習アルゴリズムを使って、各訓練データの予測値を計算する。具体的には、
・「AとBの訓練データ」を使ってモデルを訓練し、Cの訓練データの予測値cを出力する
・「BとCの訓練データ」を使ってモデルを訓練し、Aの訓練データの予測値aを出力する
・「CとAの訓練データ」を使ってモデルを訓練し、Bの訓練データの予測値bを出力する

3. 「元の特徴量と1段目の学習アルゴリズムによる予測値」を特徴量として、2段目の学習アルゴリズムを使ってモデルを訓練する。(2段目の学習では、特徴量の数が1つ増える)

【スタッキングによる推論の手順】
4. スタッキングでできたモデルでテストデータの推論を行うためには、1段目のアルゴリズムによる予測値が必要になる。そこで、全訓練データを使って1段目の学習アルゴリズムでモデルを作成し、テストデータの推論を行い、1段目のアルゴリズムによる予測値を計算する。

5. 「テストデータにおける元の特徴量と1段目の学習アルゴリズムによる予測値」を使って、推論する。

スタッキングのポイント

上記の手順2で、予測値aを作成する際には、BとCのデータを使っており、Aの正解ラベルは使っていません。
もし、Aの正解ラベルを使って特徴量aを使ってしまうと、2段目の学習で「カンニング」をしてしまうため、過学習を引き起こします。そのため、手順1における訓練データの分割は必須です。

また、1段目のアルゴリズムを $M$ 個使う場合は、手順2と手順4を各アルゴリズムについて行う必要があります。2段目で使う特徴量の数は、$M$ 個増えることになります。

なお、$M$ 個のアルゴリズムはできるだけ多様である方が、最終的にできるモデルの精度が上がりやすいです。例えば「XGBoost と LightGBM」よりも「LightGBM とニューラルネットワーク」の方が良いことが多いです。

スタッキングの欠点と代案

スタッキングは、バギングやブースティングといった手法よりもやや複雑で、実装も少し面倒です。完成したモデルも複雑になりがちです。

実際「精度が高いモデルが欲しいけど、スタッキングするほどではない」という場合もあります。

そこで、スタッキング以外の「混ぜ合わせて精度を上げる」ような以下のテクニックも覚えておくと良いです:
・複数のモデルの単純平均をとる
・複数のモデルの重み付き平均をとる(精度が高いモデルの重みを高くする)
・評価指標がAUCなどの場合は、単純平均ではなく、順位の平均を取る(rank average)
・複数のモデルを作る際には、アルゴリズムが同じでも、ランダムシードを変えて多様なモデルを作る(seed averaging)

次回は 名義尺度、順序尺度、間隔尺度、比率尺度 を解説します。

ページ上部へ戻る