GridSearch 返回的结果比默认配置差

数据挖掘 机器学习
2022-03-03 21:05:21

我正在使用以下代码进行准确度得分计算。为什么默认配置比 GridSearch 提供更好的结果?

默认配置

clf = svm.SVC(kernel='rbf', gamma='auto')               
clf.fit(x_train, y_train.values.ravel())                

y_train_pred = clf.predict(x_train)             
y_test_pred = clf.predict(x_test)               

print('Train set accuracy: '+'{}'.format(metrics.accuracy_score(y_train, y_train_pred)))                
print('Test set accuracy: '+'{}'.format(metrics.accuracy_score(y_test, y_test_pred)))   

训练集精度:0.861101243339254
测试集精度:0.8480113636363636

网格搜索配置

param_grid = {'C': (0.001, 0.01, 0.1, 1, 10),
              'kernel': ('linear', 'poly', 'rbf', 'sigmoid'),
              'class_weight': ('balanced', None),
              'gamma' : ('scale', 'auto'),
              'shrinking': (True, False)}

grid_search = GridSearchCV(svm.SVC(gamma='scale'), param_grid, cv=5)
grid_results = grid_search.fit(x_train, y_train.values.ravel())

print(grid_results.best_score_)
print(grid_results.best_estimator_)
print(grid_results.best_params_)

0.8373001776198934
SVC(C=1,cache_size=200,class_weight=None,coef0=0.0,decision_function_shape='ovr',degree=3,gamma='auto',kernel='rbf',max_iter=-1,probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False)
{'C': 1, 'class_weight': None, 'gamma': 'auto', 'kernel': 'rbf', 'shrinking': True }

2个回答

从技术上讲:因为网格搜索会重复创建数据的子样本。这意味着 SVC 在每次迭代中都在 80% 的 x_train 上进行训练,结果是对另外 20% 的预测的平均值。

理论上:因为您将超参数调整(选择)和模型性能估计的问题混为一谈。GridSearch 用于选择超参数的组合,性能估计尚未发生。您应该进行的唯一比较是在 CV 本身 ( grid_results.cv_results) 内的参数组合之间进行比较。在我看来,报告的 CV 训练准确度在非 CV 训练的可接受范围内(这意味着您的 SVC 能够从子样本中提取大量泛化)。参见例如Cawley 2010

如果 x_test 与 x_train 分开,那么在重新训练的 estimator 上查看 x_test 上报告的性能grid_results.best_estimator_.predict(x_test)以及它与第一个结果的不同之处将会很有趣。

在重新训练的估计器上报告的 x_test 性能:

y_test_pred_GS = grid_results.best_estimator_.predict(x_test)
print('Accuracy after GridSearch: '+'{}'.format(metrics.accuracy_score(y_test, y_test_pred_GS))) 

GridSearch 后的准确度:0.8480113636363636

因此,我将其解释为默认结果已经足够好,而超参数调整无法使其变得更好。