GridSearchCV 最好的超参数不会产生最好的精度

GridSearchCV best hyperparameters don't produce best accuracy

使用 UCI Human Activity 识别数据集,我正在尝试生成一个 DecisionTreeClassifier 模型。在默认参数和 random_state 设置为 156 的情况下,模型 returns 的精度如下:

dt_clf = DecisionTreeClassifier(random_state=156)
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
print('DecisionTree Accuracy Score: {0:.4f}'.format(accuracy_score(y_test, pred)))

输出:

DecisionTree Accuracy Score: 0.8548

使用任意一组 max_depth,我 运行 GridSearchCV 找到它的最佳参数:

params = {
    'max_depth': [6, 8, 10, 12, 16, 20, 24]
}
grid_cv = GridSearchCV(dt_clf, param_grid=params, scoring='accuracy', cv=5, verbose=1)
grid_cv.fit(X_train, y_train)
print('GridSearchCV Best Score: {0:.4f}'.format(grid_cv.best_score_))
print('GridSearchCV Best Params:', grid_cv.best_params_)

输出:

Fitting 5 folds for each of 7 candidates, totalling 35 fits
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1
concurrent workers. [Parallel(n_jobs=1)]: Done  35 out of  35 |
elapsed:  1.6min finished GridSearchCV Best Score: 0.8513 GridSearchCV
Best Params: {'max_depth': 16}

现在,我想在单独的测试集上测试“最佳参数”max_depth=16,看看它是否真的是所提供列表中的最佳参数max_depth = [6, 8, 10, 12, 16, 20, 24]

max_depths = [6, 8, 10, 12, 16, 20, 24]
for depth in max_depths:
    dt_clf = DecisionTreeClassifier(max_depth=depth, random_state=156)
    dt_clf.fit(X_train, y_train)
    pred = dt_clf.predict(X_test)
    accuracy = accuracy_score(y_test, pred)
    print('max_depth = {0} Accuracy: {1:.4f}'.format(depth, accuracy))

但令我惊讶的是,测试表明“最佳参数”max_depth=16 离最佳参数还很远:

输出:

max_depth = 6 Accuracy: 0.8558
max_depth = 8 Accuracy: 0.8707
max_depth = 10 Accuracy: 0.8673
max_depth = 12 Accuracy: 0.8646
max_depth = 16 Accuracy: 0.8575
max_depth = 20 Accuracy: 0.8548
max_depth = 24 Accuracy: 0.8548

我知道 GridSearchCV 的最佳参数是基于交叉验证训练集 (X_train, y_train) 得到的平均测试分数,但它不应该仍然反映出来在一定程度上对测试集?我认为 UCI 数据集没有失衡,所以数据集偏差应该不是问题。

您隐含的假设,即在 CV 期间找到的最佳超参数肯定 会在未见过的测试集上产生最佳结果,这是错误的。绝对无法保证会发生类似的事情。

以这种方式选择超参数背后的逻辑是,鉴于模型拟合时手头的(有限)信息,这是我们能做的最好的选择,即这是最理性的选择。但是这里问题的一般背景是不确定性下的决策(决策实际上是超参数的选择),并且在这样的背景下,没有性能保证任何善待看不见的数据。

请记住,根据定义(并根据基础统计理论),CV 结果不仅偏向于所使用的特定数据集,甚至偏向于特定的 分区 训练和验证折叠;换句话说,总是有可能,使用相同数据的不同 CV 分区,您最终会为所涉及的超参数获得不同的“最佳值”——在使用不稳定的分类器时更是如此,例如决策树.

当然,所有这些并不意味着这样使用 CV 是无用的,或者我们应该用我们的余生尝试数据的不同 CV 分区,以确保我们拥有“最好的” “超参数;它只是意味着 CV 在这里确实是一种有用且合理的启发式方法,但是期望任何形式的数学保证其结果在未见数据上是最佳的是没有根据的。