决策树模型详解(二)之如何生成决策树以及剪枝

决策树生成

1 决策树生成过程概述

首先构建根结点,将所有训练数据都放在根结点。选择一个最优特征,按照这一特征将训练数据集分割成子集。如果这些子集己经能够被基本正确分类,那么构建叶结点, 并将这些子集分到所对应的叶结点中去。如果还有子集不能被基本正确分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的结点。如此递归地进行下去,直至所有训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶结点上,即都有了明确的类。这就生成了一棵决策树。

下面介绍决策树生成的两种算法

ID3算法

ID3 算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。 具体方法是:从根结点 (root node) 开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点: 再对子结点递归地调用以上方法,构建决策树:直到所有特征的信息增益均很小或没。有特征可以选择为止。 最后得到一棵决策树。

接下来举个例子吧 概念还是抽象滴
数据集还是前面的贷款数据集 现在我们根据ID3算法来构建一棵决策树

ID 年龄 有工作 有自己的房子 信贷情况 类别
1 青年 一般
2 青年
3 青年
4 青年 一般
5 青年 一般
6 中年 一般
7 中年
8 中年
9 中年 非常好
10 中年 非常好
11 老年 非常好
12 老年
13 老年
14 老年 非常好
15 老年 一般

决策树模型详解(一)之如何进行特征选择我们已经算过了 有自己房子这个特征是分类的最优特征 所以就拿它作为根节点
决策树模型详解(二)之如何生成决策树以及剪枝现在的数据只剩下所有 有自己房子这个属性 值为否的数据

ID 年龄 有工作 有自己的房子 信贷情况 类别
1 青年 一般
2 青年
3 青年
4 青年 一般
5 中年 一般
6 中年
7 老年
8 老年 非常好
9 老年 一般

我们现在要在现在的数据集D上选出2号最优特征
首先计算熵
决策树模型详解(二)之如何生成决策树以及剪枝
之后求各个特征的信息增益
决策树模型详解(二)之如何生成决策树以及剪枝决策树模型详解(二)之如何生成决策树以及剪枝
因为有工作这个特征的信息增益最大 将它作为2号最优特征

决策树模型详解(二)之如何生成决策树以及剪枝我们发现有工作这个特征 已经完全将数据分开 至此决策树构建完毕,该决策树只用到了两个特征

整理一下ID3的算法过程
输入:训练数据集 D, 特征集 A 阈值 ε
输出:决策树 T
(1) 若D中的数据都属于某一类Ck 则决策树T中只有一个结点,它的类标记为Ck 返回T.
(2) 若特征集A为空 ,则决策树T中只有一个结点,如果类标记为Ck的数据最多,则将该结点的类标记为Ck并返回T
(3) 否则 计算信息增益最大的特征 Ag
(4) 如果 Ag 的信息增益小于阈值 ε,则决策树T中只有一个结点,如果类标记为Ck的数据最多,则将该结点的类标记为Ck并返回T
(5)否则 根据Ag的不同取值,分割数据集,构建子结点,以 A一{Ag} 为特征集,对每个子结点递归的执行上述步骤

ID3算法的缺陷
(1)ID3算法没有考虑连续特征,比如工资、长度等
(2) ID3算法没有进行剪枝,容易过拟合
(3)ID3倾向于选择取值比较多的属性作为决策结点

C4.5算法
由于 ID3算法中存在着一些缺陷,针对ID3算法的不足,昆兰做了改进,于是就有了C4.5算法。
C4.5 在生成的过程中,用信息增益比来选择特征。 其余过程类似于ID3算法。
并且 C4.5 中还增加了对取值是连续的特征的处理
下面介绍一下是如何C4.5处理连续特征的
给定一个数据集 我们可以看出密度和含糖率这两个特征取值都是连续值
决策树模型详解(二)之如何生成决策树以及剪枝我们拿密度这个特征来讲解一下
决策树模型详解(二)之如何生成决策树以及剪枝我们对图中 16个切点都按如图所示的方法进行信息增益的计算 发现 切点值=0.381的切点算出的信息增益最大,所以就拿它的信息增益作为密度这个特征的信息增益

