Я работаю с KFlold
, используя sklearn версии 0.22. У него есть параметр shuffle
. В соответствии с документацией
shuffle boolean, опционально: следует ли перемешивать данные перед разбиением на партии.
Я провел простое сравнение использования KFold
с shuffle
, установленным на False
(по умолчанию) и True
:
import numpy as np
from sklearn.linear_model import SGDClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import StratifiedKFold, KFold, RepeatedKFold, RepeatedStratifiedKFold
from sklearn import metrics
X, y = load_digits(return_X_y=True)
def run_nfold(X,y, classifier, scorer, cv, n_repeats):
results = []
for n in range(n_repeats):
for train_index, test_index in cv.split(X, y):
x_train, y_train = X[train_index], y[train_index]
x_test, y_test = X[test_index], y[test_index]
classifier.fit(x_train, y_train)
results.append(scorer(y_test, classifier.predict(x_test)))
return results
classifier = SGDClassifier(loss='hinge', penalty='elasticnet', fit_intercept=True)
scorer = metrics.accuracy_score
n_splits = 5
kf = KFold(n_splits=n_splits)
results_kf = run_nfold(X,y, classifier, scorer, kf, 10)
print('KFold mean = ', np.mean(results_kf))
kf_shuffle = KFold(n_splits=n_splits, shuffle=True, random_state = 11)
results_kf_shuffle = run_nfold(X,y, classifier, scorer, kf_shuffle, 10)
print('KFold Shuffled mean = ', np.mean(results_kf_shuffle))
производит
KFold mean = 0.9119255648406066
KFold Shuffled mean = 0.9505304859176724
Использование теста Колмогорова-Смирнова:
print ('Compare KFold with KFold shuffled results')
ks_2samp(results_kf, results_kf_shuffle)
показывает значение по умолчанию без тасования KFold
дает статистически значимые результаты ниже, чем с тасованным KFold
:
Compare KFold with KFold shuffled results
Ks_2sampResult(statistic=0.66, pvalue=1.3182765881237494e-10)
Я не понимаю разницы между результатами тасования и не тасования, почему это так сильно меняет распределение выхода.