Python GridSearchCV最佳超参数don';不能产生最佳精度

Python GridSearchCV最佳超参数don';不能产生最佳精度,python,machine-learning,scikit-learn,decision-tree,grid-search,Python,Machine Learning,Scikit Learn,Decision Tree,Grid Search,使用UCI人类活动识别数据集,我试图生成DecisionTreeClassifier模型。当默认参数和随机_状态设置为156时,模型返回以下精度: dt_clf=DecisionTreeClassifier(随机状态=156) dt_clf.fit(X_系列、y_系列) pred=dt_clf.predict(X_检验) 打印('DecisionTree准确度得分:{0:.4f}'。格式(准确度得分(y检验,pred))) 输出: DecisionTree Accuracy Score: 0.

使用UCI人类活动识别数据集,我试图生成DecisionTreeClassifier模型。当默认参数和随机_状态设置为156时,模型返回以下精度:

dt_clf=DecisionTreeClassifier(随机状态=156)
dt_clf.fit(X_系列、y_系列)
pred=dt_clf.predict(X_检验)
打印('DecisionTree准确度得分:{0:.4f}'。格式(准确度得分(y检验,pred)))
输出:

DecisionTree Accuracy Score: 0.8548
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 = 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
使用任意一组max_depth,我运行GridSearchCV以查找其最佳参数:

params={
“最大深度”:[6,8,10,12,16,20,24]
}
grid_cv=GridSearchCV(dt_clf,param_grid=params,评分='Accurance',cv=5,verbose=1)
网格等速配合(X\U系列、y\U系列)
打印('GridSearchCV最佳分数:{0:.4f}'。格式(grid_cv.Best_分数))
打印('GridSearchCV最佳参数:',grid_cv.Best_Params_)
输出:

DecisionTree Accuracy Score: 0.8548
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 = 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
现在,我想在一个单独的测试集中测试“最佳参数”
max_depth=16
,看看它是否真的是所提供列表中的最佳参数
max_depth=[6,8,10,12,16,20,24]

max_depth=[6,8,10,12,16,20,24]
对于最大深度中的深度:
dt_clf=决策树分类器(最大深度=深度,随机状态=156)
dt_clf.fit(X_系列、y_系列)
pred=dt_clf.predict(X_检验)
准确度=准确度得分(y\U测试,pred)
打印('max_depth={0}精度:{1:.4f}'。格式(深度,精度))
但令我惊讶的是,测试显示“最佳参数”
max_depth=16
几乎是所有参数中最好的:

输出:

DecisionTree Accuracy Score: 0.8548
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 = 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_训练,y_训练)得出的平均测试分数,但它不应该在一定程度上反映在测试集上吗?我假设UCI数据集不是不平衡的,所以数据集偏差不应该是一个问题。

你认为在CV期间找到的最佳超参数肯定会在看不见的测试集上产生最佳结果的隐含假设是错误的。绝对不能保证会发生这样的事情

以这种方式选择超参数背后的逻辑是,考虑到模型拟合时我们手头的(有限)信息,这是我们所能做的最好的选择,也就是说,这是最理性的选择。但这里问题的一般背景是不确定性下的决策(决策实际上是超参数的选择),在这种背景下,对看不见的数据没有任何形式的性能保证

请记住,根据定义(并根据基础统计理论),CV结果不仅偏向于使用的特定数据集,甚至偏向于训练和验证的特定划分;换句话说,始终存在这样一种可能性,即对相同数据使用不同的CV分区,最终将为所涉及的超参数获得不同的“最佳值”——当使用不稳定的分类器(如决策树)时,情况可能更为如此


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

你的隐含假设是,在CV期间找到的最佳超参数肯定会在看不见的测试集上产生最佳结果,这是错误的。绝对不能保证会发生这样的事情

以这种方式选择超参数背后的逻辑是,考虑到模型拟合时我们手头的(有限)信息,这是我们所能做的最好的选择,也就是说,这是最理性的选择。但这里问题的一般背景是不确定性下的决策(决策实际上是超参数的选择),在这种背景下,对看不见的数据没有任何形式的性能保证

请记住,根据定义(并根据基础统计理论),CV结果不仅偏向于使用的特定数据集,甚至偏向于训练和验证的特定划分;换句话说,始终存在这样一种可能性,即对相同数据使用不同的CV分区,最终将为所涉及的超参数获得不同的“最佳值”——当使用不稳定的分类器(如决策树)时,情况可能更为如此


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

啊,我明白了,谢谢。那么,如果我要改进这个模型,我会保持从GridSearchCV计算的max_depth=16作为我的参数,还是按照测试集的指示切换到max_depth=8?或者我会忽略并尝试调整不同的超参数吗?@JoonChoi我们实际上并没有使用测试集来调整超参数-事实上,我们的行为就好像在模型拟合期间根本无法访问测试集一样。如前所述,我们的想法是永远不要继续尝试超参数。在某个时刻,我们确定了他们的价值观,然后继续前进;如果我们将来有理由重新审视我们的选择,我们会根据需要继续这样做。啊,我明白了,谢谢。那么,如果我要改进这个模型,我会保持从GridSearchCV计算的max_depth=16作为我的参数,还是切换到max