决策树是怎么来的呢?Morgan and Sonquist ,提出的基于树的方法,叫做:automatic interaction detector AID ,(为了解决资料数据上下文的多变量非加性效应?)算了还是给原句吧,AID for handling multi-variate non-additive effects in the context of survey data。
决策树的几个特点:
1.处理异质数据。
2.对噪声数据鲁棒。
3.对离群点鲁棒。
4.是容易解释的,即使是对非统计专业的用户。
决策树是随机森林、boosting、bagging等的基础。
以下论点或摘自统计学习方法(李航),或自己理解。决策树是一种描述对实例进行分类的树形结构,决策树由结点(node)和有向边(direct edge)组成,结点有两种类型:内部节点(internal node)和叶节点(leaf node)。内部节点表示一个特征或属性,叶节点表示一个类别。
图示的话就摘一下大家通用的吧
可以看作在超平面的划分如下:
图片是这位仁兄的,谢谢你啦http://database.51cto.com/art/201407/444788.htm
这里还要重点介绍一下熵和信息增益、信息增益率的信息:
熵:概率论里边,熵是表示随机变量不确定性的度量。
假设X是一个取有限个值的随机变量,概率分布为:
则熵定义为:
条件熵:表示在已知随机变量X的条件下,随机变量Y的不确定性。
条件熵定义为:
还有互信息:互信息为Entropy(Y)-Conditional Entropy(Y|X)
决策树学习中的信息增益和训练数据集中类与特征的互信息是等价的。
正式开始决策树ID3的学习:
决策树的建立是通过信息增益准则选择特征:对训练数据集D,计算其每个特征的信息增益,选择信息增益大的那个特征。
在这里只能说统计学习方法确实适合学习,好一部分都是摘自它的,强烈推荐。
算了,直接给个例子吧。
怎么确立这个例子的决策树呢?
先对类别计算熵(这个熵也叫经验熵,也就是说知道这个水果是什么类别的,是经验):
然后呢,计算不同属性的条件熵(也叫经验条件熵),即:
Conditional Entropy(水果|颜色红)=)=1,
Conditional Entropy(水果|颜色绿)==3/2,
Conditional Entropy(水果|颜色黄)==0。
Conditional Entropy(水果|颜色桔黄)==0。
Conditional Entropy(水果|颜色)=1/4×1+1/2×3/2+1/8×0+1/8×0=1
信息增益Gain(颜色)=9/4-1=5/4
同理求得Conditional Entropy(水果|形状)= 0.6207
Gain(形状)=9/4-0.6207=1.6239
Conditional Entropy(水果|轻重)=0.6887
Gain(轻重)=9/4-0.6887=1.5613
所以我们就选择形状作为第一个决策属性啦。
然后对形状为球,椭球,弯月的数据集分别计算信息增益,
球:
椭球:
弯月:
然后分类:
最终结果,很好懂吧,只能说老师给的这个例子很好记,很帅:
决策树ID3的算法(摘自统计学习方法):
输入:训练数据集D,特征A,阈值ε;
输出:决策树T;
1.若D中所有实例属于同一类别C_k,则T为单结点树,并将类C_k作为该结点的类标记,返回T;
2.若A=∅,则T为单结点树,并将D中实例数最大的类C_k作为该结点的类标记,返回T;(这个步骤我理解的意思是,如果分到最后没有属性可供继续计算作为结点,而且还有好几类,那就把当前剩余的数据集中实例最多的类作为当前类,极限假定只给了水果类别而没有属性,98个苹果,1个香蕉,一个桔子,那就把苹果作为这100个水果的类别)
3.否则,按照上边计算信息增益的方法计算A中各特征对D的信息增益,选择信息增益最大的特征A_g;
4.如果A_g的信息增益小于阈值ε,则置T为单结点树,并将D中实例数最大的类C_k作为该结点的类标记,返回T(跟第3步差不多);
5.否则,对A_g的每一个可能的值a_i,依A_g=a_i将D分割为若干非空子集D_i,将D_i 中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;
6.对第i个子结点,以D_i为训练集,以A-{A_g}为特征集递归的调用1-5步,得到子树T_i,返回T_i。
以上还没完,还有缺点,缺点呢:决策树生成算法递归的产生决策树,直到不能继续为止,这样的树对训练数据很准确,但是过头了,也就是过拟合了,对测试数据误差到大了,决策树太复杂了,解决方法就是简化决策树,进行剪枝。
决策树的剪枝,这里先记下树的剪枝算法,至于理论推导,以后再更新吧(太晚了,准备睡觉。。。):
输入:生成算法产生的整个树T,参数a;
输出:修剪后的子树T_a;
1.计算每个节点的经验熵;
2.递归的从树的叶节点向上回缩,
设一组叶节点回缩到其父节点之前与之后的整体树分别为T_b和T_c,其对应的损失函数值分别为C_a(T_b)与C_a(T_c),如果C_a(T_c)<=C_a(T_b),则进行剪枝,即将父节点变为新的叶节点。
3.返回2,直到不能继续为止,得到损失函数最小的子树T_a。
注意:C_a(T_c)<=C_a(T_b)只需考虑到两个树的损失函数的差,其计算可以在局部进行,所以剪枝算法可以有一种动态规划的算法实现,opencv有决策树和随机森林的源码,但是是CART的,源码在安装opencv后XXX\sources\modules\ml\src里的rtrees.cpp和tree.cpp和XXX\sources\modules\ml\include\opencv2\ml里的ml.hpp里,只是里边变量太多,得慢慢来,所以先放着,慢慢更新吧。
下一篇介绍一下C4.5和随机森林吧,随机蕨,CART等吧。