3.1.1.2 决策树
决策树
原理
4.1 基本流程
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的“分而治之”(divide-and-conquer)策略。
- 三种决策树递归返回情况:
- 当前结点包含的样本全属于同一类别,无需划分。
- 当前属性集为空,或所有样本在所有属性上取值相同,无法划分。
- 把当前结点标记为叶节点,并将其类别设定为该结点所含样本最多的类别。(利用当前结点的后验分布)
- 当前结点包含的样本集合为空,不能划分
- 把当前结点标记为叶节点,将其类别设定为其父节点所含样本最多的类别。(利用父节点的样本分布作为当前结点的先验分布)
4.2 划分选择
决策树学习的关键是如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”(purity)越来越高。
-
信息增益(Information Gain)
信息熵(information entropy)是度量样本集合纯度最常用的一种指标。信息熵越小,则样本的纯度越高。
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。
信息增益准则对可取值数据较多的属性有所偏好。 -
增益率(Gain Ratio)
增益率准则对可取值数目较少的属性有所偏好。因此算法并非直接选择增益率最大的候选划分属性,而是使用了一个启发式。先从候选划分属性中划出信息增益高于平均水平的属性,再从中选择增益率最高的。 -
基尼指数(Gini Index)
CADT决策树使用“基尼指数”来选择划分属性。数据集D的纯度可以用基尼值来度量。
直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此Gini(D)越小,则数据集D的纯度越高。
选择那个使得划分后基尼指数最小的属性作为最有划分属性。
4.3 剪枝处理(Pruning)
剪枝(Pruning)是决策树学习算法对付“过拟合”的主要手段。
如何判断决策树泛化性能是否提升呢?见2.2性能评估方法。本节采用留出法,即预留一部分数据用作“验证集”以进行性能评估。
-
预剪枝(Prepruning)
预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计。若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
预剪枝使得决策树的很多分支都没有“展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但另一方面,有些分支的当前划分虽然不能提升泛化性能,甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高。预剪枝基于“贪心”本质禁止这些分枝展开,给预剪枝带来了欠拟合的风险。 -
后剪枝(Postpruning)
后剪枝先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察。若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
4.4 连续预缺失值
-
连续值处理
连续值离散化处理:最简单采用二分法(bi-partition)
需要注意的是与离散属性不同。若当前结点划分属性为连续属性,该属性还可以作为其后代结点的划分属性。 -
缺失值处理
- 问题一:如何在属性值缺失的情况下进行划分属性选择?
- 问题二:给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
让同一个样本以不同的概率划入到不同的子结点中去。
4.5 多变量决策树
若我们把每个属性视为空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同样本之间的分类边界。决策树所形成的分类边界有一个明显的特点:轴平行(axis-parallel),即它的分类边界由若干个与坐标轴平行的分段组成
分类边界的每一段都是与坐标轴平行的,这样的分类边界使得学习结果有较好的可解释性,因为每一段划分都直接对应了某个属性值。但在学习任务的真实分类边界比较复杂时,必须使用很多段划分才能获得较好的近似。此时的决策树会相当复杂,由于要进行大量的属性测试,预测时间开销会很大。
若能使用斜的划分边界,则决策树模型将大为简化。“多变量决策树”(multivariate decision tree)就是能实现这一的“斜划分”甚至更复杂划分的决策树。以实现斜划分的多变量决策树为例,在此类决策树中,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试;换言之,每个非叶结点是一个线性分类器。在多变量学习过程中,不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器。