-Python- AdaBoost

AdaBoostはアンサンブル学習のブースティングに分類されるアルゴリズムの一つです.AdaBoostの弱仮説器のアルゴリズムは決められていないので,適宜選択する必要があります.
Ada Boostでは,難易度の高いデータを正しく分類できる弱仮説器の分類結果を重視して,弱仮説器に対して重みをつけます.
なお,AdaBoostは,分類精度が高いというメリットがある一方で,学習データのノイズに影響を受けやすいというデメリットがあります.

以前に投稿した手書き数字の画像データを分類する分類器をAdaBoostで作ってみたプログラム例を以下に示します.

 
# Import module
import numpy as np
from sklearn import datasets
from sklearn import tree
from sklearn import metrics
from sklearn import ensemble
 
# load digits data
digits = datasets.load_digits()
 
# Find the positions of 3 and 8 data
flag_3_8 = (digits.target == 3) + (digits.target == 8)
 
# Get 3 and 8 data
images = digits.images[flag_3_8]
labels = digits.target[flag_3_8]
 
# Make data of 3 and 8 one-dimensional
images = images.reshape(images.shape[0], -1)
 
# Generation of classifiers
n_samples = len(flag_3_8[flag_3_8])
train_size = int(n_samples * 3 / 5)
# classifier = tree.DecisionTreeClassifier()
# classifier = ensemble.RandomForestClassifier(n_estimators=20, \
#                                         max_depth=3, criterion="gini")
estimator = tree.DecisionTreeClassifier(max_depth=3)
classifier = ensemble.AdaBoostClassifier(base_estimator=estimator, \
                                        n_estimators=20)
classifier.fit(images[:train_size], labels[:train_size])
 
# Performance calculation of classifier
expected = labels[train_size:]
predicted = classifier.predict(images[train_size:])
 
print('Accuracy: \n',
      metrics.accuracy_score(expected, predicted))
print('\nConfusion matrix: \n',
      metrics.confusion_matrix(expected, predicted))
print('\nPrecision: \n',
      metrics.precision_score(expected, predicted, pos_label=3))
print('\nRecall: \n',
      metrics.recall_score(expected, predicted, pos_label=3))
print('\nF-measure: \n',
      metrics.f1_score(expected, predicted, pos_label=3))
 

上記のプログラム例では,ensemble.AdaBoostClassifier()でAdaBoostの分類器を生成しています(なお,以前のプログラムはコメントアウトしてあります).生成時にはパラメータを指定することが可能です(上記の例ではbase_estimatorn_estimatorsを指定しています).base_estimatorは弱仮説器を指定するパラメータで,ここでは決定木を指定しています(決定木のアルゴリズムを指定するのではなく,決定木の分類器オブジェクトをそのまま指定する点に注意が必要).n_estimatorsは弱仮説器の数で,デフォルトでは50になります(以前の結果-n_estimators=20-と比較するために,ここでは20としています).

実行結果は以下のようになります.

Accuracy: 
 0.9230769230769231
 
Confusion matrix: 
 [[64 11]
 [ 0 68]]
 
Precision: 
 1.0
 
Recall: 
 0.8533333333333334
 
F-measure: 
 0.9208633093525179
 

正答率は92.3%となり,決定木アルゴリズムを使った場合(86.0%)に比べて性能が高くなっていることがわかります(ちなみにRandam Forestの正答率は91.6%).今回の例ではRandam ForestよりもAdaBoostの方が性能が上がっています.