测试准确度分数高于 GridSearchCV 中的最佳分数

Posted

技术标签:

【中文标题】测试准确度分数高于 GridSearchCV 中的最佳分数【英文标题】:The test accuracy score is higher than the best score in GridSearchCV 【发布时间】:2021-10-27 08:49:00 【问题描述】:

我正在使用 GridSearchCV 在我的 SVM 模型中找到最佳超参数。但我对得分有点困惑。这是我的网格搜索代码:

# Train SVM with GridSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

pipe = Pipeline([
    ('scaler', StandardScaler()), 
    ('SVM', SVC(kernel='rbf', decision_function_shape='ovo'))
])

param_grid = 
                'SVM__C': [1, 10, 100, 1000],
                'SVM__gamma': [1, 0.1, 0.01, 0.001]
            

clf = GridSearchCV(pipe, param_grid, scoring='accuracy', verbose = 3, cv=5)
clf.fit(X_train, y_train)

输出:

GridSearchCV(cv=5,
             estimator=Pipeline(steps=[('scaler', StandardScaler()),
                                       ('SVM',
                                        SVC(decision_function_shape='ovo'))]),
             param_grid='SVM__C': [1, 10, 100, 1000],
                         'SVM__gamma': [1, 0.1, 0.01, 0.001],
             scoring='accuracy', verbose=3)

然后我尝试打印最好的分数和测试准确度

print('Best score: ', clf.best_score_)
print('Test Accuracy: ', clf.score(X_test, y_test)

然后它返回

Best score:  0.5501906602583355
Test accuracy:  0.5809569840502659

为什么两者的分数不一样?据我所知,best_score_cv_results_mean_test_score 的最大值,但为什么测试准确度得分高于最佳得分?我仍然对此感到困惑。

【问题讨论】:

【参考方案1】:

TLDR:这两个分数不是指同一个“测试”集。一个是查看 CV 中的“测试”分数,另一个是来自单独的测试集。

这是因为 CV(交叉验证)是在提供的训练数据(此处为 X_trainy_train)上完成的。 best_score 是您的训练数据在测试折叠中产生的最佳分数。

另一方面,clf.score(X_test, y_test) 会为您提供测试集的分数(准确度)。这两者不(并且通常不会)相等。此测试数据不是您的训练数据的一部分 - 或者至少不应该是。

【讨论】:

以上是关于测试准确度分数高于 GridSearchCV 中的最佳分数的主要内容,如果未能解决你的问题,请参考以下文章

我在修改玩具 scikit-learn gridsearchCV 示例时收到警告“用户警告:一个或多个测试分数是非限定的”

GridsearchCV 不检查所有拆分 [关闭]

适合 GridSearchCV

随机森林分类器

GridSearchCV 是不是存储所有参数组合的所有分数?

Solr:准确匹配的得分高于部分匹配