一文简述如何使用嵌套交叉验证方法处理时序数据

作者:网友投稿 时间:2018-05-30 01:24

字号
人工智能+区块链的发展趋势及应用调研报告

本文讨论了对时序数据使用传统交叉验证的一些缺陷。具体来说,我们解决了以下问题:

在不造成数据泄露的情况下,对时序数据进行分割;

在独立测试集上使用嵌套交叉验证得到误差的无偏估计;

对包含多个时序的数据集进行交叉验证。

一文简述如何使用嵌套交叉验证方法处理时序数据

本文主要针对缺乏如何对包含多个时间序列的数据使用交叉验证的在线信息。

本文有助于任何拥有时间序列数据,尤其是多个独立的时间序列数据的人。这些方法是在医疗研究中被设计用于处理来自多个参与人员的医疗时序数据的。

一、交叉验证

交叉验证(CV)是一项很流行的技术,用于调节超参数,是一种具备鲁棒性的模型性能评价技术。两种最常见的交叉验证方式分别是 k 折交叉验证和 hold-out 交叉验证。

由于文献中术语的不同,本文中我们将明确定义交叉验证步骤。首先,将数据集分割为两个子集:训练集和测试集。如果有需要被调整的参数,我们将训练集分为训练子集和验证集。模型在训练子集上进行训练,在验证集上将误差最小化的参数将最终被选择。最后,模型使用所选的参数在整个训练集上进行训练,并且记录测试集上的误差。

 hold-out 交叉验证的例子

图 1: hold-out 交叉验证的例子

数据被分为训练集和测试集。然后训练集进一步进行分割:一部分用来调整参数(训练子集),另一部分用来验证模型(验证集)。

为什么时序数据的交叉验证会有所不同?

在处理时序数据时,不应该使用传统的交叉验证方法(如 k 折交叉验证),原因有2:

1. 时序依赖

为了避免数据泄露,要特别注意时间序列数据的分割。为了准确地模拟「我们现在所处、预测未来的真实预测环境」(Tashman 2000),预测者必须保留用于拟合模型的事件之后发生的事件的数据。因此,对于时间序列数据而言,我们没有使用 k 折交叉验证,而是使用 hold-out 交叉验证,其中一个数据子集(按照时间顺序分割)被保留下来用于验证模型性能。例如,图 1 中的测试集数据在时间顺序上是位于训练数据之后的。类似地,验证集也在训练集之后。

2. 任意选择测试集

你可能注意到了,图 1 中测试集的选择是相当随意的,这种选择也意味着我们的测试集误差是在独立测试集上不太好的误差估计。为了解决这个问题,我们使用了一种叫做嵌套交叉验证(Nested Cross-Validation)的方法。嵌套交叉验证包含一个用于误差估计的外循环,以及一个用于调参的内循环(如图 2 所示)。内循环所起的作用和之前谈到的一样:训练集被分割成一个训练子集和一个验证集,模型在训练子集上训练,然后选择在验证集上能够使误差最小化的参数。但是,现在我们增加了一个外循环,它将数据集分割成多个不同的训练集和测试集,为了计算模型误差的鲁棒估计,对每一次分割的误差求平均值。这样做是有优势的:

嵌套交叉验证过程可以提供一个几近无偏的真实误差估计。(Varma and Simon 2006)

 嵌套交叉验证示例

图 2: 嵌套交叉验证示例

二、用于时间序列的嵌套交叉验证

我们推荐两种嵌套交叉验证的方法,来处理仅具有一个时间序列的数据。我们也会处理来自一个病人/参与者的多天医疗数据:

预测后一半(Predict Second Half)

日前向链(Day Forward-Chaining)

1. 预测后一半

第一种方法「预测后一半」,这是嵌套交叉验证的「基本情况」,只有一次训练/测试分割。它的优势是这种方法易于实现;然而,它仍然面临着任意选择测试集的局限性。前一半数据(按照时间分割的)作为训练集,后一半数据成为测试集。验证集的大小可以根据给定问题的不同而变化(例如图 3 中的例子用一天的数据作为验证集),但是保证验证集的时间顺序在训练子集后面是非常重要的。

图 3: 预测后一半嵌套交叉验证方法

2. 日前向链(Day Forward-Chaining)

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接