决策树是一种预测模型,它代表的是对象属性和对象值的一种映射关系。常用的决策树算法有ID3、C4.5、CART、随即森林。涉及到的主要两个内容是属性分裂的度量标准及树剪枝两个问题。
属性分裂的度量标准:信息增益、信息增益率、GINI不纯度
1)信息增益的度量标准:熵
为了精确地定义信息增益,我们先定义信息论中广泛使用的一个度量标准,称为熵(entropy),它刻画了任意样例集的纯度(purity)。熵介于0,1之间。计算熵的公式为:
举例来说,假设S是一个关于布尔概念的有14个样例的集合,它包括9个正例和5个反例(我们采用记号[9+,5-]来概括这样的数据样例),那么S相对于这个布尔样例的熵为:
Entropy([9+,5-])=-(9/14)log2(9/14)-(5/14)log2(5/14)=0.940
现在有了熵作为衡量样例纯度的标准,就可以定义决策树分类的效力标准,即信息增益。简单的说,一个属性的信息增益就是由于使用了这个属性分割样例而导致期望熵的降低,或者说,样本按照某个属性划分时熵减少的期望。
一个属性A相对样例集合S的信息增益Gain(S,A)被定义为:
从中可以看出第一个Entropy(S)是熵定义(期望信息),第二个则是信息增益Gain(S,A)的定义,而Gain(S,A)由第一个Entropy(S)计算出。简单的来说,就是先计算总分类结果所需要的期望信息,然后减去每个属性的可以得到的期望信息,就得出信息增益。信息增益越高,说明该属性越纯净,则首先选择该属性进行分割。
2)信息增益率
用信息增益率来选择属性,可以避免用信息增益偏好选择取值多的属性的不足。C4.5算法不再是通过信息增益来选择决策属性。一个可以选择的度量标准是增益比率gainratio。增益比率度量是用前面的增益度量Gain(S,A)和分裂信息度量SplitInformation(S,A)来共同定义的,如下所示:
其中,分裂信息度量被定义为(分裂信息用来衡量属性分裂数据的广度和均匀):
其中S1到Sc是c个值的属性A分割S而形成的c个样例子集。注意分裂信息实际上就是S关于属性A的各值的熵。这与我们前面对熵的使用不同,在那里我们只考虑S关于学习到的树要预测的目标属性的值的熵。
3)GINI不纯度
GINI指标主要是度量数据划分或训练数据集D的不纯度为主,系数值的属性作为测试属性,GINI值越小,表明样本的纯净度越高(即该样本只属于同一类的概率越高)。选择该属性产生最小的GINI指标的子集作为它的分裂子集。一个节点A的GINI不纯度定义为:
其中,Pk表示观测点中属于k类得概率,当Gini(A)=0时所有样本属于同一类,当所有类在节点中以相同的概率出现时,Gini(A)最大化,此时值为(C-1)C/2。
树剪枝
在构建树叉时,由于数据中的噪声和离群点,许多分支反映的是训练数据中的异常,而树剪枝则是处理这种过分拟合的数据问题,常用的剪枝方法为先剪枝和后剪枝。
1)先剪枝
通过提前停止树的构造,如通过决定在给定的节点不在分裂或划分训练元组的子集而对树剪枝。一旦停止,该节点即为树叶。在构造树时,可以使用诸如统计显著性、信息增益等度量评估分裂的优劣。如果划分一个节点的元组低于预先规定的阀值的分裂,则该子集的进一步划分将停止。选取一个合适的阀值是困难的,较高的阈值可能导致过分简化的树,而较低的阈值可能使得树的简化太少。
2)后剪枝
由完全生长的树减去子树,通过删除节点的分支,并用树叶替换,树叶用被替换的子树中最频繁的类标记。常用的后剪枝法有:悲观剪枝法、代价复杂度剪枝法、最小误差剪枝法、错误率降低剪枝法。
悲观剪枝法:
悲观剪枝就是递归得估算每个内部节点所覆盖样本节点的误判率。剪枝后该内部节点会变成一个叶子节点,该叶子节点的类别为原内部节点的最优叶子节点所决定。然后比较剪枝前后该节点的错误率来决定是否进行剪枝。
具体实例:
代价复杂度剪枝法:
对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α:
|NTt|是子树中包含的叶子节点个数;
R(t)是节点t的误差代价,如果该节点被剪枝;
r(t)是节点t的误差率;
p(t)是节点t上的数据占所有数据的比例;
R(Tt)是子树Tt的误差代价,如果该节点不被剪枝。它等于子树Tt上所有叶子节点的误差代价之和;
比如有个非叶子节点t4如图所示:
找到α值最小的非叶子节点,令其左右孩子为NULL。当多个非叶子节点的α值同时达到最小时,NTt取最大的进行剪枝。
另外,如何从生成的子树序列中选择最优的决策树是CCP方法的第二个关键点,通常采用的方法有两种:V番交叉验证法和基于独立剪枝数据集的方法。说白了,这两种方法都是拿现有的数据套到剪枝后的决策树中进行验证,只不过一种是那现有的建立决策树的原始数据,另一种是新数据。
其他两种方法大概看了一下,与上面两种我感觉思路都差不太多,具体没有细研究。
ID3算法
ID3算法思想描述:
a.对当前例子集合,计算属性的信息增益;
b.选择信息增益最大的属性Ai(关于信息增益后面会有详细叙述)
c.把在Ai处取值相同的例子归于同于子集,Ai取几个值就得几个子集
d.对依次对每种取值情况下的子集,递归调用建树算法,即返回a,
e.若子集只含有单个属性,则分支为叶子节点,判断其属性值并标上相应的符号,然后返回调用处。
ID3算法只能处理离散型的描述性属性。
C4.5算法
C4.5算法是从ID3算法中来的,两种算法的主要区别有是否可以处理连续数据及属性分裂的度量标准。C4.5是可以处理连续型数据的,需要把连续型数据离散化。另外从属性分裂度量标准上ID3使用信息增益,C4.5使用信息增益率。
CART算法
CART中用于选择变量的不纯性度量是Gini指数;如果目标变量是标称的,并且是具有两个以上的类别,则CART可能考虑将目标类别合并成两个超类别(双化);如果目标变量是连续的,则CART算法找出一组基于树的回归方程来预测目标变量。
随机森林
随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输
入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本
为那一类。
决策树算法在R语言中的实现
在R语言中关于决策树建模,最为常用的有两个包,一个是rpart包,另一个是party包。我们来看一下对于上述问题,这两个包分别是怎么处理的。
rpart包的处理方式:首先对所有自变量和所有分割点进行评估,最佳的选择是使分割后组内的数据更为“一致”(pure)。这里的“一致”是指组内数据的因变量取值变异较小。rpart包对这种“一致”性的默认度量是Gini值。确定停止划分的参数有很多(参见rpart.control),确定这些参数是非常重要而微妙的,因为划分越细,模型越复杂,越容易出现过度拟合的情况,而划分过粗,又会出现拟合不足。处理这个问题通常是使用“剪枝”(prune)方法。即先建立一个划分较细较为复杂的树模型,再根据交叉检验(Cross-Validation)的方法来估计不同“剪枝”条件下,各模型的误差,选择误差最小的树模型。
party包的处理方式:它的背景理论是“条件推断决策树”(conditional
inference
trees):它根据统计检验来确定自变量和分割点的选择。即先假设所有自变量与因变量均独立。再对它们进行卡方独立检验,检验P值小于阀值的自变量加入模型,相关性最强的自变量作为第一次分割的自变量。自变量选择好后,用置换检验来选择分割点。用party包建立的决策树不需要剪枝,因为阀值就决定了模型的复杂程度。所以如何决定阀值参数是非常重要的(参见ctree_control)。较为流行的做法是取不同的参数值进行交叉检验,选择误差最小的模型参数。