機械学習

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

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

こんにちは!

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

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

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

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

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

以下のYoutube動画でも解説しています!

アンサンブル学習とは

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

アンサンブル学習の種類

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

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

バギング

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

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

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

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

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

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

ブースティング

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

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

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

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

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

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

スタッキング

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

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

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

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

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

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

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

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

Feeling bad

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

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

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

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

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

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

学習に時間がかかる

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

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

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

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

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

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

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

アンサンブル学習手法をPythonで実装してみよう!

Coding

それでは最後にアンサンブル学習の手法をPythonで実装してみましょうー!

ここではアンサンブル学習手法の中でも非常に強力なLight gbmを実装していきたいと思います。

国産データコンペNishikaの「中古マンション価格予測」というトレーニングコンペのデータを題材にしていきます。

まずNishikaに会員登録をして中古マンション価格予測のデータから学習データとテストデータをダウンロードしてください(※会員登録をしないとデータをダウンロードできません)。

このデータをローカルのどこかのフォルダに格納し、Light gbmでの分析に移っていきましょう!

コードは以下になります。

globでデータフレームを結合させて、各種カラムのデータを一部前処理しています。

その上でLight gbmを以下の部分で実装しています。

trains = lgb.Dataset(train_x, train_y)
valids = lgb.Dataset(val_x, val_y)

params = {
    "objective": "regression",
    "metrics": "mae"
}

model = lgb.train(params, trains, valid_sets=valids, num_boost_round=1000, early_stopping_rounds=100)

これだけで強力な機械学習手法であるLight gbmを実装することが出来るんです!

このタスクでは評価指標がMAE(平均絶対誤差)であり、結果は

0.0764となりました!

以下の記事で詳しく解説していますのでぜひチェックしてみてください!

Light GBM
LightGBMの仕組みとPythonでの実装を見ていこう!当サイト【スタビジ】の本記事では、最強の機械学習手法「LightGBM」についてまとめていきます。LightGBM の特徴とPythonにおける回帰タスクと分類タスクの実装をしていきます。LightGBMは決定木と勾配ブースティングを組み合わせた手法で、Xgboostよりも計算負荷が軽い手法であり非常によく使われています。...

アンサンブル学習 まとめ

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

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

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

LightGBMを使ったデータ分析については以下のUdemyの講座で詳しく解説していますのでこちらも参考にしてみてください!

【初学者向け】データ分析コンペで楽しみながら学べるPython×データ分析講座

Udemy-course
【オススメ度】
【講師】僕!
【時間】4時間
【レベル】初級~中級

僕自身がUdemyの色んなコースを受けてみた中で、他のコースにはないこんなコースあったらいいなみたいなコースを作ってみました。

このコースは、なかなか勉強する時間がないという方に向けてコンパクトに分かりやすく必要最低限の時間で重要なエッセンスを学び取れるように作成しています。

アニメーションを使った概要編ハンズオン形式で進む実践編に分かれており、概要編ではYoutubeの内容をより体系的にデータ分析・機械学習導入の文脈でまとめています。

データサイエンスの基礎について基本のキから学びつつ、なるべく堅苦しい説明は抜きにしてイメージを掴んでいきます。

統計学・機械学習の基本的な内容を学び各手法の詳細についてもなるべく概念的に分かりやすく理解できるように学んでいきます。

そしてデータ分析の流れについては実務に即したCRISP-DMというフレームワークに沿って体系的に学んでいきます!

データ分析というと機械学習でモデル構築する部分にスポットがあたりがちですが、それ以外の工程についてもしっかりおさえておきましょう!

続いて実践編ではデータコンペの中古マンションのデータを題材にして、実際に手を動かしながら機械学習手法を実装していきます。

ここでは、探索的にデータを見ていきながらデータを加工し、その上でLight gbm という機械学習手法を使ってモデル構築までおこなっていきます。

是非興味のある方は受講してみてください!

Twitterアカウント(@statistics1012)にメンションいただければ最低価格の1200円になる講師クーポンを発行いたします!

\30日間全額返金可能/

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

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

created by Rinker
¥3,300
(2021/09/20 22:05:21時点 Amazon調べ-詳細)

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

created by Rinker
¥3,428
(2021/09/20 20:41:58時点 Amazon調べ-詳細)

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

機械学習
【入門】機械学習のアルゴリズム・手法をPythonとRの実装と一緒に5分で解説!当サイト【スタビジ】の本記事では、入門者向けに機械学習についてカンタンにまとめていきます。最終的にはどのように機械学習を学んでいけばよいかも見ていきます。細かい手法の実装もPython/Rを用いておこなっていくので適宜参考にしてみてください。...
Pythonを初学者が最短で習得する勉強法

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

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