- 基本流程
决策树(decision tree)是一类常见的机器学习方法。决策过程中提出的每个判定问题都是对某个属性的“测试”,每个测试结果或是导出最终结论,或是导出进一步的判定问题,其考虑范围是在上一次决策结果的限定范围内。
一般的,一棵决策树包含一个根结点,若干个内部结点和若干个叶节点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试。
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树。
- 划分选择
决策树学习的关键在于如何选择最优化分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度(purity)”越来越高。
-
- 信息增益(Information Gain) --- ID3决策树学习算法[Quinlan,1986]
“信息熵”(information entropy)是度量样本集合纯度最常用的一种指标。考虑到不同分支结点所包含的样本数不同,给分支结点赋予权重|Dv|/|D|;
Gain(D,a) = Ent(D) - Ent(a)
= Ent(D) - sum(|Dv|/|D| * Ent(Dv))
Ent(a)表示以属性a划分的各分支的信息熵总和。信息增益越大,表明用以属性a划分所获得的“纯度提升”越大。
所以属性选择是
a = arg max Gain(D,a_i)
-
- 增益率(Gain ratio)
实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,著名的C4.5决策树算法[Quinlan,1993]不直接使用信息增益,而是使用“增益率”(gain ratio)来选择最优划分属性。
Gain_ratio(D,a)= Gain(D,a) / IV(a)
IV(a) = -sum(|Dv|/|D|*log(|Dv|/|D|))
其中IV(a)称为属性a的固有值。但是,增益率准则对可取值数目较少的属性有所偏好。
启发式选择方法[Quinlan,1993]: 先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择选择增益率最高的。
-
- 基尼指数(Gini index)
基尼指数Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一样的概率。
a = arg min Gini_index(D,a)
- 剪枝(pruning)选择
剪枝是决策树学习算法对付“过拟合”的主要手段。
- 预剪枝(prepruning): 在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点
- 后剪枝(post-pruning): 从训练集中先训练出一棵完整的决策树,然后自底向上地对非叶结点进行考察。若将该结点对应的子树替换为叶结点能代替决策树泛化性能的提升,则将该字数替换为叶结点
后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情形下,后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但其需要生成完全决策树之后进行,并且要自底而上对非叶结点逐一考察。因此开销时间大。
- 连续值处理和缺失值处理
-
- 连续值处理
对于连续值,以出现的某个连续值为边界,小于等于该连续值为一类,大于该连续值为一类。划分依据可以用前面说的三种划分方法
离散属性在路径上出现过在之后的路径上不能出现。而连续属性却不同。如某个结点划分依据是: x<=5.0, 在该结点的子节点可以划分为 x<=2.5;
-
- 缺失值处理
主要会遇到下面两个问题:
-
-
-
- 如何在属性值缺失的情况下进行划分属性选择?
- 给定划分属性,若样本在该属性上的值流失,如何对样本进行划分?
-
-
其解决方法如下:
1.令D'是D中在属性a上没有缺失值的样本,其所在权重为p;Dv表示在属性a中属性值为av的样本数,rv表示其所占比重。则其信息增益可以如下计算:
Gain(D,a) = p * Gain(D',a) = p * ( Ent(a') - sum(rv * Ent(Dv)))
2.当属性选择好后,属性值未缺失样本正常划入对应子节点,缺失样本划入所有所有子节点,不过对应的样本权值 wx = wx * rv ;
- 多变量决策树(multivariate decision tree)
对于一个样本,若是我们将样本的每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点。对样本的划分就意味着在这个坐标空间中寻找不同类样本之间的分类边界。单变量决策树所形成的分类边界有一个明显的特点:轴平行(axis-parallel),即它的分类边界由若干个与坐标轴平行的分段组成。但有时这样生成的决策树会特别复杂。而“多变量决策树就可以解决这个问题”,因为其将轴平行的分类边界换成了斜的分类边界。因此在非叶节点中,非叶节点不是对某个属性测试,而是对属性的线性组合进行测试,相当于每个非叶节点训练了一个线性分类器。因此分类器模型将得到大大简化