1. 算法流程

一般的,一颗决策树包含一个根结点、若干内部结点和若干叶结点;叶节点对应于决策结果,其他每个结点则对应于一个属性测试结果;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶子结点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的“分而支之”策略:

在决策树算法中,有3种情况会导致递归返回:

  • 当前节点包含的样本属于同一类,无需划分
  • 当前节点属性集为空,或是所有样本在所有属性上取值相同,无法划分
  • 当前节点包含的样本集合为空,不能划分

2. 划分选择

information gain 信息增益  $a_{\star} = \arg\max\limits_{a\in{A}} Gain(D, a)$

information entropy信息熵是度量样本集合纯度最常用的指标。假定当前样本集合$D$中第$k$类样本所占比例为$p_k(k=1,2,...,K)$,则$D$的information entropy是

$Ent(D) = \textbf{-} \sum_{k=1}^{K}p_klog_2^{p_k}$

$Ent(D)$的取值范围为[0, 1]之间,$Ent(D)$的值越小,则$D$的纯度越高。

那么对于$D$的各个结点$D_v$,我们可以算出$D_v$的information entropy,再考虑到不同的分支结点所包含的样本数不均匀,给分支赋予权重$\frac{\lvert{D_v}\rvert}{\lvert{D}\rvert}$,这样得到information gain:

$Gain(D,a_{\star}) = Ent(D) - \sum_{v=1}^{V} \frac{\lvert{D_v}\rvert}{\lvert{D}\rvert}Ent(D_v)$

一般来说 infoermation gain 越大,意味着使用属性$a$ 来进行划分所得“纯度提升”越大。这种分裂方式对于可取值数目较多的属性有所偏好。

gain ratio 增益比  $a_{\star} = \arg\max\limits_{a\in{A}} Gain\_ratio(D, a)$

$Gain\_ratio(D, a) = \frac{ Gain(D, a)}{IV(a)}$

$IV(a) =  \textbf{-} \sum_{v=1}^{V} \frac{\lvert{D_v}\rvert}{\lvert{D}\rvert}log_2{\frac{\lvert{D_v}\rvert}{\lvert{D}\rvert}}$

需要注意的是:实际使用gain ratio时:先从候选划分属性中找到信息增益高于平均水平的属性,再从中选择增益比最高的。这种分裂方式对可取值数目较少的属性有所偏好.

CART Gini index基尼指数  $a_{\star} = \arg\min\limits_{a\in{A}} Gini\_index\_ratio(D, a)$

$Gini(D) = \sum_{k=1}^{\lvert{y}\rvert} \sum_{k^{,}\neq{k}}p_kp_{k^{,}} = 1-\sum_{k=1}^{K}p_k^2$

$Gini\_index(D,a) = \sum_{v=1}^{V} \frac{\lvert{D_v}\rvert}{D}Gini(D_v)$

CART与传统DT相比,分裂中只有两个结点。

3. 剪枝处理

剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。在决策树学习中,为了尽可能正确分类训练样本,结点划分过程不断重复,有时会造成决策树分支过多,这就可能因训练样本学习得“太好”了,以至于把训练样本集自身的一些特点当成所有数据都具有的一般性质而导致过拟合。因此可以主动去掉一些分支来降低过拟合的风险。

决策树剪枝的基本策略有“预剪枝”(prepruning)和“后剪枝”(post-pruning)。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分并将当前结点标记为叶结点;后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子数替换成叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

