Я немного поигрался с scikit-learn и хотел воспроизвести оценки перекрестной проверки для одной конкретной комбинации гиперпараметров выполненного поиска по сетке.
Для поиска по сетке я использовал класс GridSearchCV
и для воспроизведения результата для одной конкретной комбинации гиперпараметров я использовал функцию cross_validate
с точно такими же настройками разделения и классификатора.
Моя проблема в том, что я не получаю ожидаемых результатов оценки, которые, насколько я понимаю, должны быть точно такими же, как и те же вычисления, которые выполняются для получения оценок в обоих методах.
Iпостарался исключить любые источники случайности из моего скрипта, исправив использованные сплиты на тренировочных данных.
В следующем фрагменте кода приведен пример указанной проблемы.
import numpy as np
from sklearn.model_selection import cross_validate, StratifiedKFold, GridSearchCV
from sklearn.svm import NuSVC
np.random.seed(2018)
# generate random training features
X = np.random.random((100, 10))
# class labels
y = np.random.randint(2, size=100)
clf = NuSVC(nu=0.4, gamma='auto')
# Compute score for one parameter combination
grid = GridSearchCV(clf,
cv=StratifiedKFold(n_splits=10, random_state=2018),
param_grid={'nu': [0.4]},
scoring=['f1_macro'],
refit=False)
grid.fit(X, y)
print(grid.cv_results_['mean_test_f1_macro'][0])
# Recompute score for exact same input
result = cross_validate(clf,
X,
y,
cv=StratifiedKFold(n_splits=10, random_state=2018),
scoring=['f1_macro'])
print(result['test_f1_macro'].mean())
Выполнение данного фрагмента приводит к выводу:
0.38414468864468865
0.3848840048840049
Я бы ожидал, что эти оценки будут точно такими же, так как они вычисляются в одном и том же разбиении с использованиемте же данные обучения с тем же классификатором.