测试准确率得分高于 GridSearchCV 中的最佳得分
The test accuracy score is higher than the best score in GridSearchCV
我正在使用 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)
它returns
Best score: 0.5501906602583355
Test accuracy: 0.5809569840502659
为什么两者的分数不同?据我所知,best_score_
是cv_results_
中mean_test_score
的最大值,但为什么测试准确率分数高于最佳分数?我对此仍然感到困惑。
TLDR:这两个分数指的不是同一组 'test'。一个是查看来自 CV 的 'test' 分数,另一个是来自单独的测试集。
这是因为 CV(交叉验证)是在提供的训练数据上完成的(此处 X_train
和 y_train
)。 best_score
是根据您的 训练 数据在测试折叠中产生的最佳分数。
另一方面,clf.score(X_test, y_test)
为您提供测试集的分数(准确性)。这两者不(通常不会)相等。此测试数据不是您的训练数据的一部分 - 或者至少不应该是。
我正在使用 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)
它returns
Best score: 0.5501906602583355
Test accuracy: 0.5809569840502659
为什么两者的分数不同?据我所知,best_score_
是cv_results_
中mean_test_score
的最大值,但为什么测试准确率分数高于最佳分数?我对此仍然感到困惑。
TLDR:这两个分数指的不是同一组 'test'。一个是查看来自 CV 的 'test' 分数,另一个是来自单独的测试集。
这是因为 CV(交叉验证)是在提供的训练数据上完成的(此处 X_train
和 y_train
)。 best_score
是根据您的 训练 数据在测试折叠中产生的最佳分数。
另一方面,clf.score(X_test, y_test)
为您提供测试集的分数(准确性)。这两者不(通常不会)相等。此测试数据不是您的训练数据的一部分 - 或者至少不应该是。