テクノロジー

【実践までできる】AdaBoostでクラス分類・回帰を行う方法

【実践までできる】AdaBoostでクラス分類・回帰を行う方法

最近では、空港での本人認証やGoogleの検索のアルゴリズムなど様々な場面でAI(人工知能)は利用されていますよね。そんなAI(人工知能)を自分で開発したい!機械学習を始めたい!という方が増えつつあります。

しかし、いざ機械学習を始めようとしても、データを多く用意しないといけないし、色んな変数を調整する必要があります。そんなときに非常に強力な味方になってくれるのがAdaBoost(アダブースト)。AdaBoostは設定するべきパラメータが非常に少なく、比較的少ないデータでも導入できます。そんなAdaBoost(アダブースト)はどのような仕組みで、どうやって実装すれば良いのでしょうか。

そこで今回は、AdaBoost(アダブースト)とは何かという基本的な情報から、実装の方法まで幅広くご紹介します。ぜひ、この記事でAdaBoostの使い方をマスターして機械学習を始めてみましょう。

AdaBoost(アダブースト)とは

アダブーストのイメージ

AdaBoostは、弱識別器を利用し、学習を直列に行うブースティングアルゴリズムの代表的なモデルです。ブースティングはアンサンブル学習の一つで、弱識別機(正解率が50%よりは高い識別機)を組み合わせて、高性能な識別器を作ります。まさに三人寄れば文殊の知恵と言えるでしょう。

AdaBoostの仕組みとしては、複数の弱識別機をつなげて学習を直列に行い、直前の識別機の出力結果から学習を進めるようになっていますます。その弱学習機をまとめて、一つの機械学習モデルとして予測を行います。ポイントは、各弱識別器の学習で、直前の弱識別器がうまく学習できなかったものを優先的に学習するということです。それによって、弱点を補いあうことができ結果的に学習機を強くできるでしょう。

※AdaBoostはこちらでも解説しています

ここで、イメージがつきやすいようにアルゴリズムを使って具体的な説明をしましょう。A~Eのメロンか、スイカの画像を準備しメロンの場合+1、スイカの場合―1と判定するタスクを準備します。

最初にA~Eのデータに重みを均等に設定します。そして、入力データに対して、分類を行います。正答率に応じて弱識別機の信頼度を算出します。そして、弱識別機がAとBとCに対して正解して、DとEを間違えた場合、次の学習の際にDとEが重点的に学習されるように重みを増加させます。この工程をN回繰り返して学習を行います。

そして識別する際は、弱識別機がN個でき出来上がります。その弱識別機に対して、信頼度×出力データ(+1かー1か)のN個の和で予測するアルゴリズムが完成しました。

なぜAdaBoostが生まれたのか

理由のイメージ

それでは、なぜAdaBoostが生まれたのでしょうか。AdaBoostが生まれた理由は、弱識別機(正解率が50%よりは高い識別機)を組み合わせて、高性能な識別器を作るという思想を実現するためです。

1988年、KearnsとVaziraniという人物がが弱学習アルゴリズムを任意の高い予測精度を持つ強い学習アルゴリズムに変換できるのか、という問題を提起しました。つまり、弱識別機(正解率が50%よりは高い識別機)を組み合わせて、高性能な識別器を作るという思想と同様ですよね。そして1990年、Schapireはこの問題を肯定的に解決し、このようなメタアルゴリズムとしてboostingと定義しました。

この後、Shapireによるrecursive majority gate formulationやFreundによるboost by majorityが具体的なboosting meta-algorithmとして提案されました。しかし、弱学習器の誤分類率の上限を事前に推定する必要があるため、実際に利用することは困難でした。

そして、1995年、FreundとShapireはこの問題を解決するAdaBoostを提案しました。AdaBoostは”adaptive boosting”の略で”adaptive”は未知パラメータの設定が必要ないため、初めて実用に耐えうる boostingのアルゴリズムが誕生しました。

AdaBoostでクラス分類を行う方法

クラス分類のイメージ
AdaBoostのクラス分類は、scikit-learn(サイキットラーン)というライブラリを利用すると容易に実装できます。そこでIRISデータセットを用いて、がくの長さ、がくの幅、花弁の長さ、花弁の幅を用いて、アヤメの種類を分類するタスクを例にご紹介します。

まずは、必要なライブラリをインポートします。

from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import metrics

AdaBoostを利用してクラス分類を行うためのAdaBoostClassifier、データセットを利用するためのdatasets、学習データと検証データを分割するtrain_test_split、モデルの評価を行うmetricsをscikit-learnからインポートします。

そして、irisデータをロードして、説明変数と目的変数を宣言し、学習データと検証データに分割します。

