Разница в баллах, возвращаемая cross_val_score, и моя индивидуальная реализация кросс-валидированной оценки? - PullRequest
1 голос
/ 20 апреля 2019

Я реализовал свою пользовательскую функцию cross_val_score. Но результаты отличаются от результатов, полученных при использовании склеарна cross_val_score.

modelType = SGDClassifier(random_state=7)

cv2 = StratifiedKFold(5)

scores = cross_val_score(modelType, XTrainSc, yTrain, cv=cv2, scoring='accuracy', n_jobs=-1)
print(scores)


modelType = SGDClassifier(random_state=7)

ss=[]

for ti, vi in cv2.split(XTrainSc, yTrain):
  print(str(len(ti))+" "+str(len(vi)))
  model = clone(modelType)
  model.fit(XTrainSc[ti], yTrain[ti])
  preds = model.predict(XTrainSc[vi])
  ss.append(np.mean(preds==yTrain[vi]))


print(ss)

Здесь scores и ss не равны. Я что-то не так делаю?

1 Ответ

0 голосов
/ 21 апреля 2019

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]
...