機械学習

アンサンブル学習とは?バギングとブースティングとスタッキングの違い

ウマたん
ウマたん
当サイト【統計ラボ】の本記事では、アンサンブル学習についてまとめていきます!アンサンブル学習とは機械学習を学ぶ上で非常に重要な考えであり、いくつかのモデルを組み合わせて汎化能力を上げるもの。有名なランダムフォレストやXgboostなどもアンサンブル学習によって生み出されているんです!

こんにちは!

デジタルマーケター兼データサイエンティストのウマたん(@statistics1012)です!

様々な機械学習が登場する中、地味に存在感を強めているのがアンサンブル学習。

アンサンブル学習は、単独では強い手法ではない手法を多数使って精度を上げる方法。

Kaggleなどのデータ解析コンペで用いられることの多い、XGboostLightGBMもアンサンブル学習の1つであるブースティングを用いています。

この記事では、そんなアンサンブル学習について見ていきます。

アンサンブル学習とは

アンサンブル学習とは、単独では精度の高くない弱学習器(決定木などなど)を多数用いることで高い精度をたたき出す手法群です。

※手法として確立されているのは弱学習器をアンサンブルする方法ですが、KaggleなどのデータコンペではCNNやXgboostなど単体で強力な手法を組み合わせることで予測精度を上げる方法が使われます。

アンサンブル学習に関しては「バイアス」と「バリアンス」という概念が関係してきます。

バイアスは、予測値と実測値の差を表します。

バイアスが低ければ低いほど上手く予測出来ているということになります。

一方バリアンスは、予測値のばらつきを表します。

複雑なモデルを組んで様々なデータへフィッティングさせようとすると予測値がばらつきバリアンスは高くなります。

バイアスとバリアンスはトレードオフの関係にあります。

ばらつきのあるデータに対してそれらを上手く当てることが出来ればバイアスは小さくなりますがバリアンスは大きくなることが想像できるでしょう。

一方それほどばらつきのない一定の予測値を返すと、精度は低いのでバイアスは高くなりますがバリアンスは小さくすることが可能です。

ちなみにバイアスが低くてバリアンスが高い状態は過学習に陥っている可能性が高く、未知データに対する予測精度は落ちてしまう可能性があります。

Kaggleなどのコンペでは現状のデータに対する精度で仮順位が決められます。

過学習をしていると仮順位は高いのですが、本番で一気に順位が下がってしまうのです。

過学習には注意しなくてはいけません。

アンサンブル学習は、そんなバイアスとバリアンスを上手く調整する手法群です。

上手くバイアスとバリアンスのバランスを取ることが大事(早口言葉みたい笑)!

アンサンブル学習の種類

さて、アンサンブル学習には大きく分けて3つのタイプ「バギング」「ブースティング」「スタッキング」があります。

その中でも特に有名なバギングとブースティングについて見ていきましょう!

バギング

バギングは、並列的に弱学習器を用いてそれぞれのモデルの総合的な結果を用いるという手法です。

バギングでは、バリアンスをおさえることが可能です。

バギングと決定木を組み合わせたランダムフォレストは以下のようなイメージ

訓練データに対していくつも決定木モデルを作成し、それぞれの結果を集約して最終結果を出力します。

回帰だったら平均値、分類だったら多数決

ランダムフォレストは非常に簡単に実装できる手法であり、それなりに高い精度が見込めるのでオススメです!

ブースティング

バギングは並列でしたが、ブースティングは直列的に弱学習器を用いていきます。

最初の弱学習器で上手く推定できなかった部分を推定するために重みを付けて次の弱学習器で学習を行います。

最終的には、精度の高いモデルに重みを付けて最終的なモデルを作成します。

ブースティングでは、バイアスを低くすることが可能です。

決定木とブースティングを組み合わせた手法がXGboostLightGBMであり、非常に高い精度をたたき出します。

