决策树是一种更接近于人类思维的分类回归算法。为什么说它接近人类思维呢?回忆一下我们平时做决策的思路,比如现在公司想要做一款新产品,我们来看一下这件事情的可行性。首先调研一下市场空间大不,不大的话就没有必要做了;在市场空间大的情况下,我们看一下有没有同类型的产品,没有的话就开搞!如果有的话,我们考虑一下能不能替代它或者说优于它,要是可以那就继续搞!要是机会很渺茫,那就要慎重考虑一下了,比如你现在说要开发一款产品替代微信,那... ... 貌似是有些难度的。真实的公司项目肯定要考虑的更复杂一些,这里只是举个小例子,不要太认真。
其实决策树的思想和我们上面这个思路是一样的。每个中间节点都代表选取一维特征可以更好的区分不同标签对应的数据,叶结点代表的是标签。构建一棵决策树主要包括三个步骤:特征选择、决策树的生成、决策树剪枝。特征选择就是指我们如何选择树的中间节点使得每次节点分裂都能更好地促进我们最终的标签分类;决策树的生成有三种代表性的算法:ID3, C4.5, CART,后面我们都会介绍到。最后还有决策树的剪枝,为什么要剪枝呢?防止过拟合。设想一个极端的情况:当我们不断分裂直到每个节点都只对应一个样本,那模型在训练集的准确率会非常高,但是当我们用它去做测试时它的准确率可能就会比较差,这种现象叫做过拟合。造成这种情况的原因是我们为了提高准确率构建了太过复杂的模型,将数据中的噪声纳入模型。为了避免出现过拟合,我们要剪枝,剪枝是对模型准确率和复杂度的权衡。
本文主要介绍决策树特征选择、生成和剪枝的过程,最后对三种决策树算法进行比较。
特征选择的方式有三种:信息增益、信息增益比和基尼指数,下面分别来介绍一下。
要说信息增益,需要先了解一下熵和条件熵的概念。
熵是表示随机变量不确定性的度量:
均匀分布对应的熵最大,熵的大小只和数据的分布有关系,和数据的具体取值无关。假设我们的数据标签共有K个分类,那么数据集标签的熵为:
|D|代表训练集数据量,代表第k类标签的数据条数;
条件熵表示在已知变量A的条件下数据集D的不确定性:
信息增益,它代表在已知变量A的条件下,数据的不确定性减小的程度。特征的信息增益越大,说明它对数据标签的划分效果越明显。在以信息增益为依据进行特征选择时,每次选择信息增益
最大的特征。
信息增益虽然可以帮助我们选择对标签划分效果好的特征,但是它更倾向于选择取值较多的特征。比如我们有一维特征(ID/DNA...)可以唯一标记一条数据,那么它确实可以很好的划分标签,但是因为每条数据的取值都不同, 它对于我们的预测来说是无意义的。信息增益比正是为了优化这一缺陷提出来的。
信息增益比在信息增益的基础上,除以,它代表了数据基于特征A划分的不确定性;特征A分布越分散,
越大,信息增益比越小;可以对取值多的特征起到约束作用。
在以信息增益比为依据进行特征选择时,每次选择信息增益比最大的特征进行划分。
基尼指数和熵的概念有点类似,用来描述数据的不确定性。
假设数据集D有K个标签,那么数据集D的基尼指数为:
根据特征A取值是否为a,可以将数据集划分为两个子集:
(6)
那么,基于特征A取值,数据集D的基尼指数为:
在以基尼指数为依据进行特征选择时,每次选择基尼指数最小的特征及其对应的取值。因为基尼指数越小,说明基于特征A取值,数据集D的不确定性越小。注意:以基尼指数为标准生成的决策树是二叉树,根据特征取值
和
将数据划分为两组。
在前面我们已经提到过常用的树有三种类型:ID3, C4.5, CART树,分别对应于上一节中提到的三中特征选择方式。对关键的特征选择方式了解之后,算法就比较好理解了,我们分别介绍一下。
ID3是以信息增益为根据进行特征划分的决策树算法。从根节点开始,我们每次选择信息增益最大的特征进行节点分裂,直到节点上数据不满足分裂条件时,停止分裂;根据多数表决原则确定叶节点对应的标签值。该算法只有树的形成,没有剪枝的过程,容易过拟合。
流程:
(1) 从根节点开始,计算每个特征的信息增益,选择信息增益最大的特征进行节点分裂;
(2) 对分裂后的左右孩子分别计算每个特征的信息增益,选择信息增益最大的特征分裂;
(3) 重复(2),直至节点对应的数据不满足分裂条件;
(4) 对所有的叶子节点,根据多数表决原则,确定叶子节点的标签值。
为了优化ID3倾向于选择取值多的问题,C4.5提出以信息增益比为划分依据。并且C4.5在决策树生成之后,加入了剪枝的过程,防止模型过拟合。
流程:
(1) 从根节点开始,计算每个特征的信息增益比,选择信息增益比最大的特征进行节点分裂;
(2) 对分裂后的左右孩子分别计算每个特征的信息增益比,选择信息增益比最大的特征分裂;
(3) 重复(2),直至节点对应的数据不满足分裂条件;
(4) 引入以叶节点个数为正则项的损失函数,以最小化损失函数为目标进行剪枝;
(5) 对所有的叶子节点,根据多数表决原则,确定叶子节点的标签值。
前面介绍的两种算法都是分类算法,CART是既可以做分类也可以做回归的决策树算法。CART分类树以基尼指数为划分标准,CART回归树以平方损失函数最小化为依据进行特征选择和划分,下面分别介绍一下分类和回归的流程。
CART分类算法与C4.5流程非常相近,只是划分标准和剪枝策略有所不同,剪枝策略我们在下一部分会详细介绍:
(1) 从根节点开始,计算每个特征的基尼指数,选择基尼指数最小的特征进行节点分裂;
(2) 对分裂后的左右孩子分别计算每个特征的基尼指数,选择基尼指数最小的特征分裂;
(3) 重复(2),直至节点对应的数据不满足分裂条件;
(4) 引入以叶节点个数为正则项的损失函数,通过交叉验证进行剪枝;
(5) 对所有的叶子节点,根据多数表决原则,确定叶子节点的标签值。
CART回归树流程:
CART回归树以启发式的方法,选择第j维特征及其对应的取值s作为切分特征和切分点,将数据划分为两部分,定义:
对每部分选择合适的标签值,使得:
在这里我们需要确定的取值,j, s的取值通过遍历所有的特征及每个特征的所有取值来确定;
(9)
流程如下:
(1) 从根节点开始,寻找最佳特征和最佳切分点,将数据划分为两部分;
(2) 对左右子树对应的数据继续寻找最佳特征和最佳切分点,划分数据;
(3) 重复(2),直至不满足分裂条件;
(4) 根据公式(9)计算每个叶子节点对应的标签值;
(5) 剪枝
剪枝分为预剪枝和后剪枝,预剪枝就是在模型创建的过程中,我们根据一些条件来判断是否要继续分裂节点;后剪枝是指在树构建完成后,再根据一定的规则进行剪枝,C4.5和CART树的剪枝都属于后剪枝。
预剪枝一般有以下几种限制节点分裂的条件:
(1) 节点对应的样本数量小于阈值;
(2) 节点分裂后带来的增益小于阈值;
(3) 没有可以选择的特征,ID3和C4.5都有此限制,这两种算法每个特征只能作为一次分裂节点。
预剪枝计算量小,有一定的局限性。有时候虽然当前分裂带来的增益小,但是之后的分裂会带来很大的增益,预剪枝无法处理这种情况。下面我们主要介绍一下C4.5和CART的后剪枝过程。先介绍一下损失函数:
(10)
C(T)代表对训练数据的预测误差,|T|代表模型复杂度,是平衡模型复杂度和算法准确率的参数,
越大模型月简单,
=0时,只考虑模型的训练误差。
C4.5和CART的损失函数基本形式都如公式(10)所示,不过他们选择的预测误差计算方式有所不同。
C4.5的训练误差是用熵来计算的,公式如下:
H(t)代表每个叶结点上的经验熵,C(T)是所有叶结点上熵的加权和,权值即为叶结点上对应的样本量。
C4.5的剪枝流程如下:
(1) 从叶结点的上一层开始,计算该节点分裂前和分裂后的损失函数:
当时,则用该节点代替以它为根节点的子树,通过多数表决的方式更新该节点的标签。
(2) 递归的对所有的非叶结点执行流程(1)
CART剪枝的C(T)用基尼指数来表示。不同于C4.5需要人工指定取值,CART用验证集通过交叉验证来确定剪枝后树的最佳结构和
的最佳取值。步骤如下:
(1) 根据公式(11)和(12),我们可以计算出每个非叶子节点的:当它作为叶结点和根节点时对应的损失函数相等时的
,即:
(2) 计算所有非叶节点对应的并排序,选取最小
对应的节点进行剪枝,剪枝后的树结构保存在T中,
,
保存在数组
,当
时,对应的最佳树结构为
(3) 在剪枝后的树结构上继续执行(2),直至根节点
(4) 计算验证集在T中所有树结构上的损失函数值,将损失函数最小的树结构作为最终的树结构,最佳的
为
,至此,剪枝结束。
1. 树的结构:ID3和C4.5可以是多叉树,CART只能是二叉树,因为它的节点分裂是根据特征是否等于某一取值或者特征是否大于某一取值
2. 用途:ID3和C4.5只能用于分类,CART既可以分类(基尼指数)也可以回归(最小二乘)
3. 是否剪枝:ID3无剪枝,易过拟合;C4.5和CART都有后剪枝。(CART的剪枝方法貌似更智能一些)
4. 特征类型:ID3只能处理离散特征;C4.5和CART可以处理离散型和连续型特征。C4.5处理连续型变量时,将变量值排序后找到不同类别的切分点,每个区间定义为一个布尔型的特征。
5. 特征复用:ID3和C4.5每个特征只能用一次;CART可以多次用同一特征划分。