アンサンブル学習のスタッキング!複数アルゴリズムで精度を向上させる!

こんにちは!
IT企業に勤めて、約2年間でデータサイエンティストになったごぼちゃん(@XB37q)です!

このコラムでは、アンサンブル学習に該当するスタッキングについて紹介しています。
スタッキングとは、バギングやブースティングと並んで、アンサンブル学習に該当する手法です。

アンサンブル学習、バギングやブースティングについては「Kaggleでも使われる!弱学習器を組み合わせるアンサンブル学習」をご覧ください。

スタッキングの学習の流れ

スタッキングとは、効率的かつ効果的に2つ以上のAIモデルを組み合わせて予測する方法です。
スタッキングは、下記の1~4の手順でモデルの学習を行います。

  1. データをクロスバリデーション用のデータへ分割
  2. 学習用データを使用してモデルを学習し、学習モデルでテストデータを予測し、平均などを取ったものをテストデータの特徴量へ
  3. 2をスタッキングしたいモデルの数だけ繰り返す(1層目のモデルを構築)
  4. 2~3で作成した特徴量を使ってモデルの学習と予測を行う(2層目のモデルを構築)

1.データをクロスバリデーション用のデータへ分割

クロスバリデーション用のデータへ分割
クロスバリデーション用のデータへ分割

まず初めに、クロスバリデーションを行うため、データを分割していきます。
今回の例では、データを4分割することとします。

クロスバリデーションについては、「データの分割方法 ~学習用データと検証用データ~」をご覧ください。

2.学習用データを使用してモデルを学習

学習用データを用いてモデル構築
学習用データを用いてモデル構築

学習用データを用いて、モデルを構築します。
つまり、分割データ2 , 分割データ3 , 分割データ4 を用いてモデルを学習し、分割データ1の予測値を出力します。
これを分割データ分、繰り返した後、予測値をもとの順番に並べなおします。
このように予測値を出力することにより、学習データに「1層目のモデルでの予測値」というデータを作成することが可能です。

スタッキングでは、上記のように元の学習データで学習したモデルを1層目のモデル、「1層目のモデルでの予測値」という特徴量を用いて学習したモデルを2層目のモデルと言います。
シンプルなスタッキングでは、2層目のモデルで出力した予測値を最終的な予測値とします。

そのため、2層目のモデルの説明変数を作成するため、1層目のモデルを構築するのです。

3.2をスタッキングしたいモデルの数だけ繰り返す(1層目のモデルを構築)

1層目のモデルを構築
1層目のモデルを構築

アンサンブルで高い効果を出すためには、多様性に富んだAIモデルを組み合わせるのが良いと言われています。
ほとんど同じ予測値を返す AI モデルであれば、アンサンブルをしてもそれほど変化が無いと思われます。

多様性に富んだ AI モデルとは、 AI モデルAは晴れの日の販売量を精度高く予測でき、もう1つの AI モデルBでは雨の日の販売量を精度高く予測できるような AI モデルです。
多様性に富んだ AI モデルを複数組み合わせることにより、アンサンブルで高い効果を発揮することが出来ると思われます。

なお、低い精度であっても性質が異なるモデルの場合、アンサンブルによる精度の改善に寄与することがあります。

GBDTなどの決定木系のAI モデル、ニューラルネット、線形モデル、k近傍法ではそれぞれ予測値の境界が異なるため、弱いところを補完できると考えられます。

4.2~3で作成した特徴量を使ってモデルの学習と予測を行う(2層目のモデルを構築)

2層目のモデルを構築
2層目のモデルを構築

2層目のAIモデルを学習させる場合、説明変数には下記2通りがあります。

  • 1層目のAIモデルの予測値のみを説明変数とする
  • 1層目のAIモデルの元々の説明変数を付加する

前者は学習時間が少なく、過学習が発生しにくいです。
後者は元の説明変数と、AIモデルの予測値の関係性をとらえることが可能です。
また、他にもクラスタリングなどの教師なし学習による特徴量を2層目のAIモデルの特徴量に加えることもあります。

2層目のモデルでの予測値を用いて学習する3層目のAIモデル、3層目のAIモデルでの予測値を用いて学習する4層目のAIモデルのように層を重ねていくことも可能です。
徐々にスタッキングによる精度の上がり方は弱くなっていきますが、それでも多少の効果があることがあります。
また、スタッキングに使用するアルゴリズムをどちらにするか迷った場合など、2層目で複数のアルゴリズムを使用して、3層目でそれらを組み合わせるといったことも可能です。

注意点

スタッキングにおいて注意しなくてはいけないのは、「あるモデルの予測値」という説明変数が、学習用データに対しても検証用データに対しても同じ意味の説明変数とすることです。

スタッキングを行うと、学習用データに対して、「目的変数を知っている」予測値、検証用データに対しては「目的変数を知らない」予測値になってしまう場合があります。
この場合、1層目の予測値を、2層目のモデルでの学習・予測に使用することは危険です。
学習データとテストデータで同じ列に入っている「あるモデルの予測値」という特徴量の意味が全く違うため、学習用データでは精度が高く、テストデータでは精度が低下する可能性があります。

工夫の幅を広げる

スタッキングを「説明変数を作成する」と解釈することにより、モデル構築に対して工夫の幅が広がります。

通常は目的変数を予測するモデルを構築するところ、欠損値が多い変数の値を予測するAIモデルや、回帰問題を目的変数の値が0かそうでないかの2値分類問題と捉えなおしたAIモデルを作り、それらの予測値を特徴量にすることも可能です。

他にも、2層目のAIモデルにスタッキングで作成した特徴量とともに元のデータの特徴量やt-SNEなどの教師なし学習による特徴量を与えることがありますが、そのような考え方も自然に出てきます。

まとめ

  • スタッキング
    • 効率的かつ効果的に2つ以上のAIモデルを組み合わせて予測する方法
    • 多様性に富んだAIモデルを組み合わせることが良い
  • スタッキングの手順
    1. データをクロスバリデーション用のデータへ分割
    2. 学習用データを使用してモデルを学習し、学習モデルでテストデータを予測し、平均などを取ったものをテストデータの特徴量へ
    3. 2をスタッキングしたいモデルの数だけ繰り返す(1層目のモデルを構築)
    4. 2~3で作成した特徴量を使ってモデルの学習と予測を行う(2層目のモデルを構築)
  • 注意点
    • 学習用データに対して、「目的変数を知っている」予測値、検証用データに対しては「目的変数を知らない」予測値になってしまう場合 は危険
  • モデル構築に対する工夫
    • 欠損値が多い変数の値を予測するモデルや、回帰問題を目的変数の値が0かそうでないかの2値分類問題と捉えなおしたモデルを作り、それらの予測値を特徴量にすることも可

参考書籍