Должны ли результаты оценки GridSearchCV быть равными оценке cross_validate с использованием того же ввода? - PullRequest
1 голос
/ 03 июля 2019

Я немного поигрался с 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

Я бы ожидал, что эти оценки будут точно такими же, так как они вычисляются в одном и том же разбиении с использованиемте же данные обучения с тем же классификатором.

1 Ответ

0 голосов
/ 04 июля 2019

Это связано с тем, что mean_test_f1_macro - это не просто среднее значение всех комбинаций сгибов, а среднее значение веса, при этом веса являются размером тестового сгиба.Чтобы узнать больше о фактической реализации, обратитесь к этому ответу.

Теперь, чтобы повторить результат GridSearchCV, попробуйте это!

print('grid search cv result',grid.cv_results_['mean_test_f1_macro'][0])

# grid search cv result 0.38414468864468865

print('simple mean: ', result['test_f1_macro'].mean())

# simple mean:  0.3848840048840049

weights= [len(test) for (_, test) in StratifiedKFold(n_splits=10, random_state=2018).split(X,y)]
print('weighted mean: {}'.format(np.average(result['test_f1_macro'], axis=0, weights=weights)))

# weighted mean: 0.38414468864468865
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...