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

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

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

当时我是纯纯的小白,对数据集划分完全没有概念,一个很自然的想法就是拿全量数据跑回测,看资金曲线的年华收益、最大回撤、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的更多相关文章

  1. sklearn数据集划分

    sklearn数据集划分方法有如下方法: KFold,GroupKFold,StratifiedKFold,LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,L ...

  2. 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集

    机器学习 数据挖掘 数据集划分 训练集 验证集 测试集 Q:如何将数据集划分为测试数据集和训练数据集? A:three ways: 1.像sklearn一样,提供一个将数据集切分成训练集和测试集的函数 ...

  3. sklearn中,数据集划分函数 StratifiedShuffleSplit.split() 使用踩坑

    在SKLearn中,StratifiedShuffleSplit 类实现了对数据集进行洗牌.分割的功能.但在今晚的实际使用中,发现该类及其方法split()仅能够对二分类样本有效. 一个简单的例子如下 ...

  4. caffe 训练測试自己的数据集

    简单记录一下自己使用caffe的过程和遇到的一些问题. 下载caffe以及安装不具体叙述了. 可參照 http://caffe.berkeleyvision.org/installation.html ...

  5. Pytorch划分数据集的方法

    之前用过sklearn提供的划分数据集的函数,觉得超级方便.但是在使用TensorFlow和Pytorch的时候一直找不到类似的功能,之前搜索的关键字都是"pytorch split dat ...

  6. sklearn中的数据集的划分

    sklearn数据集划分方法有如下方法: KFold,GroupKFold,StratifiedKFold,LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,L ...

  7. 制作新的train,test数据集

    之前的数据集的train和test是直接按照网上下载的数据的前7000个作为训练集,后2212个作为测试集.看得出来,这个数据集是由开车录制视频转换来的图片数据,后面2000多个图片的场景和前面的场景 ...

  8. sklearn数据集的导入及划分

    鸢尾花数据集的导入及查看: ①鸢尾花数据集的导入: from sklearn.datasets import load_iris ②查看鸢尾花数据集: iris=load_iris()print(&q ...

  9. 使用sklearn进行数据挖掘-房价预测(2)—划分测试集

    使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...

随机推荐

  1. ORID方法在敏捷中的利用

    Objective: 上个迭代有哪些让你印象深刻的事情发生?你看到了什么? Reflective:哪些场景让你兴奋?哪些地方不那么顺利? Interpretive:为什么会不顺利?这些数据使你意识到了 ...

  2. AutoFac文档2(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 Registering ...

  3. mysql 用户自定义变量

    SQL中可以用变量来操作值.那么问题就来了.mysql中怎么定义一个变量呢? 一.定义变量 1.定义变量的语法: set @var_name=expr [,@var_name=expr] ... 2. ...

  4. HotSpot模板解释器目标代码生成过程源码分析

    虽然说解释执行模式是逐字逐句翻译给目标平台运行的,但这样的过程未免太过缓慢,如果能把字节码说的话做成纸条,运行时只要把对应的纸条交给目标平台就可以了,这样,执行速度就会明显提升.JVM的Hotspot ...

  5. libjpeg.a exists or that its path is correct

    Android NDK: ERROR:/cygdrive/e/cocos2d-x/code/cocos2d-2.1rc0-x-2.1.3/HelloTest1/proj.android/../../c ...

  6. Mysql变量声明与使用

    set @today='2017-04-25';set @ydate=DATE_SUB(@today, INTERVAL 7 day);select @today, @ydate; 待续....

  7. VBOX Ubuntu设置与Windows的共享文件夹

    参考资料: http://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html http://zycao.com/virtualbox-ubu ...

  8. Django Model获取指定列的数据

    model一般都是有多个属性的,但是很多时候我们又只需要查询特定的某一个,这个时候可以用到values和values_list 利用values查询 from attendence.models im ...

  9. 算法 quick sort

    // ------------------------------------------------------------------------------------------------- ...

  10. Lua中的table函数库

    table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组 ...