数据集划分——train set, validate set and test set

Posted xxiaolige

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据集划分——train set, validate set and test set相关的知识,希望对你有一定的参考价值。

先扯点闲篇儿,直取干货者,可以点击这里

我曾误打误撞的搞过一年多的量化交易,期间尝试过做价格和涨跌的预测,当时全凭一腔热血,拿到行情数据就迫不及待地开始测试各种算法。

最基本的算法是技术指标类型的,原生的技术指标,改版的技术指标,以技术指标为特征构造机器学习算法,都做过。不论哪种方法,都绕不开一件事——如何使用历史数据验证算法的性能。

当时我是纯纯的小白,对数据集划分完全没有概念,一个很自然的想法就是拿全量数据跑回测,看资金曲线的年华收益、最大回撤、sharpe什么的。那时国内很多量化平台正在蓬勃发展,在知乎、CSDN上大力宣传某某算法的回测曲线多么完美无瑕,收益高、回撤小,看得我满脑子都是发财的幻觉。那时我还没意识到这里的问题,直到我们的账户开始亏钱。

回过头去找原因,猛然看到一个词——过拟合。原来,采用全量数据做回测就是在自欺欺人!

那么,怎么克服过拟合呢?最简单的办法就是把数据分成两部分,train和test,或者说样本内和样本外。train set上做训练,练出了模型,拿到test set上检验一下,看看效果怎么样。这样做还存在两个问题,一是如何把全量数据划分成train set和test set,二是要把训练和检验的过程做多次,该怎么做。

一位量化老兵在知乎live上推荐了一本书,The Evaluation and Optimization of Trading Strategies,这本书里推荐了一个方法,叫做 walk-forward backtest,看似完美的解决了上面两个问题。walk-forward的具体原理网上例子很多,请自行百度。这种方法的本质就是做了很多次的样本内训练+样本外测试,目的是检验模型在样本外的表现有多稳定。嗯嗯嗯,看起来很有道理。

但是,

walk-forward有没有帮助模型克服过拟合呢?

并没有。我们依然在样本内训练时选取最优参数,或者选取最优参数平台的中心点,这样选出的参数必然和样本数据高度吻合,很容易过拟合。而且每次训练得到的最优参数或参数中心点都不同,如何确定最优参数也是棘手的问题。

要尽量克服过拟合,就要在选择模型参数时避开train set,可是test set是不能用来调参的,不然test set就变成train set了,那么该怎么办呢?答案就是加入一个validate set。

 

=============干货从这里开始===============

 

我们使用机器学习算法处理问题时,都会遇到两个问题,一是选哪个模型好,二是如何选择最优的模型参数。为了解决这两个问题,需要对数据集做出划分,如果数据足够多,可行的划分方法是分为三部分:train set, validate set, test set。

用train set做多个模型的初步训练,得到一组模型和在训练集上的最优参数,然后用这些模型在validate set做验证,一边验证一边调整模型参数和复杂度,找到最优模型和对应的最优参数,然后用test set做模型评估,估计出模型的泛化能力。

train validate test三部分数据的比例,一般为50-25-25,采用随机采样即可。

如果觉得这样做还有些不妥,可以把上面的过程重复多次,对比多次的结果,找到最优模型和最优参数。

这种划分三个数据集的方法在大数据场景下十分适合。

如果数据没有那么多,可以采用两种方法:一是 交叉验证的方法,具体可以分为简单交叉验证、S折交叉验证和留一交叉验证,二是自助法,可以作为一个选项,一般不推荐使用。方法的具体内容参见周志华《机器学习》2.2节。

上面提到的方法都缺少了validate set这个数据集,相比于三个数据集,这些方法对模型和参数的选取存在更高的过拟合风险,不过这个风险并非完全由数据的选取引起,主要原因是数据总量太少。

这里还要补充一句,并非划分成三个数据集一定比交叉验证更好,只是加入了validate set,更有可能避免模型和参数的过拟合,尤其是由于复杂度过高引起的过拟合。

 

遗留问题:

关于train validate 和 test的作用,Ripley, B.D 在 Pattern Recognition and Neural Networks中给出了这三个词的定义:

Training set: A set of examples used for learning, which is to fit the parameters [i.e., weights] of the classifier.
Validation set: A set of examples used to tune the parameters [i.e., architecture, not weights] of a classifier, for example to choose the number of hidden units in a neural network.
Test set: A set of examples used only to assess the performance [generalization] of a fully specified classifier.

其中让我比较迷惑的一点是 标红的部分,有些文章以ANN为例,说train set用于确定ANN的权重,validate set用于确定ANN的深度和单层网络的节点数,我暂时还不能其中的逻辑。

周志华老师的书中只是简单的提及了validate set, 原文是:“我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分成训练集和验证集,基于验证集上的性能来进行模型选择和调参。”

我目前对train set和validate set的理解是,train set用来做模型和参数的初步筛选,选定了几个模型和参数后,拿到validate set上做验证和调整,选出最优的一个或多个模型-参数组合,然后用test set做评估,得到评估结果。

 

参考文献:

https://www.cnblogs.com/xfzhang/archive/2013/05/24/3096412.html

http://baijiahao.baidu.com/s?id=1583759543555552397&wfr=spider&for=pc

周志华  《机器学习》



以上是关于数据集划分——train set, validate set and test set的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch+sklearn划分训练集/验证集

sklearn——train_test_split 随机划分训练集和测试集

R语言plotly可视化:使用plotly可视化数据划分后的训练集和测试集使用不同的形状标签表征训练集测试集以及数据集的分类标签(Display training and test split

留出法K折交叉验证留一法进行数据集划分

调参,正则化

AI - MLCC06 - 训练集和测试集 (Training and Test Sets)