PLUS会员

量化机器学习系列分享(五)树模型与组合模型

由bq2qbou2创建,最终由small_q 被浏览 84 用户

nan1. 决策树模型

1.1 决策树模型的概念

决策树是机器学习中的一个典型的非参数模型,它使用规则,而不是参数,来定义模型

  • 这种决策方式其实是和人类最直接的思考方式是类似的
  • 例如,我们使用身高这一特征,去预测性别这一标签的时候,一个比较直觉的方式是,如果身高大于 175 就分类为男生,如果身高小于 175 就分类为女生

以下是一个典型的决策树模型:使用三个特征:X1,X2,X3;预测一个标签 Y

  • 图中的圆圈和方框叫做节点:
    • 最上面的,依靠X1进行分类的,叫做根节点
    • 其他圆圈,叫做中间节点
    • 最下面的方框,叫做叶节点
  • 节点和节点之间的连线就组成了决策路径,例如
    • 红色决策路径是,如果一个个体,X1小于5,并且X2大于3的话,它的Y我就预测为1
    • 蓝色决策路径是,如果一个个体,X1大于5,并且X3不等于2,并且X2大于1的话,它的Y我就预测为0

在这个例子中,我们可以观察到树模型的两个特点:

  1. 树模型本质上是将我的样本进行分组,例如,红色路径,其实就是将X1小于5,并且X2大于3,的所有个体分为一组,这一组中的所有个体标签我都预测为1
  2. 一个特征节点,在树模型中是可以出现不止一次的,例如X2这一特征节点,在树模型中就出现了两次

1.2 树模型分组的预测特征是如何决定的

在上面这个例子中,红色路径的分组是,将X1小于5,并且X2大于3,的所有个体分为一组,并且这一组中的所有个体标签都预测为1

那么为什么这一组的标签被分为了1,而不是0呢

其实这就是一个简单的少数服从多数的原理

  • 我们的样本中X1小于5,并且X2大于3,的个体有很多个
  • 如果这一组中,标签为1的个体数量,大于标签为0的个体数量,那么这个组就听多数的,整个组的标签都预测为1了

1.3 树模型的训练

树模型的训练过程,其实就是不断拓展节点的过程,在拓展一个新的节点时,主要有两个需要考量的点:

  • 在某一个节点上,选择哪个特征进行分组,例如,三个特征X1,X2,X3,在这个节点上,用哪个去分组
  • 选择的这个特征,分组临界值是多少,例如,我选择了X2了,那么X2的分组临界值是多少,是小于5和大于5这样分两组,还是小于6和大于6这样分两组

基于这两个考量,一个树模型的训练过程为:

  • 从根节点出发,选择一个特征和一个临界值进行分组,选择的依据是模型表现可以提高
  • 分完之后,就形成了两个小组,对于这两个小组来说,选择一个特征和一个临界值进行分组,选择的依据是模型表现可以提高
  • 分完之后,就形成了四个小组,对于这四个小组来说,选择一个特征和一个临界值进行分组,选择的依据是模型表现可以提高
  • 。。。
  • 一直进行这个过程,直到某些停止条件满足,一般是设置一个总路径数的上限,或者是模型的表现无法再提高(如果在某个小组中,发现,不论怎么再分,模型的表现都无法提高了,那么这个分支就停止了,如果所有的小组都满足这个条件的话,那么模型的训练当然也停止了)

模型的表现有以下几种衡量方式:

1.4 树模型防止过拟合的方法

通常用来防止树模型过拟合的方法,其实就是控制树的大小和复杂程度,这个过程有一个很玄幻的名称,叫做”剪枝“

具体来说,在代码层面,我们可以进行的剪枝操作有以下几种:

  • 树的最大深度:限制树的深度可以避免决策树在训练数据上过度生长
  • 分割内部节点所需的最小样本数:如果一个节点的样本数少于这个值,则不会继续分割
  • 叶节点上的最小样本数:这个值限制了叶节点必须有的最小样本数量,避免模型在训练数据上过度拟合
  • 最大叶节点数:通过限制决策树的叶节点数量,可以控制树的复杂度

1.5 树模型的特征重要性

树模型中的特征重要性,衡量起来不像参数模型那样方便,因为参数模型中,每个特征前面的参数值越大,就表示这个特征越重要

在树模型中,特征重要性的衡量比较复杂,但是逻辑是很简单的,就是如果我把这个特征删去以后,再训练一遍这个树的话,树模型的表现会不会有所下降;依此思路可以有两种计算模型特征重要性的方式:

  1. 基尼指数的增加值:如果我把这个特征删去以后,再训练一遍这个树,树模型的基尼指数的增加值就是这个特征的重要性
  2. 分类误差的增加值:如果我把这个特征删去以后,再训练一遍这个树,树模型的分类误差的增加值就是这个特征的重要性

1.6 树模型的代码实现

标签

决策树模型机器学习
评论
  • 能把m_trade_1的源码贴出来吗?因为使用模块里面的交易代码,回测出来结果差很多
  • 这块的代码就是我们平台“线性模板模型”使用的bigtrader里的代码,把持仓周期调位5天,持股数量调为1
  • 模型表现不同是因为很多树模型是有随机的机制在里面的,可以在模型里设置random_state来固定模型
{link}