そもそもスタッキングとは
機械学習において、単一の学習器をそのまま使うのではなく、複数の学習器を組み合わせることで、予測エラーを小さくする手法をアンサンブル学習といいます。
アンサンブル(混合学習手法の)には複数の学習器の平均や多数決を取るvoting、構成済の学習器の誤りを反映して次段の弱学習器を形成するboosting、そして初段の学習器の出力結果を次段の入力結果とするstacking(以下スタッキング)とよばれるものがあり、Kaggleなどのデータ分析コンペでは良く使われます。
今回はスタッキングについて勉強したので、それをまとめてみました。
おもにKaggle Ensembling Guide | MLWaveを参照しています。
スタッキングの手順
まず、教師付き学習が前提となっており、入力データXとその正解データYを用意します。スタッキングではステージ0とステージ1の二段階の学習を行います。
ステージ0の学習器は例えば勾配ブースティング、ニューラルネット、ランダムフォレスト、K最近傍法のようなもの(要するになんでも!)が使われます。数個のモデルから、コンペでは時には1000以上のモデルが組み合わされることもあります。
ステージ1では、回帰問題においては線形回帰、分類問題においてはロジスティック回帰がはじめに選択されますが、勾配ブースティングやランダムフォレストより複雑な学習器が使われることもあります。
■ステージ0の学習
まずクロスバリデーションよろしく、トレーニングデータ(正解データY&入力データXの組み合わせ)を複数のfoldに分割します。図ではfold=3。
そして、①そのうちの一つを取り除き、残りのセットを使ってステージ0の学習器を学習させます。そして、②学習に使用していないデータに対して、学習器に予測させることで、ブレンドデータを得ます。
これをすべてのfoldにたいして行うことで、すべての入力データに対するブレンドデータ(つまり、ブレンドデータ[0,1,2])を得ます。
さらに、ステージ0では複数のモデルを選択されますが、全モデルに対して、同様の操作を行います。ブレンドデータ[0,1,2]の次元が増える形となります。
これにより、モデル数*トレーニングデータ数の大きさを持つブレンドデータを得ているはずです。
さらに学習済モデル群[0,1,2]を得ます。
■ステージ1の学習
正解データとステージ0から得たすべてのブレンドデータを使って、ステージ1の学習器を学習します。
■スタッキングモデルを使った予測
ステージ0の学習済モデル群を使い、テストデータに対する予測(ブレンドテスト[0,1,2])を得ます。
これらブレンドテストの平均値をステージ1の学習器に入力し、最終結果を得ます。平均を取る、というのは参照した記事(Kaggle Ensembling Guide | MLWave)では明確な言及が見当たりませんが、実装(例えば
vertebral/stacked_generalization.py at master · log0/vertebral · GitHub
)をみるとそのようになっています。
この平均化されたブレンドテストデータをステージ1モデルへの入力し、その出力として、テストデータに対する予測を得ます。
以上がスタッキングの基礎でした。うーん、結構複雑です。変なところがあればご指摘ください。
ながくなっちゃったので、以下に続きます↓