决策树的剪枝

决策树生成算法在学习的时候过于考虑如何正确的划分训练数据,从而导致决策树在训练数据上表现较好,而对于一个未知的测试数据的分类却没有那么准确,也就是决策树产生了过拟合现象。所以我们要对复杂的决策树进行简化(剪枝),使它具有一定的泛化能力。具体地,就是去掉过于细分的叶结点,使其回退到父结点,甚至更高的结点,然后将父结点或更高的结点改为新的叶结点。

决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。
损失函数:定义在单个训练样本上的,也就是就算一个样本的误差
代价函数:定义在整个训练集上面的,也就是所有样本的误差的总和的平均

决策树的损失函数

先说几个符号
|T| 表示树T的叶子结点个数
t 是一个变量 表示树T的叶结点 比如 1表示第一个叶结点 2 表示第二个叶结点…
Nt 表示某个叶结点包含了多少个样本 比如说之前我们根据贷款的数据建立了一棵决策树。我们的根结点是特征有自己的房子 根据这个特征的取值有 无 产生了第一个叶结点t=1 是 则这个结点包含的数据就是所有 有自己房子这个特征取值是 是 的数据 通过查看数据发现 有自己房子取值是 是 的数据占了6条 则 N1=6
决策树模型详解(二)之如何生成决策树以及剪枝
Ntk 前面介绍Nt 表示某个叶结点包含了多少个样本。 而这些样本可能包含多个分类,其中第 k类样本点有Ntk
Ht(T) 为 叶结点 t上的经验熵

决策树的损失函数定义为
决策树模型详解(二)之如何生成决策树以及剪枝其中经验熵的定义是
决策树模型详解(二)之如何生成决策树以及剪枝
决策树模型详解(二)之如何生成决策树以及剪枝
决策树模型详解(二)之如何生成决策树以及剪枝该如何理解这个损失函数呢 ?
我们可以类比我们之前见过的损失函数
决策树模型详解(二)之如何生成决策树以及剪枝其中 a|T| 和 r(d) 都是一个正则化项 防止过拟合
|T| 表示模型的复杂度
参数 α>=0 控制两者之间的影响。较大的 α 促使选择较简单的模型 ,较小的 α 促使选择较复杂的模型。

决策树模型详解(二)之如何生成决策树以及剪枝表示模型预测的值与真实值的误差 当预测值=真实值时,预测完全正确 ,损失值为0
基于此我们来探索一下决策树模型详解(二)之如何生成决策树以及剪枝有什么意义呢?

我们可以看出之前的损失函数是建立在预测值和损失值之间的误差上的,根据这个思路我们想一下决策树的误差在哪?

通过这么久的学习 我们也应该清楚,决策树建立的时候每一步决策(选择哪个特征继续建立下去) 都是基于是否能够更好的去划分数据的类别,降低分类的不确定性。对于决策树每个结点来说 它的误差就是那个不确定性的大小,也就是信息熵的大小(因为信息熵越大,不确定性越大) 。所以我们损失函数就是基于叶子结点的分类的不确定性 (也就是叶子结点的信息熵) 。

树的剪枝算法

输入:树的生成算法产生的整个树 T, 参数 α
输出:修剪后的子树Ta
1 计算每个叶子结点的经验熵
2 递归地从树的叶结点向上回缩
设一组叶结点回缩到父结点之前与之后的整体树分别为 TB 与 TA 其对应的损失函数值分别是Ca(TB) 与Ca(TA) 如果
决策树模型详解(二)之如何生成决策树以及剪枝则进行剪枝,即将父结点变为新的叶结点

如图所示

决策树模型详解(二)之如何生成决策树以及剪枝