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%だ。
精度が低い場合、グリッドサーチを使ってパラメータを簡単にチューニングできるらしい。