GridSearchCV 最佳超参数不会产生最佳精度
Posted
技术标签:
【中文标题】GridSearchCV 最佳超参数不会产生最佳精度【英文标题】:GridSearchCV best hyperparameters don't produce best accuracy 【发布时间】:2020-10-10 23:27:20 【问题描述】:使用 UCI 人类活动识别数据集,我正在尝试生成一个决策树分类器模型。在默认参数和 random_state 设置为 156 的情况下,模型返回以下精度:
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 数据集没有不平衡,因此数据集偏差应该不是问题。
【问题讨论】:
【参考方案1】:您隐含的假设是,在 CV 中找到的最佳超参数肯定在看不见的测试集上产生最佳结果是错误的。绝对不保证会发生这样的事情。
以这种方式选择超参数背后的逻辑是,考虑到模型拟合时我们手头的(有限)信息,这是我们能做的最好的事情,即这是最理性的选择 .但这里问题的一般背景是不确定性下的决策(决策确实是超参数的选择),在这种情况下,没有任何形式的 性能保证 unseen数据。
请记住,根据定义(并根据基础统计理论),CV 结果不仅会偏向于使用的特定数据集,甚至会偏向于特定的分区以进行训练和验证折叠;换句话说,总是有可能,对相同数据使用不同的 CV 分区,最终会为所涉及的超参数得到不同的“最佳值”——在使用不稳定的分类器时更是如此,例如决策树。
所有这些当然并不意味着这样使用 CV 是无用的,或者我们应该用余生尝试数据的不同 CV 分区,以确保我们拥有“最佳”超参数;它只是意味着 CV 在这里确实是一种有用且合理的启发式方法,但期望任何形式的数学保证,即其结果将在看不见的数据上达到最优是没有根据的。
【讨论】:
啊,我明白了,谢谢。然后,如果我要改进这个模型,我会保持从 GridSearchCV 评估的 max_depth=16 作为我的参数,还是切换到测试集指示的 max_depth=8?还是我会忽略并尝试调整不同的超参数? @JoonChoi 我们实际上并没有使用测试集来调整超参数——事实上,我们在模型拟合期间表现得好像我们根本无法访问测试集。如前所述,我们的想法不是永远继续尝试超参数。在某个时候,我们确定了他们的价值观并继续前进;如果我们有理由在未来重新审视我们的选择,我们会根据需要继续这样做。以上是关于GridSearchCV 最佳超参数不会产生最佳精度的主要内容,如果未能解决你的问题,请参考以下文章
使用最佳参数构建模型时 GridsearchCV 最佳分数下降
在 Python Bagging Classifier 中将最佳网格搜索超参数分配给最终模型