iris= load_iris()
X = iris.data #がくの長さ、がくの幅、花弁の長さ、花弁の幅を説明変数とする
Y = iris.target #アヤメの種類を目的変数とする
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

AdaBoostのモデルを定義します。n_estimatorsは学習機の数、learning_rateは、デフォルトで1を設定しておきます。

abc = AdaBoostClassifier(n_estimators=50, learning_rate=1)
model = abc.fit(X_train, y_train)
y_pred = model.predict(X_test)

最後に、どれくらいの精度でAdaBoostが予測できていたかを確認します。

print(“正解率:”,metrics.accuracy_score(y_test, y_pred))

というコードを実行すると精度が算出されます。

今回は、irisデータセットで説明をしましたが、XとYの部分を変更することで様々なデータにおいてクラス分類を実装できますので、ぜひ試してみましょう。

AdaBoostで回帰分析を行う方法

回帰分析のイメージ

AdaBoostの回帰分析は、クラス分類同様scikit-learnというライブラリを利用すると容易に実装できます。ボストンデータセットを用いて、部屋の広さや数、犯罪率など13項目を用いて、住宅価格を回帰分析するタスクを例にご紹介します。

まずは、必要なライブラリをインポートします。

from sklearn.ensemble import AdaBoostRegressor
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import metrics

AdaBoostを利用して回帰分析を行うためのAdaBoostRegressor、データセットを利用するためのdatasets、学習データと検証データを分割するtrain_test_split、モデルの評価を行うmetricsをscikit-learnからインポートします。

そして、bostonデータをロードして、説明変数と目的変数を宣言し、学習データと検証データに分割します。

boston= load_boston()
X = boston.data #部屋の広さや数、犯罪率など13項目説明変数とする
Y = boston.target #住宅価格を目的変数とする
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

AdaBoostのモデルを定義します。n_estimatorsは学習機の数、learning_rateは、デフォルトで1を設定しておきます。

abc = AdaBoostRegressor(n_estimators=50, learning_rate=1)
model = abc.fit(X_train, y_train)
y_pred = model.predict(X_test)

最後に、どれくらいの精度でAdaBoostが予測できていたかを確認します。

print(“正解率:”,metrics. mean_squared_error (y_test, y_pred))

というコードを実行すると誤差が算出されます。

AdaBoostをスムーズに行うポイント

ポイントのイメージ

AdaBoostは、過学習を起こしやすい、外れ値に弱いという特徴があります。そのため、過学習をできるだけ起こさないような分析および、外れ値に対する対策を取ることが非常に重要です。

過学習をできるだけ起こさないような分析する

AdaBoostは、比較的精度もよく、設定するべきパラメータも少ないため非常に便利な一方で過学習を起こしやすいという特徴があります。過学習とは学習データに適合しすぎて、汎化性能を失うことです。

過学習をできるだけ起こさないために、データ数を増やすということを検討しましょう。また、交差検証などを用いることで、データ数が少なくても過学習をできるだけ起こさないように工夫するのも大切です。

外れ値に対する対策をとる

AdaBoostの特徴としては、精度がよいのですが並列に学習を行うことができません。そのため、学習に時間がかかること、過学習を起こしやすく外れ値に弱い傾向があります。

外れ値とは、データの中で1つだけ全く見当違いな値になっているデータのことです。AdaBoostは、外れ値が含まれるデータですと力を十分に発揮できません。そのため、いかにデータの前処理で外れ値を除外することができるかがポイントになります。データの分布を確認して外れ値がないかを確認しましょう。

このように、AdaBoostに限らず機械学習を行う際は、データを事前に統計的に分析をして外れ値を分析から除去するとよいでしょう。

まとめ
さて、今回はAdaBoostの理論と実装についてご紹介しました。今回お伝えしたかった内容は以下となります。

  • AdaBoostは、弱識別器を利用し、学習を直列に行うブースティングアルゴリズムの代表的なモデルである
  • AdaBoostは”adaptive boosting”の略で、事前には未知パラメータの設定する必要があったboostingの問題を解決するために生まれた
  • AdaBoostは、クラス分類、回帰分析ともにscikit-learnというライブラリを利用することで容易に実装できる
  • AdaBoostをスムーズに行うポイントは、過学習をできるだけ起こさないように多量のデータで実験する、もしくは交差検証を行う、外れ値は分析をするときは除外する

昨今話題の機械学習の中でも、AdaBoostはクラス分類、回帰分析も非常に手軽に行うことができます。皆さんも、AdaBoostを使って機械学習をしましょう!

【お知らせ】

当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。

御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。

お多福ラボコーポレートサイトへのバナー

トップへ戻る
タイトルとURLをコピーしました