クロス・バリデーション (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の加重平均にしなくていいのかという疑問が生じるのだが)。