きっと続かんブログ

勉強したことや人に言いたいことを書く。

SVMで2値分類を行うテスト

scikit-learnのSVMを使って、数値を2つに分類してみた。データとラベルは次のように。

train_text = np.array([[0],[1.2],[0],[0.8],[1.0],[0.1]])
train_label = np.array(['a','b','a','b','b','b'])  

つまり、0がラベル"a"に、それ以外の数値が"b"に分類されるのが望ましい。
このタスクが簡単なのかどうなのか、データ数少ないけどいけるのか、わからないけど動かしてみる。

プログラム

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split,GridSearchCV

#学習データ
train_text = np.array([[0],[1.2],[0],[0.8],[1.0],[0.1]])
train_label = np.array(['a','b','a','b','b','b'])

#テストデータ
test_text = ([[0],[0.11],[0.3],[1.5],[2.3],[0.5],[0.9]])
test_label = np.array(['a','b','b','b','b','b','b'])

#学習
clf = SVC(verbose=True)
clf.fit(train_text, train_label)

#結果を表示
predicted_labels = clf.predict(test_text)
print('\ntest data: ',test_text)
print('predict  : ',predicted_labels)
print(f'正答率: {clf.score(test_text, test_label)}')

こんな短く書けるなんてちょっとすごい。

結果

*
optimization finished, #iter = 2
obj = -3.422058, rho = 0.386035
nSV = 4, nBSV = 4
Total nSV = 4
[LibSVM]
test data:  [[0], [0.11], [0.3], [1.5], [2.3], [0.5], [0.9]]
predict  :  ['a' 'b' 'b' 'b' 'b' 'b' 'b']
正答率: 1.0

精度も上々。テストデータでは100%だ。
精度が低い場合、グリッドサーチを使ってパラメータを簡単にチューニングできるらしい。