18 Feb 2017

决策树

目录

欢迎在文章下方评论,建议用电脑看

决策树

决策树应该是一个比较简单的算法了,对比后面svm,神经网络,PF树那些。所以应该讲起来应该会比较轻松,特别是学过数据结构的小伙伴来说,就更加的简单了。

下面开始吧!开头必须要上一个通俗的例子是吧!去网上找到一个比较有意思的例子,如下: 通俗来说,决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:

  女儿:多大年纪了?

  母亲:26。

  女儿:长的帅不帅?

  母亲:挺帅的。

  女儿:收入高不?

  母亲:不算很高,中等情况。

  女儿:是公务员不?

  母亲:是,在税务局上班呢。

  女儿:那好,我去见见。

这个女孩的决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么这个可以用下图表示女孩的决策逻辑(声明:此决策树纯属为了写文章而YY的产物,没有任何根据,也不代表任何女孩的择偶倾向):

header1

上图完整表达了这个女孩决定是否见一个约会对象的策略,其中绿色节点表示判断条件,橙色节点表示决策结果,箭头表示在一个判断条件在不同情况下的决策路径,图中红色箭头表示了上面例子中女孩的决策过程。

这幅图基本可以算是一颗决策树,说它“基本可以算”是因为图中的判定条件没有量化,如收入高中低等等,还不能算是严格意义上的决策树,如果将所有条件量化,则就变成真正的决策树了。

有了上面直观的认识,我们可以正式定义决策树了:

决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

可以看到,决策树的决策过程非常直观,容易被人理解。目前决策树已经成功运用于医学、制造产业、天文学、分支生物学以及商业等诸多领域。知道了决策树的定义以及其应用方法,下面就详细的介绍下决策树吧!

构建决策树

首先是特征选择,特征选择在构造决策树是关键,主要有通过信息增益,信息增益比,基尼系数,对率回归来划分并进而构建决策树的方式!下面就一个一个的介绍吧!

信息增益

信息增益在这里我不打算讲了,详细请看这篇博文

下面给出一些计算公式:

header1

ID3算法

ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。下面来看看详细的算法过程

  • 输入: 训练数据集D,特征集A,阈值ε;
  • 输出:决策树T;
  • 过程:
    1. 若当前可用的D中的所有实例仅有一个类C,则将类C作为当前T的当前结点,返回T;
    2. 若A=Ф(即:没有可用特征。如:一开始就没有特征给你用或经过一定次数的分类后,特征已用过一遍),则将D中实例数最大的那个类作为T的当前结点,返回T;
    3. 若A≠Ф,则计算各特征的信息增益,选择信息增益最大的特征Ag;
    4. 若Ag的信息增益小于阈值ε,则用当前D中实例数最大的类作为该节点的类标记,返回T;
    5. 否则,根据Ag中每一个值ai将当前的D分割成若干个非空子集Di,将Di中实例数最大的类作为标记,构建子结点,由节点集子结点构成T,返回T;
    6. 对第i个子结点,以Di为训练集,以ai为特征集,递归的调用1~5步,得到子树Ti,返回Ti;

注意:停止构建树的临界点有如下: 1.提取特征后,剩下只有一个类。 2.Ag的信息增益小于阈值ε 3.没有特征可取。

例子:下面的例子来自《统计学习方法》(图片来自csnd):

header1

header1

header1

ID3算法只有树的生成,所以该算法生成的树容易产生过拟合,针对这个问题,下面有专门的枝剪算法来防止过拟合。

信息增益比的生成决策树的算法和ID3的算法类似,所以下面讲不再专门用信息增益比(C4.5算法)来举例。

信息增益比

  • 若 g(X,Y)表示信息增益,H(X)表示信息熵,则信息增益比为:gR(X,Y) = g(X, Y) / H(X)。相信看懂信息增益的小伙伴看着这个信息增益比也是很好理解的。

C4.5算法

  • ID3算法存在一个问题,就是偏向于多值属性,例如,如果存在唯一标识属性ID,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。
  • C4.5算法就是将ID3第三步的信息增益换成信息增益比,其他不变。

ID3和C4.5算法的特点

上面我们说了ID3和C4.5算法,下面我们就来总结下他们的特点:

  1. ID3对于多值特征 对于取值多的属性,尤其一些连续型数值,比如两条地理数据的距离属性,这个单独的属性就可以划分所有的样本,使得所有分支下的样本集合都是“纯的”也就是说这时候按照信息增益切分各部分都是纯的熵最小是0 ,但是这种切分没有意义(最极端的情况是每个叶子节点只有一个样本)。

一个属性的信息增益越大,表明属性对样本的熵减少的能力更强,这个属性使得数据由不确定性变成确定性的能力越强。 所以如果是取值更多的属性,更容易使得数据更“纯”(尤其是连续型数值),其信息增益更大,决策树会首先挑选这个属性作为树的顶点。结果训练出来的形状是一棵庞大且深度很浅的树,这样的划分是极为不合理的。

  1. C4.5,增益率准则对可取值数目较少的属性有所偏好,因此实际中,我们先从候选划分属性中找出信息增益高于平均水平的属性,再从中选出增益率最高的。

基尼指数和基尼指数(Gini)

从节点的训练数据集D计算现有特征对该数据集的基尼指数(Gini)。此时,对每一个特征A,对其可能取得每一个值a,根据“样本A = a的结果是‘是’或‘否’”将D分割成D1,D2两部分,利用式①计算A = a 时的Gini。

PS:基尼指数(Gini)代表了某一集合的不确定性,Gini越大,样本集合的不确定性就越大,这点和熵相似。其实,我们可以将信息增益和基尼系数进行对比,他们的关系可以见下图:

header1

