12.7 模型选择后的性能评估
问题描述
评估通过模型选择找到的模型的性能。
解决方案
使用嵌套交叉验证来避免评估偏差:
讨论
嵌套交叉验证对于许多人来说都是一个理解起来有难度的概念。请记住,k折交叉验证会在k-1折数据上训练模型,而使用剩余的数据对该模型进行预测,然后计算模型的预测值与真实值之间的差距,这个过程会重复k次。
在本章描述的模型选择方法中(即GridSearchCV和RandomizedSearchCV),都使用了交叉验证来评估哪些超参数生成了最佳模型。然而,这里有一个细微的且通常未被充分认识到的问题:由于我们使用这些数据来选择最佳超参数,因此就不能再使用它们评估模型的性能了。有解决方法吗?在交叉验证中包含另一个用于模型搜索的交叉验证即可!在嵌套交叉验证中,“内部”交叉验证用于选择最佳模型,而“外部”交叉验证对模型性能进行无偏估计。在本解决方案中,进行内部交叉验证的是GridSearchCV对象,然后使用cross_val_score方法将其封装到外部交叉验证中。
如果你感到困惑,可以做一个简单的实验。首先,设置verbose = 1,这样就可以看到发生了什么:
然后,执行gridsearch.fit(features, target),这就是用于寻找最佳模型的内部交叉验证:
从输出结果可以看到,内部交叉验证对20个候选模型分别训练了5次,共计100个模型。接下来,在新的交叉验证中(默认为3折)嵌套gridsearch:
输出结果显示,内部交叉验证将20个模型训练了5次以找到最佳模型,并且使用外部3折交叉验证评估该模型,总计训练了300个模型。
本书评论