数据集划分——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进行数据挖掘-房价预 ...
随机推荐
- 动态时间规整-DTW算法
作者:桂. 时间:2017-05-31 16:17:29 链接:http://www.cnblogs.com/xingshansi/p/6924911.html 前言 动态时间规整(Dynamic ...
- mysql误删root用户或者忘记root密码解决方法
解决方法一: 到其他安装了Mysql的服务器(前提是要知道该服务器上Mysql的root用户密 码),打开[Mysql的安装目录/var/mysql],将其中的user.frm.user.MYD.us ...
- java线程同步方法,方法块差别
先说同步方法.它究竟是锁定的当前对象,还是当前类 代码块1 package com.ssss; public class Thread1 implements Runnable { //public ...
- SVN 安装后报不是内部或外部命令
SVN安装后报不是内部或外部命令,也不是可运行的程序 解决方法:windows安装svn的时候默认是不安装 svn command line这个东西的,重新打开svn的安装exe,选择modify,将 ...
- Visual Studio:error MSB8020
状况如下: error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build ...
- 错误:undefined reference to `__gxx_personality_v0'
使用gcc编译C代码,引用了C++ 库,出现这个错误,网上搜到这哥们的文章,解决问题 转自:错误:undefined reference to `__gxx_personality_v0' 1. Li ...
- 实战 Lucene,第 1 部分: 初识 Lucene (zhuan)
http://www.ibm.com/developerworks/cn/Java/j-lo-lucene1/ ******************************************** ...
- Win7-U盘安装出现"We were unable to copy your files. "
使用Windows 7 USB/DVD Download Tool时,提示We were unable to copy your files. Please check your USB device ...
- 知乎日报 API 分析
声明 下面全部 API 均由 知乎(Zhihu.Inc) 提供,本人採取非正常手段获取. 获取与共享之行为或有侵犯知乎权益的嫌疑.若被告知需停止共享与使用.本人会及时删除此页面与整个项目. 请您暸解相 ...
- c#生成方案里预生成拷贝文件
我们在做项目时,可能是多人合作,这样每个人的目录层次级别是不一样的,如果用VS自带的OUTPUT输出目录,改变路径,把DLL集中生成到一个文件夹,那么不同人的机器上结果是不一样的,这就造成了,我这台机 ...