verilog書く人

自称ASIC設計者です。どなたかkaggle一緒に出ましょう。

【機械学習】スタッキングのキホンを勉強したのでそのメモ

そもそもスタッキングとは

 機械学習において、単一の学習器をそのまま使うのではなく、複数の学習器を組み合わせることで、予測エラーを小さくする手法をアンサンブル学習といいます。

アンサンブル(混合学習手法の)には複数の学習器の平均や多数決を取るvoting、構成済の学習器の誤りを反映して次段の弱学習器を形成するboosting、そして初段の学習器の出力結果を次段の入力結果とするstacking(以下スタッキング)とよばれるものがあり、Kaggleなどのデータ分析コンペでは良く使われます。

今回はスタッキングについて勉強したので、それをまとめてみました。

おもにKaggle Ensembling Guide | MLWaveを参照しています。

 

 

スタッキングの手順

まず、教師付き学習が前提となっており、入力データXとその正解データYを用意します。スタッキングではステージ0とステージ1の二段階の学習を行います。

ステージ0の学習器は例えば勾配ブースティングニューラルネット、ランダムフォレスト、K最近傍法のようなもの(要するになんでも!)が使われます。数個のモデルから、コンペでは時には1000以上のモデルが組み合わされることもあります。

 

ステージ1では、回帰問題においては線形回帰、分類問題においてはロジスティック回帰なども選択されますが、勾配ブースティングやランダムフォレストなどより複雑な学習器が使われることもあります。

 

■ステージ0の学習



f:id:segafreder:20160612095249p:plain


まずクロスバリデーションよろしく、トレーニングデータ(正解データY&入力データXの組み合わせ)を複数のfoldに分割します。図ではfold=3。

そして、①そのうちの一つを取り除き、残りのセットを使ってステージ0の学習器を学習させます。そして、②学習に使用していないデータに対して、学習器に予測させることで、ブレンドデータを得ます。
これをすべてのfoldにたいして行うことで、すべての入力データに対するブレンドデータ(つまり、ブレンドデータ[0,1,2])を得ます。

さらに、ステージ0では複数のモデルを選択されますが、全モデルに対して、同様の操作を行います。ブレンドデータ[0,1,2]の次元が増える形となります。

これにより、モデル数*トレーニングデータ数の大きさを持つブレンドデータを得ているはずです。

さらに学習済モデル群[0,1,2]を得ます。 

■ステージ1の学習


正解データとステージ0から得たすべてのブレンドデータを使って、ステージ1の学習器を学習します。

 

f:id:segafreder:20160612095325p:plain

■スタッキングモデルを使った予測


ステージ0の学習済モデル群を使い、テストデータに対する予測(ブレンドテスト[0,1,2])を得ます。

 

f:id:segafreder:20160612095419p:plain


これらブレンドテストの平均値をステージ1の学習器に入力し、最終結果を得ます。平均を取る、というのは参照した記事(Kaggle Ensembling Guide | MLWave)では明確な言及が見当たりませんが、実装(例えば

vertebral/stacked_generalization.py at master · log0/vertebral · GitHub

)をみるとそのようになっています。

 

f:id:segafreder:20160612095456p:plain

この平均化されたブレンドテストデータをステージ1モデルへの入力し、その出力として、テストデータに対する予測を得ます。

 

以上がスタッキングの基礎でした。うーん、結構複雑です。変なところがあればご指摘ください。

 

ながくなっちゃったので、以下に続きます。

気軽に試せるsklearnライクなstackingライブラリも作りました。↓

 

スタッキングのキホン、実践編