#はじめに
大学院の研究でSVM(support vector machine)という教師ありデータ群に対して機械学習で分類を行う手法を扱おうと思っており,折角なので記事にしていきます.また今回はサンプル数がそこまで多くない機械学習を想定しているためleave-one-out交差検証という手法で訓練データとテストデータを分割しようと思います.
#実装環境
・Google Colaboratory
#データセット
使用したのは機械学習入門でよくみるirisデータセットです.サンプル数が150で4つの特徴量(sepal length, sepal width, petal length, petal width)をもち,それぞれに花の種類(setosa, versicolor, virginica)のラベルが付与されているものになります.
#コード
from sklearn import svm
from sklearn.model_selection import LeaveOneOut
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris() # irisデータセットを読み込む
attribute=[] # 初期化
label=[] # 初期化
for x, y in zip(iris.data[], iris.target[]):
data.append(x)
target.append(y)
data = np.array(data) # numpy行列に変換
target = np.array(target) # numpy行列に変換
loo = LeaveOneOut() # LOOCVのインスタンス生成
clf = svm.SVC(gamma="scale") # SVMのインスタンス生成
entire_count = loo.get_n_splits(data) # テスト回数取得
correct_answer_count=0 # 推定が正解だった数初期化
for train_index, test_index in loo.split(data): # loo.split(data)で訓練データとテストデータを分割
data_train, data_test = data[train_index], data[test_index]
target_train, target_test = target[train_index], target[test_index]
clf.fit(data_train, target_train) # 学習させる
result = clf.predict(data_test) # テストデータからラベルを予測する
if result == target_test: # ラベルと元々のラベルが一致していれば+1
correct_answer_count += 1
rate = (float(correct_answer_count) / float(entire_count)) # 正解率を計算
print(str(rate)) # 正解率を出力
出力
0.9666666666666667
#終わりに
コードについてはライブラリをそのまま使えば簡単に実装できますね.推定精度は96.7%となりました.leave-one-out交差検証のデータ全体から一つをテストデータとして,その他全てを学習に用いるという特性上,サンプル数によっては時間がかかってしまうという弱点があるみたいです.しかし,今回はサンプル数が150だけだったため気になりませんでした.