二、决策树
1. 构建一颗树
一棵树包含一个根节点、若干个内部结点和若干个叶节点。从根节点开始,经由若干个内部结点,到不同的分支,最终到达不同的叶节点。
根节点包含了样本全集,叶节点对应了决策结果,从根节点到每个叶节点的路径对应了一个判定测试样本。
对于一棵用于分类的决策树来说,关键就是若干个内部结点的确定。
针对数据集$D = \{ ({{\bf{x}}_1},{y_1}),({{\bf{x}}_2},{y_2}),...,({{\bf{x}}_m},{y_m})\} $,其中${\bf{x}} = \{ {x_1},{x_2},...,{x_d}\}$,包含d维属性,$y$是对应的类别。
我们需要确定依次从哪个属性(视为内部结点)开始划分,一直到:
1)当前结点包含的样本全属于一个类别,无需再划分;
2)当前属性值为空,或是所有样本在所有属性上取值相同,无法划分;
2)当前结点包含的样本集为空,不能划分,
为止。最后返回一个包含固定结点的决策树。
决策树学习基本算法
输入:训练集$D = \{ ({{\bf{x}}_1},{y_1}),({{\bf{x}}_2},{y_2}),...,({{\bf{x}}_m},{y_m})\} $,
其中${\bf{x}} = \{ {x_1},{x_2},...,{x_d}\}$,即属性集$A = \{a_1, a_2,...,a_d\}$
过程:从根节点开始,
- 生成结点node
- if D中样本在该结点处都属于同一个类别C then
- 把该结点对应的属性从属性集A中去掉
- 并将该结点node标记为C类的叶节点
- end if
- if A是空集 OR D中样本在A上的取值相同 OR 属于该分支样本集为空 then
- 把该结点对应的属性从属性集A中去掉
- 并将该结点node标记为叶节点,类别为D中样本数最多的类
- end if
- 从剩余属性A中选择最优划分属性,例如选择信息增益最大的属性为最优划分属性
- 根据该属性生成结点node划分,回到第1步
输出:包含固定结点的决策树
随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,我们选择最优划分属性有三种指标,信息增益、增益率、基尼指数。
信息增益 ID3决策树
增益率 C4.5决策树
基尼系数 CART决策树
。。。
2. 完善这棵树
2.1 剪枝处理
剪枝是决策树学习算法对付“过拟合”的主要手段。
预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;
后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点.
如何判断决策树泛化性能是否提升呢? 例如留出法,即预留一部分数据用作"验证集",来评估决策树的泛化性能。
后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。
但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
2.2 连续与缺失值
连续值需要离散化,比如采用二分法(bi-partition)对连续属性进行处理,从大到小排序,选择$\frac{{\max - \min }}{2}$为划分点来分为两类。
需注意的是,与离散属性不同,若当前结点划分属性为连续属性?该属性还可作为其后代结点的划分属性.
缺失值(不完整样本)不能被简单的放弃,有必要考虑利用有缺失属性值的训练、样例来进行学习。与没有缺失值决策树学习过程不同的是:
我们需要给每个样本赋予一个权重$\omega $,在最开始的时候,样本权重都是1。
在进行划分属性选择的时,最优属性指标的计算多乘上一个比例$\rho $,该比例$\rho $表示该属性无缺失样本所占的比例。
给定划分属性在进行样本划分时,对于属性缺失的样本,按照不同的概率 $r$划入到该属性不同取值(子节点)中去,该概率$r$表示无缺失值样本中在该属性中所占的比例。也就是在进行样本划分时,会把这个样本在该属性下的权重调整为$\omega \cdot r$。