CART生成算法(二叉分类树)

  • 输入:训练数据D,停止计算的条件
  • 输出:CART决策树(二叉树)
  • 过程:
    1. 从节点的训练数据集D计算现有特征对该数据集的基尼指数(Gini)。此时,对每一个特征A,对其可能取得每一个值a,根据“样本A = a的结果是‘是’或‘否’”将D分割成D1,D2两部分,利用式①计算A = a 时的Gini。
    2. 在所有可能的特征A以及它们所有可能的切分点a中选择Gini最小的特征及其对应的切分点作为最优特征和最优切分点,然后依据最优特征与最优切分点从现节点生成两个子结点,最后将训练数据集依据特征分配到两个子结点中去。
    3. 对两个子结点递归的调用上面两步直至满足停止条件。
    4. 生成CART决策树。

    PS:算法的停止条件是“节点的样本个数 < 预定阈值”或“样本集合的Gini < 预定阈值(样本基本属于同一类)”或“无更多特征”。

例子: 下面来看一个具体的例子。我们使用下图所示的数据集来作为示例,为了便于后面的叙述,我们将其再列出如下:

header1

首先对数据集非类标号属性{是否有房,婚姻状况,年收入}分别计算它们的Gini系数增益,取Gini系数增益值最大的属性作为决策树的根节点属性。根节点的Gini系数

header1

当根据是否有房来进行划分时,Gini系数增益计算过程为

header1

header1

若按婚姻状况属性来划分,属性婚姻状况有三个可能的取值{married,single,divorced},分别计算划分后的

  • {married} {single,divorced}
  • {single} {married,divorced}
  • {divorced} {single,married}

的Gini系数增益。

header1

对比计算结果,根据婚姻状况属性来划分根节点时取Gini系数增益最大的分组作为划分结果,也就是{married} {single,divorced}。

最后考虑年收入属性,我们发现它是一个连续的数值类型。我们在前面的文章里已经专门介绍过如何应对这种类型的数据划分了。对此还不是很清楚的朋友可以参考之前的文章,这里不再赘述。

对于年收入属性为数值型属性,首先需要对数据按升序排序,然后从小到大依次用相邻值的中间值作为分隔将样本划分为两组。例如当面对年收入为60和70这两个值时,我们算得其中间值为65。倘若以中间值65作为分割点。Sl作为年收入小于65的样本,Sr表示年收入大于等于65的样本,于是则得Gini系数增益为

header1

其他值的计算同理可得,我们不再逐一给出计算过程,仅列出结果如下(最终我们取其中使得增益最大化的那个二分准则来作为构建二叉树的准则):

header1

最大化增益等价于最小化子女结点的不纯性度量(Gini系数)的加权平均值,之前的表里我们列出的是Gini系数的加权平均值,现在的表里给出的是Gini系数增益。现在我们希望最大化Gini系数的增益。根据计算知道,三个属性划分根节点的增益最大的有两个:年收入属性和婚姻状况,他们的增益都为0.12。此时,选取首先出现的属性作为第一次划分。

header1

对于年收入属性则有:

header1

最后我们构建的CART如下图所示:

header1

最后我们总结一下,CART和C4.5/ID3的主要区别: C4.5/ID3采用信息增益/信息增益率来作为分支特征的选择标准,而CART则采用Gini系数; C4.5/ID3不一定是二叉树,但CART一定是二叉树。

二叉回归树

  • 对回归树:用平方误差最小化准则,进行特征选择,生成二叉树,在这篇博文不讲了。

决策树的剪枝

因为决策树的生成算法容易构建过于复杂的决策树,产生过拟合。而剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型,在这里我们可以联想其实剪枝就是一直正则化手段,简化模型,防止过拟合!下面我们进行详细介绍:

先(预)剪枝

预剪枝是指在决策树生成过程中,对每个结点事先估计,若不能提升泛化性能,则停止划分当前结点。预剪枝降低了过拟合的风险,也减少了决策树的训练时间,但是它是一种“贪心算法”很有可能会造成欠拟合。

后剪枝

决策树的剪枝(针对ID3/C4.5生成的决策树)

在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning)。具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型. 决策树的剪枝往往通过极小化决策树整体的损失函数(loss fimction)或代价函数( cost function)来实现。 设树T的叶结点个数为|T|, t是树T的叶结点,该叶结点有Nt个样本点,其中k类的样本点有Ntk个,k=1,2,…,K,Ht(T)为叶结点t上的经验嫡,a>=0为参数,则决策树学习的损失函数可以定义为

header1

其中:

header1

因前面的一项可以表示为:

header1

则最终公式为:

header1

C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T|表示平莫型复杂度,参数a>=0控制两者之间的影响。剪枝,就是当a确定时,选择损失函数最小的模型,即损失函数最小的子树。损失函数正好表示了对模型的复杂度和训练数据的拟合两者的平衡。 决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合,学习局部的模型; 决策树剪枝通过优化损失函数还考虑了减小模型复杂度,学习整体的模型。 利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择。

header1

header1

CART剪枝

其实CART剪枝有挺多方式的,但在这里我只讲一种简单的常用的(也就是该博文中的:CCP—代价复杂度剪枝),其他方式可以看看这篇博文

来看下原文

header1 header1

header1

剪枝总结:

  1. 我们可以说:决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合,学习局部的模型;决策树剪枝通过优化损失函数还考虑了减小模型复杂度,学习整体的模型。
  2. 后剪枝决策树比起预剪枝决策树保留了更多的分支。在一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但同时其训练时间花销也比较大。

参考资料:

《统计学习方法》-李航
《机器学习》-周志华
《机器学习实战》-Peter Harrington
斯坦福大学公开课-机器学习
网上的各位大牛的博文


Tags:
Stats:
comments


Share: