数据集划分——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的更多相关文章
- sklearn数据集划分
sklearn数据集划分方法有如下方法: KFold,GroupKFold,StratifiedKFold,LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,L ...
- 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集
机器学习 数据挖掘 数据集划分 训练集 验证集 测试集 Q:如何将数据集划分为测试数据集和训练数据集? A:three ways: 1.像sklearn一样,提供一个将数据集切分成训练集和测试集的函数 ...
- sklearn中,数据集划分函数 StratifiedShuffleSplit.split() 使用踩坑
在SKLearn中,StratifiedShuffleSplit 类实现了对数据集进行洗牌.分割的功能.但在今晚的实际使用中,发现该类及其方法split()仅能够对二分类样本有效. 一个简单的例子如下 ...
- caffe 训练測试自己的数据集
简单记录一下自己使用caffe的过程和遇到的一些问题. 下载caffe以及安装不具体叙述了. 可參照 http://caffe.berkeleyvision.org/installation.html ...
- Pytorch划分数据集的方法
之前用过sklearn提供的划分数据集的函数,觉得超级方便.但是在使用TensorFlow和Pytorch的时候一直找不到类似的功能,之前搜索的关键字都是"pytorch split dat ...
- sklearn中的数据集的划分
sklearn数据集划分方法有如下方法: KFold,GroupKFold,StratifiedKFold,LeaveOneGroupOut,LeavePGroupsOut,LeaveOneOut,L ...
- 制作新的train,test数据集
之前的数据集的train和test是直接按照网上下载的数据的前7000个作为训练集,后2212个作为测试集.看得出来,这个数据集是由开车录制视频转换来的图片数据,后面2000多个图片的场景和前面的场景 ...
- sklearn数据集的导入及划分
鸢尾花数据集的导入及查看: ①鸢尾花数据集的导入: from sklearn.datasets import load_iris ②查看鸢尾花数据集: iris=load_iris()print(&q ...
- 使用sklearn进行数据挖掘-房价预测(2)—划分测试集
使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...
随机推荐
- AutoFac文档4(转载)
目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 自动装配 从容器中可用 ...
- Windows里配置Apache2.2+PHP5.3+mod_fcgid运行高效的FastCGI模式
日发现win平台的Apache也可以跑FastCGI模式了,就折腾了一会.FastCGI模式是经实践证明了比传统的模块模式运行效率高很多.记录如下: 一.mod_fcgid配置说明 1.首先下载mod ...
- 李洪强iOS经典面试题37-解释垃圾回收的原理
李洪强iOS经典面试题37-解释垃圾回收的原理 问题 我们知道,Android 手机通常使用 Java 来开发,而 Java 是使用垃圾回收这种内存管理方式. 那么,ARC 和垃圾回收对比,有什么 ...
- 【C语言】23-typedef
一.typedef作用简介 * 我们可以使用typedef关键字为各种数据类型定义一个新名字(别名). 1 #include <stdio.h> 2 3 typedef int Integ ...
- mysql学习笔记1---mysql ERROR 1045 (28000): 错误解决办法
mysql ERROR 1045 (28000): 错误解决办法 在启动mysql服务后,登陆mysql的窗口的时候,执行mysql命令,结果报错,没法登陆. (在安装mysql和配置的时候,我是 ...
- [Eth]网络查看命令:route
最近在调试网络,出现问题,两个网口分别接外网内网,结果不同 http://www.cnblogs.com/peida/archive/2013/03/05/2943698.html
- 使用PULL解析XML文件
转载博文1:http://blog.csdn.net/wangkuifeng0118/article/details/7313241 XmlPull和Sax类似,是基于流(stream)操作文件,然后 ...
- doAfterBody()方法是在( )接口中定义的。
A.Tag B.IterationTag C.BodyTag D.TagSupport 解答:B
- 【BZOJ】1630: [Usaco2007 Demo]Ant Counting(裸dp/dp/生成函数)
http://www.lydsy.com/JudgeOnline/problem.php?id=1630 题意,给你n种数,数量为m个,求所有的数组成的集合选长度l-r的个数 后两者待会写.. 裸dp ...
- C语言若干知识点归记
一.C语言指针学习架构 1.基本数据类型---指针 2.字符串---指针 3.数组---指针 4.函数---指针 5.结构体---指针 6.共用体---指针 7.枚举---指针 8.位域---指针 9 ...