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

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

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

当时我是纯纯的小白,对数据集划分完全没有概念,一个很自然的想法就是拿全量数据跑回测,看资金曲线的年华收益、最大回撤、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. Redis(十六):集群搭建(手动和自动)

    一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):slave->master ...

  2. node.js 连接 mysql

    var mysql = require("mysql"); var connection = mysql.createConnection({ host: '127.0.0.1', ...

  3. Linux(Ubuntu/Debian/CentOS/RedHat)下交叉编译boost库

    我用的软件版本如下(其他版本编译方法与此完全相同): Boost Ver: 1.55.0Compiler : GNU gcc 4.6 for ARM 1. 确保ARM编译成功安装,并配置好环境变量.2 ...

  4. The difference between Severity and Priority

    The difference between Severity and Priority[1] 2015-06-24 There are two key things in defects of th ...

  5. android布局自适应小示例(用户反馈界面)

    要求: 1.整个界面刚好填满屏幕,不需要滚动 2.输入反馈内容的EditText控件高度能够自适应 3.提交按钮位于屏幕最下方 核心布局文件如下: <?xml version="1.0 ...

  6. WPF集合

    Dependency Property 依赖属性 http://www.cnblogs.com/HelloMyWorld/archive/2013/02/21/2920149.html Attache ...

  7. java 远程调试 remote java application

    1.在本地eclipse中,打开debug configuration,在弹出的窗口中,点击左边的remote java application. 2.在右边的窗口中,输入项目名称.远程主机的地址和端 ...

  8. 基于jQuery左侧小图滚动右侧大图显示代码

    今天给大家分享一款 jQuery左侧小图滚动右侧大图显示代码是一款基于jQuery实现的左侧滚动图片点击大图查看效果代码.该实例适用浏览器:IE8.360.FireFox.Chrome.Safari. ...

  9. phpstrom直接运行和调试php

    最近想学服务器开发,但是没找到免费的虚拟主机,好在有一大把的php主机, 于是决定学php了,但并不准备学网页制作,只是把php作为服务器逻辑处理语言. 下载xampp,打开phpstrom的设置界面 ...

  10. sama5 kio接口控制

    //example #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <str ...