機械学習の精度を向上しようとしたときに、Adaboost(アダブースト)ってよく聞きますよね。Adaboostはパフォーマンス改善に使えることは何となく知っているけれど、どういう仕組みなのか、どうやって使えば良いか気になったことがある人もいるかもしれません。
Adaboostはアンサンブル学習の一種で、決定木やロジスティック回帰、サポートベクターマシン(SVM)といった教師ありの機械学習手法と組み合わせて使えるメタアルゴリズムです。機械学習手法と組み合わせることでパフォーマンスを改善することができるのです。ぜひ、この記事を通してAdaboostを理解して、機械学習モデルのパフォーマンスを改善しましょう。
そこで今回は、Adaboostの仕組みをできるだけわかりやすく紹介します。
AdaBoost(アダブースト)を理解するために知っておきたい「アンサンブル学習」「ブースティング」とは
はじめに、AdaBoostを理解するためにアンサンブル学習とブースティングについて紹介しましょう。アンサンブル学習とは複数の機械学習モデル(弱学習器)を組み合わせて一つの学習モデル(強学習器)を生成する手法のことです。アンサンブル学習は集団学習とも呼ばれています。アンサンブル学習にはブースティングやバギング、スタッキングといった手法があります。
ブースティングはアンサンブル学習の一つで、弱学習器を直列につないで順番に学習する仕組みです。ひとつ前の弱学習器が誤分類したデータの重みを大きくして学習をしていくことで、誤分類したものを優先的に学習できます。AdaBoostはこのブースティングのアルゴリズムの一つになります。
※アンサンブル学習の詳しい解説はこちら
AdaBoost(アダブースト)とは
AdaBoostとは、先ほど紹介したブースティングの手法の一つです。もともと初期のブースティングアルゴリズムにはRobert Schapireが考案したrecursive majority gate formulationとYoav Freundが考案したboost by majorityがありました。しかしこれらのアルゴリズムは学習状況に応じて弱学習器の学習を進めることはできないため、現実の使用に問題がありました。そこで、Yoav FreundとRobert Schapire は1996年にこの問題点を解消するAdaboostを考案したのです。
AdaBoostは前の弱学習器の誤分類に応じてデータの重みを調整して次の弱学習器を生成します。すなわち、これまでのアルゴリズムができなかった適応的な(Adaptive)ブースティングを行えます。適応的にブースティングをすることで、より良いパフォーマンスを得ることができます。AdaBoostはAdaptive Boostingを略して名付けられています。
AdaBoost(アダブースト)のアルゴリズム
それでは、AdaBoostがどういう仕組みになっているか学習アルゴリズムを見ていきましょう。まず、AdaBoostに入力するn個の学習データとn個の正解ラベル、そして各学習データに対応する重みを用意します。重みは1/nで初期化をします。
AdaBoostは弱学習器の学習をT回繰り返し実行します。弱学習器に入力する学習データは重みの確率分布に応じて毎回サンプリングが行われます。弱学習器が誤って予測を行った場合、該当する学習データの重みを増やします。これにより、AdaBoostはより難しい学習データの学習に注力できます。
AdaBoostによる推論は、T個の弱学習器に重要度αを掛け合わせた重み付き多数決により行います。
アンサンブル学習でAdaBoost(アダブースト)を使うメリット
AdaBoostの仕組みがわかったところで、そのメリットとデメリットを確認しましょう。AdaBoostのメリットはやはり精度の低い機械学習モデルを組み合わせて精度の高いモデルを生成できることにあります。これは、複数の弱学習器で弱点を克服しながら繰り返し学習を行うことで実現しています。
更に、AdaBoostはメタアルゴリズムのため、教師あり学習であれば、弱学習器にどのような機械学習モデルも選ぶことができます。メタアルゴリズムとはアルゴリズムのためのアルゴリズムのことで、すなわちAdaBoostは教師あり学習のための学習アルゴリズムなのです。
AdaBoost(アダブースト)を実装する方法
続いて、実際にPythonを使って、AdaBoostの実装方法を見てみましょう。AdaBoostにはscikit-learn(サイキットラーン)と呼ばれる機械学習のオープンソースライブラリを使用します。
>>> from sklearn.tree import DecisionTreeClassifier
>>> x_train = [[0.13, 1.23, … ], [3.01, 2,99, … ], … ] >>> y_train = [0, 1, 1, … ] >>> x_test = [[3.22, 5.13, … ], [4.88, 0,29, … ], … ] >>> y_test = [1, 0, 0, … ] >>> ada = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=None), n_estimators=50)
>>> ada.fit(x_train, y_train)
>>> pred = ada.predict(x_test)
まず、学習データの特徴ベクトルx_trainと学習データのクラス分類y_trainを用意します。同様にテストデータの特徴ベクトルx_testとテスタデータのクラス分類y_testも準備します。
続いてscikit-learnの関数を使用して、AdaBoostの分類器adaを定義します。ここでは、弱学習器base_estimatorには決定木を選びました。そして弱学習器の数n_estimatorsの値も設定します。
次に、定義したadaに学習データを与えて、fitメソッドでモデルを作成します。最後に、predictメソッドでテストデータのクラス分類を予測します。scikit-learnを使用すると非常に簡単にAdaBoostを使用したパターン識別ができます。
AdaBoost(アダブースト)を実装する時の注意点
ここまでAdaBoostの実装方法を見てきましたが、注意点もあります。それは弱学習器の精度が悪すぎると、AdaBoostを使用しても高い精度を実現するのは難しいということです。
このよう場合は、弱学習器のハイパーパラメータのチューニングを試してみましょう。scikit-learnにはGridSearchCVという関数があり、パラメータの探索リストを渡すと全てを試して、最良の値を返してくれます。
>>> from sklearn.tree import DecisionTreeClassifier
>>> from sklearn.model_selection import GridSearchCV
>>> x_train = [[0.13, 1.23, … ], [3.01, 2,99, … ], … ] >>> y_train = [0, 1, 1, … ] >>> x_test = [[3.22, 5.13, … ], [4.88, 0,29, … ], … ] >>> y_test = [1, 0, 0, … ] >>> ada = AdaBoostClassifier(n_estimators=50)
>>> params = {“base_estimator” : [DecisionTreeClassifier(max_depth=x) for x in range(5, 10)],”learning_rate” : [0.25, 1.5, 1.0]}
>>> cv = GridSearchCV(ada, params)
>>> cv.fit(x_train, y_train)
>>> pred = cv.predict(x_test)
ここの例では決定木の最大の木の深さmax_depthとAdaBoostの学習率learning_rateをパラメータとしてGridSearchCVに渡しています。
さて、今回はAdaBoost(アダブースト)についてご紹介しました。AdaBoostについてお伝えした内容は以下です。
- Adaboostはアンサンブル学習の一種で、教師ありの機械学習手法と組み合わせて使えるメタアルゴリズム
- Adaboostは弱学習器を直列につないで適応的に学習をする
- Adaboostは精度の低い弱学習器を組み合わせて精度の高いモデルを生成できる
- Adaboostはノイズや異常値に弱い
- Adaboostはscikit-learnを使用することで簡単に試すことができる
AdaBoostはその後の研究で勾配ブースティングへと進化しています。勾配ブースティングはひとつ前の弱学習器の予測誤差を次の弱学習器が引き継いで小さくしていくアルゴリズムです。勾配ブースティングやAdaBoostはデータ分析コンペのKaggleでもよく使用される手法です。是非AdaBoostについて理解をして身につけましょう。
【お知らせ】
当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。
御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。