1. 决策树
一般的,一棵决策树包含一个根结点、若干内部结点和若干叶子结点,叶子节点对应决策结果,其他每个结点对应一个属性测试,每个结点包含的样本集合根据属性测试结果被划分到子结点中,而根结点包含样本全集,从根结点到每个叶子结点的路径对应了一个判定测试序列。其基本流程如下所示:
输入:训练集D={(x1,y1), (x2, y2), ......, (xm, ym)} 属性集A={a1, a2, ......, ad} 过程:函数TreeGenerate(D, A),传入参数为训练集D与属性集A 1: 生成结点node; 2: if D中样本全部属于同一类别C then 3: 将node标记为C类叶子结点;return 4: end if 5: if A=∅ OR D中样本在A上的取值相同 then 6: 将node标记为叶子结点,其类别标记为D中样本数量最多的类;return 7: end if 8: 从A中选择最优划分属性a*; 9: for a*的每一个值av* do 10: 为node生成一个分支;令Dv表示D在a*上取值为av*的样本子集; 11: if Dv为空 then 12: 将分支结点标记为叶子结点,其类别标记为D中样本最多的类;return 13: else 14: 以TreeGenerate(Dv,A\{a*})为分支结点 15: end if 16: end for
所以,决策树的生成是一个递归过程,在决策树基本算法中,有三种情形会导致递归,它们分别是:
- 当前结点包含的样本全部属于同一个类别,无需划分(1-3行)
- 当前属性集合为∅,或者所有样本在所有属性上的取值是相同的,无法划分(4-6行)
- 当前结点包含的样本集合为∅,无法划分(样本集合为∅当然无法划分)
综上所述,决策树算法的关键点在于第8行:选择最优划分属性a*。一般而言,我们希望达到的效果是随着划分的不断进行,结点的纯度(purity)越来越高。
2. 划分选择
(1) 信息增益 (Information Gain)
信息熵(information entropy)是用于度量样本集合纯度最常用的一种指标,假定当前样本集合D中第k类样本所占的比例为pk(k=1, 2, ..., |y|),则D的信息熵定义为:
其中,y是分类的数量,即标签label的数量,也就是有多少个pk。Ent(D)的值越小,则D的纯度越高。
样本的某离散属性a有个V个可能的取值 {a1, a2, ......, av},使用属性a对数据集D进行划分,则可以产生V个分支结点,其中,第x个分支结点包含了D中所有在属性a上取值为ax的样本,记为Dx,即可根据 Ent(D) 计算出信息熵,再考虑到不同的分支结点包含的样本数量不同,为分支结点赋予权重|Dx|/|D|,即样本数量越多的分支结点影响越大,于是便可以计算出属性a对样本集D划分所获的的信息增益(information gain):
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。因此,可以表示为:
ID3决策树算法(Quinlan,1986)就是使用信息增益为准则来选择划分属性。
E.g. 西瓜数据集2.0如下:
可以看到,整个数据集D包含的样本数量为17,其中8个正例(好瓜),9个反例(坏瓜),由于是二分类,标记Label的数量为2,故 |y|=2。
根节点包含所有样本,计算根节点的信息熵:
接下来需要计算出当前属性集合,即 A = {色泽,根蒂,敲声,纹理,脐部,触感} 中每个属性的信息增益。
以属性“色泽”为例,该属性有3个取值{青绿,乌黑,浅白},如果使用“色泽”属性对数据集D进行划分,则可以得到3个子集,也就是对应的在决策树上有3个分支,分别记为:D1(青绿),D2(乌黑),D3(浅白),如下所示:
故可以计算出每一个属性值对应的信息熵:
最后可以计算出属性“色泽”的信息增益为:
类似的,重复上述步骤,可以计算出其他属性的信息增益:
可以看到,如果使用属性“纹理”作为划分结点,我们获得的信息增益是最大的,所以选择“纹理”作为当前结点的划分属性。
选择划分结点的步骤总结:
- 计算根节点的信息熵
- 对于属性集合中的每个属性,分别计算它们的信息增益
- 根据该属性的取值,将数据集划分为属性值对应的子集,故子集的数量应该与该属性的取值数量一致
- 计算出每个属性值对应的信息熵
- 计算出该属性的信息增益
- 在获得所有属性的信息增益后,找到信息增益最大的属性,即为当前结点的划分属性
接下来剩余的结点的进一步划分,则先要找到当前结点样本中可用的属性集合,再重复之前的步骤分别计算出每个属性对应的信息增益,取最大者为下游结点的划分属性。
(2) 增益率 (Gain ratio)
信息增益准则对取值数目较多的属性有所偏好,为了减轻这种影响,可以使用增益率来选择最优划分属性,信息增益率的定义为:
其中,IV(a) 称为属性a的固有值 (Quinlan, 1993),其意义在于:属性a的可能取值数目越多(即V越大),IV(a)的值通常会越大,定义如下:
对于上面的西瓜数据集2.0,固有值如下:
IV(触感) = 0.874 V=2
IV(色泽) = 1.580 V=3
IV(编号) = 4.088 V=17
需要注意的是,增益率准则对于可取值数目较少的属性有所偏好,所以,著名的C4.5决策树算法(Quinlan, 1993)并不直接使用增益率最大者作为划分属性,而是先从候选划分属性中找到信息增益高于平均水平的增益,再从中选择增益率最高者。
(3) 基尼指数
CART决策树算法使用基尼指数来选择划分属性,数据集D的纯度可以用基尼指数来进行衡量:
直观来说,Gini(D) 反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此,Gini(D) 越小,则数据集D的纯度越高。
另一方面,属性a的基尼指数定义为:
所以,在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优化分属性,即:
3. 剪枝处理
剪枝(Pruning)是决策树算法处理过拟合的主要手段,在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会导致决策树分支过多,因此可以通过主动去掉一些分支来降低过拟合的风险。剪枝的基本策略分为预剪枝(Prepruning)和后剪枝(Post-pruning)。
(1) 预剪枝(Prepruning)
(2) 后剪枝(Post-pruning)