-Python- サポートベクターマシン(SVM)

サポートベクターマシンSupport Vector Machine)は分類にも回帰にも使える優れた教師あり学習アルゴリズムです.
サポートベクターマシンの説明として,データを2つに分離する直線をひく例を考えます.データを2分割する線は任意に選ぶことができますが,サポートベクターマシンでは,分割線から,最近傍のサンプルデータまでのマージン(距離の2乗)の和を最大化する直線が最適な分割線と考えます.
サポートベクターマシンは学習データのノイズにも強く,分類性能が非常に高い特徴があります.また,他のアルゴリズムと比べると学習データ数もそれほど多いわけではありません(ただし,分類処理速度は他のアルゴリズムと比べると遅い...).また,基本的には2クラスの分類器となるため,多クラスの分類を行う際には複数のサポートベクターマシン分類器を組み合わせる必要があります.

以前に投稿した,手書き数字の画像データを分類する分類器をサポートベクターマシンに変更します(以前のコードを以下のように変更).

 
# Import module
import numpy as np
from sklearn import datasets
from sklearn import metrics
from sklearn import svm
 
# 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 = svm.SVC(C=1.0, gamma=0.001)
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))

23行目のsvm.SVCサポートベクターマシンの分類器を生成しています.SVCは Support Vector Classifier の略です.生成時にはパラメータを指定することが可能です.上記の例ではc と gamma を指定しています.c はペナルティパラメータで,どの程度のご分類を許容するかを示しています.また,gammaは大きい値を指定すると複雑な分離局面を指定することが可能になります.上記の例ではcは1.01 (デフォルト),gammaは0.001(ほぼ平面)を指定しています.
実行結果は,以下のようになります.

Accuracy: 
 0.9370629370629371
 
Confusion matrix: 
 [[66  9]
 [ 0 68]]
 
Precision: 
 1.0
 
Recall: 
 0.88
 
F-measure: 
 0.9361702127659575

サポートベクターマシンの性能としては,正答率は93.7%隣,分類器の性能は決定木アルゴリズムと比べると非常に高い結果が得られています.

サポートベクターマシンは優れた分類性能を持っているので,精度が要求されるケースに用いられることが多い分類器です.ただし,処理時間を要する傾向があるので,精度よりも処理時間の優先度が高い場合にはRandom Forestのように軽量で高速なアルゴリズムを用いることが多いようです.


サポートベクターマシンは優れた分類性能を持っているので,精度が要求されるケースに用いられることが多い分類器です.ただし,処理時間を要する傾向があるので,精度よりも処理時間の優先度が高い場合にはRandom Forestのように軽量で高速なアルゴリズムを用いることが多いようです.

これまでの投稿で示したように,scikit-learnを使うと機械学習の分類器を簡単に実装することができます.また,分類器の変更も容易なので,アルゴリズムを変更した比較も簡単に試すことが可能です.