一般的にブースティングの方がバギングより高い精度が見込めますが、学習に時間がかかります。

スタッキング

スタッキングは、Kaggle上位者がよく使うテクニックであり、新たな特徴量を作る方法でもあります。

バギングやブースティングのように確立された手法に取り入れられている方法ではなく、高度な方法になります。

僕自身普段スタッキングは使わないのですが、簡単に説明します。

Step1:いくつかのFold(グループ)にデータを分けて、それぞれを各モデルで予測する(いわゆるクロスバリデーションを色んなモデルでやる)

Step2:それぞれの予測値を新たな特徴量とする

Step3:何回か繰り返して最終アウトプット算出

ある意味、新たな特徴量を作るコトでもあり時間はかかりますが精度向上が見込める可能性は高いです。

アンサンブル学習の注意点

アンサンブル学習を行う上での注意点を最後に挙げておきます。

何でもかんでもアンサンブル学習すれば精度が上がるわけではない

当たり前ですが、なんでもかんでもアンサンブル学習をすれば精度が上がるわけではありません。

基本的には、既に確立されているXgboostやランダムフォレストなどの手法を使えるようになっておけばよいです。

Kaggleでは、複雑なアンサンブル学習を行い多数のモデル構築から最終結果を算出することもありますが、全てXgboostを使っているわけではなくk-近傍法などの単独の推定精度は低いモデルを投入している例もあります。

基本的には、アプローチが違う手法をアンサンブル学習した方が良く、決定木モデル(XgboostやLightgbmやランダムフォレスト)と深層学習(CNN)などを組み合わせるとよいと言われています。

学習に時間がかかる

複雑なアンサンブル学習は実務ではよっぽどのことがない限り行いません。

Kaggleでは精度を少しでも上げることが目的なので、多数のモデルでアンサンブル学習を行いますが実務では精度を上げる労力とそこから得られるビジネスインパクトを天秤にかけた時にやらないことが多いです。

また、精度を上げる上ではアンサンブル学習にこだわるよりも新たな特徴量を作り出した方が良い可能性が高いです。

実務での複雑なアンサンブル学習はコストパフォーマンスの観点からやめておいたほうが良いです。

バリアンスとバイアスのバランスに注意

当たり前ですが、いくらXgboostなどを使ったとしてもデータセットを何も考えず使っていると過学習が起きる可能性があります。

交差検証法(クロスバリデーション)などを行い過学習しないように注意しましょう!

アンサンブル学習 まとめ

アンサンブル学習について見てきました。

アンサンブル学習とは、いわゆる三人寄れば文殊の知恵的な手法です。

ランダムフォレストXGboostLightGBMは非常に高い精度を出力してくれるので良く使います。

是非アンサンブル学習を使ってみましょう!

もっと深く理論について学びたい方は以下のはじめてのパターン認識が読むことをオススメします!

created by Rinker
¥3,300
(2020/06/06 23:03:29時点 Amazon調べ-詳細)

Kaggleで用いられる上位者テクニックのアンサンブル学習について知りたい方は以下の書籍を読んでみることをオススメします!

created by Rinker
¥3,428
(2020/06/06 21:03:37時点 Amazon調べ-詳細)

以下の記事で機械学習手法についてまとめているのでこちらも合わせてチェックしてみてくださいね!

機械学習入門に必要な知識と独学勉強方法をPythonとRの実装と一緒に見ていこう!当サイト【統計ラボ】の本記事では、入門者向けに機械学習についてカンタンにまとめていきます。最終的にはどのように機械学習を学んでいけばよいかも見ていきます。細かい手法の実装もPython/Rを用いておこなっていくので適宜参考にしてみてください。...
Pythonを初学者が最短で習得する勉強法

Pythonを使うと様々なことができます。しかしどんなことをやりたいかという明確な目的がないと勉強は捗りません。

Pythonを習得するためのロードマップをまとめましたのでぜひチェックしてみてくださいね!