Python機械学習scikit-learn入門 SVMの学習とクロス・バリデーション (K-fold)

すごく基本的な例

訓練データベクトルxからスカラーyを推定する分類器を作る。k-foldのクロス・ヴァリデーションで成績を見る。

Source code

import numpy as np
from sklearn import cross_validation
from sklearn import datasets
from sklearn import svm
from sklearn.cross_validation import KFold

X = np.array([[0,0,1],[0,3,0],[9,0,3],[1,2,-1],[-4,8,3]])
y = np.array([1,1,1,0,0])
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.25, random_state=0)
kf = KFold(5, n_folds=3)
for train, test in kf:
    X_train, y_train, X_test, y_test = X[train], y[train], X[test], y[test]
    clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    score = clf.score(X_test, y_test)
    print(score)


データ数は五個。3次元ベクトルをスカラーに返す次の関数fを学習させる。データは適当。他のオプションはよく調べてない。あくまでも、とりあえず使ってみただけ。

f([0,0,1]) = 1
f([0,3,0]) = 1
f([9,0,3]) = 1
f([1,2,-1]) = 0
f([-4,8,3]) = 0

学習の際は、yは1だけ、0だけとかダメ。2個以上の値 (クラス) をいれる。そうしないと、
ValueError: The number of classes has to be greater than one; got 1
とクラスが1個しかないと怒られる。

クロス・バリデーション (K-fold)

クロス・バリデーションは手許のデータのうち、いくらかを訓練データ、残りをテストデータにして分類器の精度を見る検証方法。そのうち、k-fold法は、データをk個に分割し、うちk-1個で訓練し、1個でテストする。そのk通りの訓練およびテストを試して、成績の平均値をその分類器のスコアとする。たとえば、5つのデータを3つに分割した次が参考になる。

kf = KFold(5, n_folds=3)
for train, test in kf:
    print(train, test)

これは、

[2 3 4] [0 1] [0 1 4] [2 3] [0 1 2 3] [4]

を返す。この数字は、何番目を訓練データ、テストデ―タとするかの添え字(index)になる。たとえば、

[2 3 4] [0 1]

のときは、

X(train) = np.numpy([9,0,3],[1,2,-1],[-4,8,3])
y(train) = np.numpy([1,0,0])

 と同じことになっている(X, yがどのような数だったか見よ)。また、5つのデータが

 01, 23, 4

 の3つに分割されているとわかる(テストデータを見ると明白)。上記のコードでは、スコアが

 0.0
 0.5
 0.0

 と返ってきたので、成績は平均して16.7%だとわかる。実際、

for train, test in kf:
    X_train, y_train, X_test, y_test = X[train], y[train], X[test], y[test]
    clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
    print(clf.predict(X_test), y_test)


とすると、

[0 0] [1 1]
[1 1] [1 0]
[1] [0]

なので、scoreの正しさを確認できる (ここで、成績はこの2:2:1の加重平均にしなくていいのかという疑問が生じるのだが)。

教師あり学習 | 東京大学グローバル消費インテリジェンス寄附講座
3.1. Cross-validation: evaluating estimator performance — scikit-learn 0.17 documentation

コメント

人気の投稿