LoginSignup
0
0

More than 3 years have passed since last update.

[機械学習] irisデータセットをSVMで分類しleave-one-out交差検証で分類精度を算出する

Posted at

はじめに

大学院の研究で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だけだったため気になりませんでした.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0