Skip to content

交叉验证之后该做什么?

What To Do After Cross Validation?

让我问你一个问题。但在问之前,我需要借用一下你的想象力。想象我们正在为一组超参数(hyperparameter)进行网格搜索,以找到最优配置。本质上,每一种超参数组合都对应一个交叉验证性能:

ds p133 1

在获得最优超参数后,我们需要敲定一个模型(比如用于生产环境);否则前面这番折腾还有什么意义呢?那么问题来了:在得到最优超参数之后,你会更倾向于怎么做:

  1. 用全部数据(训练集 + 验证集 + 测试集)重新训练模型

ds p133 2

并使用最优超参数?如果这样做,要记住我们已经无法可靠地验证这个新模型了,因为已经没有任何未见数据剩下。

  1. 直接采用基于

ds p134 1

交叉验证性能本身表现最好的模型。如果这样做,要记住我们丢掉了一些重要数据,而这些数据本可以用来训练我们的模型。你会怎么做?

我几乎一直以来的强烈偏好是“用全部数据重新训练一个新模型”。

ds p134 2

当然,也有一些需要考虑的事项,这些是我通过自己构建和部署的模型学到的。话虽如此,在大多数情况下,重新训练是理想的推进方式。让我解释一下。

我们之所以想重新训练一个新模型,是因为某种意义上我们其实已经对交叉验证性能感到满意了,而交叉验证性能本质上是一个 out-of-fold 指标。out-of-fold 数据是模型在训练过程中没有见过的数据,out-of-fold 指标就是模型在那部分数据上的表现。

换言之,我们已经相信模型的表现与我们期望它在未见数据上的表现相符。

ds p135 1

因此,把这部分未见验证集纳入训练数据并重新训练模型,部署后其在未见数据上的表现最有可能没有任何影响(假设并没有突然出现协变量偏移,那是另一回事)。然而,如果我们对交叉验证性能本身并不满意,我们根本就不会去想敲定模型这件事。

ds p135 2

相反,我们会去想通过特征工程、尝试新的超参数、试验不同的模型等方式来改进模型。这个道理在直觉上也说得通。我很难回忆起有哪一次重新训练给整个模型带来了灾难性的后果。142

事实上,我清楚地记得有一次,在我把模型上线的时候(那是在重新训练之后又花了几天时间),团队又收集到了更多带标注的数据。

ds p136 1

当我(只是为了复核)评估模型时,它没有出现任何性能下降。作为额外的好处,这也帮助我确认了在把模型上线时没有犯任何错误。

这里请注意,并非一条必须遵守的规则说你一定要重新训练一个新模型。这个领域本身以及可以解决的任务相当多样,所以在解决手头问题时必须保持开放心态。我不想重新训练新模型的原因之一是:训练模型可能要花上几天甚至几周。

ds p136 2

事实上,即便我们重新训练了一个新模型,在很多业务场景下风险也实在太高了。

因此,部署模型时永远不能掉以轻心、不做重新评估——比如交易欺诈检测。在这种情况下我见过,团队在推进模型上线的同时,数据工程师会并行收集更多数据。在部署之前,团队会在那份数据集上做一些最终检查。新收集的数据随后会被纳入后续的模型改进迭代中。

本站内容仅供学习交流,版权归原作者所有。