概要
决策树也是我们经常使用的样本归类算法。简单来说,它就是 if-else 的判断集合,本文就详细介绍其原理,还有例子实现。依然参考《机器学习实战》。
基本理论
决策树是通过一系列规则对数据进行分类的过程。
决策树利用了概率论的原理,不断地将数据切分成小数据集,直到所有目标变量完全相同,或者数据不能再切分为止。并且利用一种树形图作为分析工具。其基本原理是用决策点代表决策问题,用方案分枝代表可供选择的方案,用概率分枝代表方案可能出现的各种结果,经过对各种方案在各种结果条件下损益值的计算比较,为决策者提供决策依据。
决策树是一种贪心算法,要在给定时间内做出最佳选择,但并不关心能否达到最优。 ###决策树的实现 决策树的实现主要分为三个步骤:
- 特征选择:特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。
- 决策树生成: 根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止。
- 剪枝:决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。
划分数据集的最大原则是:使无序的数据变的有序。如果一个训练数据中有20个特征,那么选取哪个做划分依据?这就必须采用量化的方法来判断,量化划分方法有多重,其中一项就是“信息论度量信息分类”。基于信息论的决策树算法有 ID3、C4.5 和 CART 等算法,其中 C4.5 和 CART 两种算法从 ID3 算法中衍生而来。
优缺点
- 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据
- 缺点:可能会产生过度匹配问题
ID3
原理
ID3 (Iterative Dichotomiser 3,迭代二叉树 3 代)算法中根据信息论的信息增益评估和选择特征,每次选择信息增益最大的特征做判断模块。我们要解决的问题就是:当前数据集上哪个特征在划分数据分类时起决定性作用。这时需要我们对每个特征进行评估。创建树的伪代码函数 createBranch() 如下:
检测数据集中每个子项是否属于同一分类:
if so return 类标签
else
寻找划分数据集的最好特征
划分数据集
创建分支节点
for 每个划分的子集
调用函数 createBranch 并增加返回结果到分支结点中
return 分支结点
显然 createBranch() 是一个递归函数 。现在我们缺少一个量化的标准去衡量谁是最好特征,那就是信息增益。
在划分数据集之前之后信息发生的变化称为信息增益。集合信息的度量方式称为香农熵或者简称为熵。熵定义为信息的期望值,熵在信息论中代表随机变量不确定度的度量,也度量了数据集的无序程度。如果待分类的事务可能划分在多个分类之中,则符号 $x_i$ 的信息定义为 \begin{align} \ell(x_i) = -\log_2p(x_i) \end{align} 其中 $p(x_i)$ 是选择该分类的概率。则熵就是计算所有类别所有可能值包含的信息期望值,公式如下: \begin{align} H(X) = -\sum_{i=1}^n p(x_i)\log_2p(x_i) \end{align} 其中 $n$ 是分类的数目。
得到熵之后,要计算信息增益,我们还得计算条件熵,即在一定条件下,随机变量的不确定性。我们以一定方式对其进行切分之后,就相当于对其施加了一个条件 $Y$,计算公式为 \begin{align} H(X|Y) = \sum_{i=1}^n P(Y=y_i)H(X|Y=y_i) \end{align}
到此我们就可以计算信息增益了,它也称为互信息,用 $InfoGain(X,Y)$ 表示,它等于数据集的熵减去条件熵,即 \begin{align} InfoGain(X,Y) = H(X) - H(X|Y) \end{align}
信息增益越大表明信息增多,则不确定性就越小,在这里可以理解为数据无序度的减少。当然,分类算法除了需要测量信息熵,还需要根据特征划分数据集,度量划分数据集的熵,以便判断当前是否正确地划分了数据集。最简单的方法,就是找到所有可能的划分方式,依次计算熵,划分之后熵减少最大的所对应的特征就是我们想要的划分特征了。
由于特征值可能多于两个,因此可能存在于大于两个分支的数据集划分,因为处理方式完全一致,因此可在实现中使用递归去处理。递归结束的条件是:程序遍历完所有划分数据集的属性,或者每个分支下的所有实例都具有相同的分类。如果所有实例具有相同的分类,则得到一个叶子节点或者终止块。任何达到叶子节点的数据必然属于叶子节点的分类。
ID3 缺点
- ID3 根据属性切分数据,它采用的信息增益度量存在一个缺点,它一般会优先选择有较多属性值的特征,因为分类越多,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益也就越大。
- 还有就是它不能处理连续型数据。
C4.5
C4.5 是在 ID3 的基础上改进而提出的
- 它使用信息增益率来作为选择分支的准则,克服了使用信息增益选择特征时偏向取值多的特征的不足
- 在树的构造过程中进行剪枝,缓解过拟合问题
- 能够完成对连续属性的离散化处理
- 能够对不完整数据进行处理
信息增益率
信息增益率等于信息增益对分割信息量的比值。分割信息量是考虑某种属性进行分割时分支的数量信息和尺寸信息,这些信息也称为内在信息(固有信息)。那么显而易见,信息增益率会随着内在信息的增大而减小,也就是说,如果这个属性本身不确定性就很大,那我就不倾向于选取它,这个分割信息量就是用于惩罚取值更多的属性,从而缓解了 ID3 算法的缺点。
分割信息量用公式: \begin{align} SplitInfo = -\sum_i p(x_i)\log_2 p(x_i) \end{align} 其中 $x_i$ 表示当前属性的所有取值,这时和标签什么的没有关系,因为是描述了固有属性。那么信息增益率就为 \begin{align} InfoGainRatio = \frac{InfoGain}{SplitInfo} \end{align}
剪枝
控制决策树规模的方法称为剪枝,一种是先剪枝, 一种是后剪枝。所谓先剪枝,实际上是控制决策树的生长,后剪枝是指对完全生成的决策树进行修剪。 C4.5 采用的剪枝方法称为悲观剪枝法(Pessimistic Error Pruning,PEP),它属于一种后剪枝方法,根据剪枝前后的错误率来判定子树的修剪。具体可参考剪枝算法,谢小娇包教包会决策树之决策树剪枝.
悲观剪枝缺点
- PEP 算法实用的从从上而下的剪枝策略,这种剪枝会导致和预剪枝同样的问题,造成剪枝过度。
- PEP 剪枝会出现剪枝失败的情况
连续性属性
离散化处理:将连续型的属性变量进行离散化处理,形成决策树的训练集
- 把需要处理的样本(对应根节点)或样本子集(对应子树)按照连续变量的大小从小到大进行排序,得到多个候选阈值,如果特征值不大于这个阈值就走左子树,否则就走右子树,选取产生最大信息的阈值作为分裂阈值
处理缺失值
缺失值也有几种情况:
- 在具有缺失值的属性上如何计算信息增益率?
- 忽略该类样本
- 选择常用值或均值填充
- 依据缺失比例,折算信息增益和信息增益率
- 对缺失值赋予独特的值,参与训练
- 具有缺失值的样本在进行数据分裂时,分配给哪个子数据集?
- 忽略该样本
- 选择常用值或均值填充
- 根据其它非缺失属性的比例,分配到子数据中
- 为缺失值建立单独分支
- 确定最可能的取值,按比例仅分配给一个子数据集
- 对新样本进行分类时,缺失值导致样本到达叶子节点,怎么处理?
- 有缺失值单独分支,走单独分支
- 走最常见的值的分支
- 确定最可能取值,走相应分支
- 走所有分支,根据不同输出结果的概率进行组合
- 不进行分类,直接赋给最有可能的值
C4.5 优缺点
- 优点: 产生的分类规则同样易于理解,准确率较高
- 缺点: 在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效
来源:oschina
链接:https://my.oschina.net/u/4334628/blog/4018111