随机森林算法的源码分析(一)

来源:互联网 发布:centos系统还原 编辑:程序博客网 时间:2024/06/09 21:14

转载:http://blog.csdn.net/wdhxek/article/details/50425140

原作者&源码信息

http://www.andres.sc/

http://www.andres.sc/code.html


实现分析

  1. 数据结构的角度进行扩展,决策森林,决策树,决策节点
  2. 从学习的角度:划分为森林的学习,树的学习与节点的学习
  3. 从输入输出的角度:

  • 决策森林是最外部的函数调用接口,用户给出了SampleFeatureMatrix 以及 对应的 SampleLabelVector,返回森林的结构,森林中的元素是决策树,树与树之间并没有复杂的链接关系,甚至没有顺序关系,体现随机性;
  • 决策树是关键的一部分,接受来自上层结构:森林传过来的训练数据与训练标签,返回一棵树,里面包含了决策节点与节点之间的链接关系,这一步有学习的部分,同时还有用构树的部分,学习与构树是同时进行的,训练一颗决策树使用的样本来自于森林,用不同的样本(随机抽取指定数目)训练不同的决策树,体现随机性;
  • 决策节点:最底层的结构,可以从目的与应用的角度理解其设计原则,在使用决策节点的时候,需要给定其样本特征,该节点使用函数规则(再次体现随机性)的输出,决定在树中的路径选择,向左走还是向右走的问题,还有就是作为leafNode直接给出类别标签,从这个解读,存储决策函数使用的各种参数,存储形成树链接关系的左右节点的信息,存储自己是不是leafNode节点以及label信息。如果是存储的内容可以分为:学习决策参数 + 构树信息;
  • 训练过程与预测使用节点,对于节点输入的不同,一个样本在决策树中按照每一个节点训练好参数的函数信息进行路径选择,走到最后的leafNode,属于最后的应用过程,学习过程,需要计算information gain等信息,需要一组样本的输入,节点要完成输入样本的split,并将切分后的数据分别传给自己的左右子节点进行训练,在训练过程中,样本数据流是沿着树结构从顶到底的所有的路径进行流动,所以对于每一个节点,在构树的过程中,需要记录自己切分后的样本数据流的信息,简单来讲,就是经过自己之后的数据,那一部分送到左边,训练自己的左节点,哪一部分送给自己的右节点去训练。这个数据流的切分信息一方面是训练需要,另一方面也可以作为驱动树生成的动力;
  • 学习部分可以理解为节点的生成,对数据流的切分,两部分交替,实现数据流最终沿着生成好的树的路径流到每一个确定的leafNode中,找到自己的类别归属。作者的源码中:节点分支函数,使用随机选择的特征,计算Gini系数,选择最好的哪一个特征,并记录阈值,这一部分可以进行其他分支函数的套用与修改,比如所有特征的线性结合等。

构树过程

这一部分单独拿出来分析,抽象成为一个构树的框架

  • 一棵树要应该有的数据结构,每一个节点的数据结构,树存放节点的数据结构,复杂部分是节点与节点使用怎样的链接关系生成一棵树,每一个Node结构中存储着自己的孩子节点的index数值,指定根节点,存储部分:vector<Node> tree.
  • 构树需要有驱动信息,在怎样的情况下生成当前节点的孩子节点,哪些节点是leafNode,不需要再生成,这是驱动信息,作者在实现时候,用了一个辅助构树的数据结构Quene,只要当前的节点还要生成孩子节点(is_leaf()  == false),就将把当前节点的信息(节点index以及特殊信息(反映到DecisionTree中就是生成下一个节点需要的那些信息,数据流切分信息))加入到QUENE中,然后检测QUENE,size() != 0, 驱动构树。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

A : 构建root node ,初始化Quene;

B :检测QUENE.size() != 0

{

得到要构建孩子节点的当前节点的信息,为下一步构建孩子节点做准备,然后pop掉当前节点的信息;

建立New Node_left & New Node_righ, 结合回传的信息,补充到树的存储结构中,并更新链接关系;

检测Node_left & Node_right 是不是需要构建自己的孩子节点,如果需要,建立自己的驱动信息,并加入到QUENE中,然后return;不需要的话,直接return;

}


0 0
原创粉丝点击