Hỏi về K-fold cross validation

cross-validation

#1

Chào mọi người, mình có 1 thắc mắc về K-folds CV. Mình có bài toán như sau: Mình có tổng cộng 12 samples. Mình sử dụng K-folds với cv = 4, vậy mỗi fold mình sẽ có 3 samples. Mình chạy 4 iterations, và ở mỗi iter: 3 fold (=9 samples) cho train và 1 fold (= 3 samples) cho test và so sánh với cross_val_score() function của sklearn. Thắc mắc của mình là tại sao test set của mình có 3 samples mà accuracy của sklearn có thể là 0.5 và 0.75? Mình nghĩ nó chỉ có thể là 0/3, 1/3, 2/3 và 3/3.

Đây là code mình sử dụng:

from sklearn import metrics
#from sklearn import svm
from sklearn.model_selection import KFold, cross_val_score
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

X = np.array([[0.2,0.1],[0.15,0.13],[0.28,0.17],[0.15,0.1],[0.8,0.7], [0.1,0.3],[0.4,0.4],[0.5,0.5],[0.6,0.6],[0.7,0.6],[0.6,0.64],[0.7,0.65]])
y = np.array([1,1,1,1,1,1,2,2,2,2,2,2])

knum = 4
k_fold = KFold(n_splits=knum, shuffle=True)

clf = LinearDiscriminantAnalysis()
#clf = svm.SVC(kernel='linear')
sumR = 0

for train_indices, test_indices in k_fold.split(X):
    print('Train: %s | test: %s' % (train_indices, test_indices))
    clf.fit(X[train_indices],y[train_indices])
    y_pred = clf.predict(X[test_indices])
    print("Accuracy: ",metrics.accuracy_score(y[test_indices], y_pred))
    print("y_test: ", y[test_indices])
    print("y_pred: ", y_pred)
    sumR += metrics.accuracy_score(y[test_indices], y_pred)
    print("------------------------------")

print("1st accuracy = ", sumR/knum)
scores = cross_val_score(clf, X, y, cv=knum, scoring='accuracy')
print("K-fold: ", scores)
print("2nd accuracy: ", scores.mean())

và đây là kết quả khi chạy:

Train: [ 0  1  2  4  5  6  8  9 10] | test: [ 3  7 11]
('Accuracy: ', 1.0)
('y_test: ', array([1, 2, 2]))
('y_pred: ', array([1, 2, 2]))
------------------------------
Train: [ 1  2  3  4  5  6  7  9 11] | test: [ 0  8 10]
('Accuracy: ', 1.0)
('y_test: ', array([1, 2, 2]))
('y_pred: ', array([1, 2, 2]))
------------------------------
Train: [ 0  2  3  4  5  7  8 10 11] | test: [1 6 9]
('Accuracy: ', 0.6666666666666666)
('y_test: ', array([1, 2, 2]))
('y_pred: ', array([1, 1, 2]))
------------------------------
Train: [ 0  1  3  6  7  8  9 10 11] | test: [2 4 5]
('Accuracy: ', 0.3333333333333333)
('y_test: ', array([1, 1, 1]))
('y_pred: ', array([1, 2, 2]))
------------------------------
('1st accuracy = ', 0.75)
('K-fold: ', array([0.75, 1.  , 0.5 , 0.5 ]))
('2nd accuracy: ', 0.6875)

Mình thấy kết quả hợp lí khi sử dụng knum = 2;3 hoặc 6. Cảm ơn mọi người


#2

Mình nghĩ nguyên nhân có thể là: Khi chọn knum= 4, mỗi label mình có 6 samples, 6/4 = 1.5, có thể sklearn đã split (train,test) thành các cặp đôi như sau: (1+1, 2+2), (1+1,2+2),(2+2, 1+1), (2+2,1+1), thành ra kết quả test thu được là [0.75=3/4, 1 = 4/4, 0.5 = 1/2, 0.5 = 1/2]


#3

Bạn nào giúp mình hiểu về Phương pháp k-fold , xin chân thành cảm ơn và hậu tạ


#4

đây bạn. Nhìn phát hiểu luôn image