scikit-learnのSVMでクロスバリデーション
scikit-learnのSVMでクロスバリデーションするサンプルです。5-foldの場合。
StratifiedKFoldに正解ラベルを渡すと、クラスのサイズを考慮した分割になるようです。
(データは適当です。)
import numpy as np
from sklearn import cross_validation
from sklearn import svm
from sklearn.cross_validation import StratifiedKFold
X = np.array([[-3,-2],
[-1,0],
[-4,2],
[3,1],
[4,-1],
[-1,0],
[-2,-5],
[3,5],
[10,1],
[0,1]])
y = np.array([0,0,0,1,1,0,0,1,1,1])
skf = StratifiedKFold(y, 5)
for train, test in skf:
print "training data indices", train
print "test data indices", test
clf = svm.SVC(kernel='linear', C=1)
clf.fit(X[train], y[train])
predict = clf.predict(X[test])
print "prediction", predict
print "ground truth", y[test]
print "accuracy", (predict == y[test]).sum() / float(predict.size)
print "----"