使用UCI人类活动识别数据集,我试图生成一个DecisionTreeClassifier模型。使用默认参数并将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 1concurrent workers. [Parallel(n_jobs=1)]: Done 35 out of 35 |elapsed: 1.6min finished GridSearchCV Best Score: 0.8513 GridSearchCVBest 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.8558max_depth = 8 Accuracy: 0.8707max_depth = 10 Accuracy: 0.8673max_depth = 12 Accuracy: 0.8646max_depth = 16 Accuracy: 0.8575max_depth = 20 Accuracy: 0.8548max_depth = 24 Accuracy: 0.8548
我理解GridSearchCV的最佳参数是基于交叉验证训练集(X_train, y_train)的平均测试分数得出的,但它不是应该在测试集上也能体现出来吗?我认为UCI数据集不是不平衡的,所以数据集偏见不应该是问题。
回答:
你隐含的假设是,在交叉验证中找到的最佳超参数一定会在未见的测试集上产生最佳结果,这是错误的。绝对没有任何保证会发生这种情况。
选择超参数的逻辑是,在模型拟合时我们手头拥有的(有限)信息下,这是我们能做的最好选择,即它是最理性的选择。但这里的问题总体背景是在不确定性下做出决策(决策确实是选择超参数),在这样的背景下,对于未见数据的任何性能保证都是不存在的。
请记住,根据定义(以及基础的统计理论),CV结果不仅在所使用的数据集上存在偏见,而且甚至在具体的划分到训练和验证折叠上也有偏见;换句话说,总是存在这样的可能性,即在使用同一数据的不同CV划分时,你会得到涉及超参数的不同“最佳值” – 特别是当使用不稳定的分类器,如决策树时,情况可能更为如此。
所有这些当然并不意味着CV的这种使用是无用的,或者我们应该花费余生尝试我们数据的不同CV划分,以确保我们拥有“最佳”超参数;这仅仅意味着CV确实是这里有用且理性的启发式方法,但期望其结果在未见数据上具有任何数学保证是最佳的,是没有根据的。