scikit learn Grid Cross Validation возвращает неверное среднее
Я использовал GridCV для перекрестной проверки через k сгибов, чтобы настроить свои гиперпараметры. Средние результаты, которые должны были быть средними по отдельным сгибам, неверны в моем атрибуте результатов "cv_results_". Ниже приведен мой код для того же:
gscv = GridSearchCV(n_jobs=n_jobs,cv=train_test_iterable, estimator=pipeline, param_grid=param_grid,
verbose=10, scoring=['accuracy', 'precision','recall','f1'], refit='f1',
return_train_score=return_train_score, error_score=error_score,
)
gscv.fit(X,Y)
gscv.cv_results_
Cv_results_ содержит следующий JSON (отображается в виде таблицы)
mean_test_f1 split0_test_f1 split1_test_f1 Actual Mean
0.934310796 0.935603198 0.933665455 0.934634326
0.931279716 0.908430118 0.942689316 0.925559717
0.927683609 0.912005672 0.935512149 0.923758911
0.680908006 0.741198823 0.650802701 0.696000762
0.680908006 0.741198823 0.650802701 0.696000762
0.646005028 0.684483208 0.626791532 0.65563737
0.840273248 0.847484083 0.836672627 0.842078355
0.837160828 0.847484083 0.832006068 0.839745075
0.833637 0.842109375 0.829406448 0.835757911
Вы можете видеть выше: "mean_test_f1" не является средним двух сгибов: "split0_test_f1", "split1_test_f1". Фактическое среднее значение - последний столбец.
Примечание: F1 означает f1-счет.
Кто-нибудь сталкивался с подобными проблемами?
2 ответа
Попробуйте установить iid=False
в GridSearchCV(...)
и сравни.
Согласно документации:
iid : boolean, default=True If True, the data is assumed to be identically distributed across the folds, and the loss minimized is the total loss per sample, and not the mean loss across the folds.
Так когда iid
True (по умолчанию), усреднение результатов теста включает вес, указанный здесь в исходном коде:
_store('test_%s' % scorer_name, test_scores[scorer_name],
splits=True, rank=True,
weights=test_sample_counts if iid else None)
Обратите внимание, что это не влияет на баллы поездов, поэтому также перепроверьте среднее значение баллов поездов.