東京に棲む日々

データ分析、統計、ITを勉強中。未だ世に出ず。

Stackingに関して (1)

予測モデルのコンペで使われているStackingという手法に関して。

モデルをEnsembleしまくって、マルチステージモデルにして予測精度を高めるときに使われる手法とのこと。

実務家な私も、業務でマルチステージモデル(2ステージ)を組む必要があったので、そのためのメモ。

kaggleなどで発明され、まだ教科書にはなっていない方法論のようで、以下を参照。

KAGGLE ENSEMBLING GUIDE

 

具体的には以下のような課題(データ)があった。

f:id:High_School_Student:20151228140804j:plain

目的変数y(0,1のBinomial)、説明変数rとXでモデルを作りたい。
rは個々のセールスマンを示すようなカテゴリカルデータで、変量効果として扱いたい。
Xは営業日誌のようなテキストデータから単語抽出して、TF-IDF変換した横長なデータ。

 

混合モデル(Logistic GLMM)を作成したいが、横長なXをそのままロジスティックモデルの変数としてそのまま加えるのは不適切、といった理由で、まずXをRidge回帰によって処理をしてから、その予測値を2段階モデルの説明変数として、rが変量効果となる混合モデルを作成することで対処する。

f:id:High_School_Student:20151228140836j:plain

Ridge回帰に関しては、以下を参照。

highschoolstudent.hatenablog.com

混合モデルに関しては、以下を参照。

highschoolstudent.hatenablog.com

 

マルチステージモデルを組む際、ちゃんとしたStackingの手順を踏まないと予測値が上がらない、と、こういったのに詳しい同僚に言われたので、上の参考文献(KAGGLE ENSEMBLING GUIDE)を参考にしつつ、具体的手順を記してみる。

コアとなる考え方だが、最終モデル(例では2nd Model)以前では、ペアとなっている目的変数をモデルパラメータ推定の際使ってはいけない、と言うことだと思う。

注:文献を読んでの私なりの理解なので、間違ってたり、他にもやり方がある可能性有り

 

f:id:High_School_Student:20151228140911j:plain

データをTrain(学習)データとTest(テスト)データに分ける。

Trainデータをさらに、パラメータ推定のためにいくつかに分ける。図では説明を簡単にするために2つに分けたが、もう少し細かく分割しても良いと思う。
なお、この分割は、モデルの複雑さを決定するためのk分割交差検証のためではない。

 

f:id:High_School_Student:20151228140924j:plain

まず、Trainデータ全体でk分割交差検証法(kは適当な値)などを用い、モデルの複雑さを決定する。今回の例では、Ridge回帰のλ(Complexity Parameter)を決定する。

決定したモデルの複雑さ(λ)を用い、X1とy1でモデル(Mod1)を作成(パラメータを推定)。そのモデルをX2にあてはめ、予測値x2を作成。

決定したモデルの複雑さ(λ)を用い、X2とy2でモデル(Mod2)を作成(パラメータを推定)。そのモデルをX1にあてはめ、予測値x1を作成。

決定したモデルの複雑さ(λ)を用い、X1,X2とy1,y2でモデル(Mod')を作成(パラメータを推定)。そのモデルをTestデータのX'にあてはめ、予測値x'を作成。

予測により作成する各変数(x1、x2、x')は、ペアとなる目的変数(x1はy1、x2はy2、x'はy')を使用してない、と言うことになる。

 

f:id:High_School_Student:20151228141021j:plain

Trainデータにおいて、作成した予測値(x1,x2)と、取っておいたその他の変数(変量効果とするr1,r2)を説明変数、Trainデータの目的変数(y1,y2)を使って、最終モデル(Mod'')を作成する。

これをTestデータの説明変数(r',x')にあてはめ、最終的な予測値(y*)を計算する。

 


では次回、シミュレーションによって作成したサンプルデータでやってみる。