3. Decision Tree的更多相关文章

  1. Spark MLlib - Decision Tree源码分析

    http://spark.apache.org/docs/latest/mllib-decision-tree.html 以决策树作为开始,因为简单,而且也比较容易用到,当前的boosting或ran ...

  2. 决策树Decision Tree 及实现

    Decision Tree 及实现 标签: 决策树熵信息增益分类有监督 2014-03-17 12:12 15010人阅读 评论(41) 收藏 举报  分类: Data Mining(25)  Pyt ...

  3. Gradient Boosting Decision Tree学习

    Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...

  4. 使用Decision Tree对MNIST数据集进行实验

    使用的Decision Tree中,对MNIST中的灰度值进行了0/1处理,方便来进行分类和计算熵. 使用较少的测试数据测试了在对灰度值进行多分类的情况下,分类结果的正确率如何.实验结果如下. #Te ...

  5. Sklearn库例子1:Sklearn库中AdaBoost和Decision Tree运行结果的比较

    DisCrete Versus Real AdaBoost 关于Discrete 和Real AdaBoost 可以参考博客:http://www.cnblogs.com/jcchen1987/p/4 ...

  6. 用于分类的决策树(Decision Tree)-ID3 C4.5

    决策树(Decision Tree)是一种基本的分类与回归方法(ID3.C4.5和基于 Gini 的 CART 可用于分类,CART还可用于回归).决策树在分类过程中,表示的是基于特征对实例进行划分, ...

  7. OpenCV码源笔记——Decision Tree决策树

    来自OpenCV2.3.1 sample/c/mushroom.cpp 1.首先读入agaricus-lepiota.data的训练样本. 样本中第一项是e或p代表有毒或无毒的标志位:其他是特征,可以 ...

  8. GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法

    GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...

  9. Gradient Boost Decision Tree(&Treelink)

    http://www.cnblogs.com/joneswood/archive/2012/03/04/2379615.html 1.      什么是Treelink Treelink是阿里集团内部 ...

  10. (转)Decision Tree

    Decision Tree:Analysis 大家有没有玩过猜猜看(Twenty Questions)的游戏?我在心里想一件物体,你可以用一些问题来确定我心里想的这个物体:如是不是植物?是否会飞?能游 ...

随机推荐

  1. android 弹出软键盘将底部视图顶起问题

    今天要做一个搜索功能,搜索界面采用AutoCompleteTextView做搜索条,然后下面用listview来显示搜索结果,而我的主界面是在底 部用tab做了一个主界面导航,其中有一个搜索按钮,因为 ...

  2. ABP框架系列之七:(About-关于ABP)

    Considerations Source codes Contributors Contact ASP.NET Boilerplate is designed to help us to devel ...

  3. json、JSONObject、JSONArray的应用

    type.java package jiekou.duixiang; import java.text.ParseException;import java.text.SimpleDateFormat ...

  4. verilog系统函数用法

    1.$fwrite 向文件写入数据 $fdisplay 格式:$fwrite(fid,"%h%h\n",dout_r1,dout_r2); (1)fwrite是需要触发条件的,在一 ...

  5. BSD Socket 通信

    Berkeley sockets is an application programming interface (API) for Internet sockets and Unix domain ...

  6. 如何更新world文档的目录

    在想要设置目录的文档页,右键 -> 更新域, 或者在想要设置目录的文档页,按下 F9 即可 拓展: 在目录文档页  ,按Ctrl 并且单击鼠标可以跟踪目标连接 如果内容对您有所帮助,请打赏--- ...

  7. hdu 5015 233矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=5015 需要构造一个 n+2 维的矩阵. 就是要增加一维去维护2333这样的序列. 可以发现 2333 = 233 ...

  8. [FRAMESET][PHP]Frameset下面使用php-header('location:...') redirect链接

    一般,我们的管理后台都是使用frameset来进行布局的,所以如果我们对后台的登录会话时间进行了设定,那么在超过该时间session失效之后,那么我们就必须要在php文件中进行判断处理. 判断会话失效 ...

  9. Python学习-27.Python中的列表(list)

    列表已经用了很多次了.使用中括号包含元素. list = ['a','b','c'] 获取元素使用[]. print(list[0]) 输出a 不过值得注意的是,[]只能是0到元素个数-1吗?在Pyt ...

  10. Golang Tcp粘包处理(转)

    在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name" ...