StratifiedKfold
также имеет часть случайности, когда он определяет индексы для каждого фолда.Следовательно, установка random_state
необходима для получения воспроизводимости.
Вот воспроизводимый пример:
>>> from sklearn import datasets, linear_model
>>> from sklearn.model_selection import cross_val_score, StratifiedKFold
>>> from sklearn.base import clone
>>> import numpy as np
>>> X, y = datasets.load_breast_cancer(return_X_y=True)
model = linear_model.SGDClassifier(random_state=7)
cv2 = StratifiedKFold(5,random_state=0)
scores = cross_val_score(model, X, y, cv=cv2, scoring='accuracy', n_jobs=-1)
print(scores)
model = linear_model.SGDClassifier(random_state=7)
ss=[]
for ti, vi in cv2.split(X, y):
print(str(len(ti))+" "+str(len(vi)))
model = clone(model)
model.fit(X[ti], y[ti])
preds = model.predict(X[vi])
ss.append(np.mean(preds==y[vi]))
print(ss)
Вывод:
[0.91304348 0.70434783 0.45132743 0.38938053 0.38053097]
454 115
454 115
456 113
456 113
456 113
[0.9130434782608695, 0.7043478260869566, 0.45132743362831856, 0.3893805309734513, 0.3805309734513274]