机器学习-决策树
决策树 Decision tree
一、决策树概述
1.1 决策树介绍
1.1.1 定义
- 决策树是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析
- 例:
- 根据外面环境决定是否外出
- 根据外面环境决定是否外出
1.1.2 本质
- 本质上决策树是通过一系列规则对数据进行分类的过程
1.1.3 决策树的组成
- 根节点
- 决策结点:(非叶子节点) 决策结点代表一个问题或者决策.通常对应待分类对象的属性
- 分支: 测试的结果
- 叶子节点: 就是树最底部的节点,也就是决策结果
1.1.4 分类
(1)分类树
- 分类树使用信息增益或增益比率或其它绑定方式来划分节点,根据每个节点样本的类别情况投票决定测试样本的类别(输出为离散值)
(2)回归树(regression tree)
- 回归树(regression tree),顾名思义,就是用树模型做回归问题,每一片叶子都输出一个预测值(连续值)。预测值一般是该片叶子所含训练集元素输出的均值
1.2 相关术语
1.2.1 过拟合
- 算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题
1.3 剪枝
1.3.1 剪枝原因
- 当训练数据量大、特征数量较多时构建的决策树可能很庞大,这样的决策树用来分类是否好?答案是否定的。
- 决策树是依据训练集进行构建的,当决策树过于庞大时,可能对训练集依赖过多,也就是对训练数据过度拟合。从训练数据集上看,拟合效果很好,但对于测试数据集或者新的实例来说,并不一定能够准确预测出其结果。
- 因此,对于决策树的构建还需要最后一步----即决策树的修剪
1.4.1 预剪枝(Pre-Pruning)
(1)什么是预剪枝
- 在构造决策树的同时进行剪枝。
(2)思想
- 在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶节点
(3)过程
- 所有决策树的构建方法,都是在无法进一步降低熵的情况下才会停止创建分支的过程,为了避免过拟合,可以设定一个阈值,熵减小的数量小于这个阈值,即使还可以继续降低熵,也停止继续创建分支。
- 但是这种方法实际中的效果并不好。
1.4.2 后剪枝(Post-Pruning)
(1)什么是后剪枝?
- 后剪枝是在决策树生长完成之后,对树进行剪枝,得到简化版的决策树。
(2)过程
- 剪枝的过程是对拥有同样父节点的一组节点进行检查,判断如果将其合并,熵的增加量是否小于某一阈值。
- 如果确实小,则这一组节点可以合并一个节点,其中包含了所有可能的结果。
- 后剪枝是目前最普遍的做法。
后剪枝的剪枝过程是删除一些子树,然后用其叶子节点代替,这个叶子节点所标识的类别通过大多数原则(majority class criterion)确定。所谓大多数原则,是指剪枝过程中, 将一些子树删除而用叶节点代替,这个叶节点所标识的类别用这棵子树中大多数训练样本所属的类别来标识,所标识的类称为majority class
1.4.3 两种方式比较
- 后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情况下,后剪枝决策树欠拟合的风险很小,其泛化能力往往优于预剪枝预测数。 但由于其是基于创建完决策树之后,再对决策树进行自底向上地剪枝判断,因此训练时间开销会比预剪枝或者不剪枝决策树要大
1.5 决策过程
- 在沿着决策树从上到下的遍历过程中,在每个结点都有一个测试。
- 对每个结点上问题的不同测试输出导致不同的分枝,最后会达到一个叶子结点。
- 这一过程就是利用决策树进行分类的过程,利用若干个变量来判断属性的类别
二、理论基础
2.1 香农理论
2.1.1 信息量
- 假设事件ai的发生概率为p(ai),则事件ai的所含有或所提供的信息量I(ai)为:
例:
- 从直觉上讲,小概率事件比大概率事件包含的信息量大。
- 如果某件事情是“百年一见”则肯定比“习以为常”的事件包含的信息量大。端案例就是“太阳从东方升起”,因为为确定事件,所以不携带任何信息量。
2.1.2 平均信息量/信息熵
(1) 信息熵定义
- 信息量度量的是一个具体事件发生所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望
- 熵是度量样本集合纯度最常用的一种指标,它是信息的期望值,即 信息熵 = 平均信息量(信息量的期望)
(2) 平均信息量
- 假设有n个互不相容的事件a1,a2,a3,….,an,它们中有且仅有一个发生,则其平均的信息量可如下度量:
- 上式,对数底数可以为任何数,不同的取值对应了熵的不同单位。通常取2,
- 规定当p(ai)=0时:I(ai) = 0
(3)例
- 假设有一个数据集合D,其中只有两个类,一个是正例类,一个是负例类
计算D中正例类和负例类在三种不同的组分下熵的变化情况。- D中包含有50%的正例和50%的负例。
- D中包含有20%的正例和80%的负例。
- D中包含有100%的正例和0%的负例。
- D中包含有50%的正例和50%的负例。
2.1.3 条件熵
(1)定义
- 条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定的条件下随机变量Y的条件熵H(Y|X)
(2)公式推导
2.1.4 信息增益(Information gain)
(1) 信息增益定义
- 特征 A 对训练数据集 D 的信息增益 ,定义为集合 D 的经验熵(即为熵)与特征 A 给定条件下的经验条件熵之差,即:
其中特征 A 将数据集划分为: D1,D2,…,Dv,而经验条件熵为:
2.1.5 信息增益率 (Information Gain Ratio)
(1)信息增益率定义
-
对于样本集D中的离散属性A,为:
增益率=增益/数据集D以特征A作为随机变量的熵,即: -
之前是把集合类别作为随机变量,现在把某个特征作为随机变量,按照此特征的特征取值对集合D进行划分,计算熵HA(D):
- n为特征A的类别数
- |Di|为特征A的第i个取值对应的样本个数。
- |D|为样本个数。
-
分裂信息(Split information):
2.1.6 基尼系数
(1)基尼系数定义
-
基尼指数Gini(D)表示集合D不确定性,基尼指数Gini(D,A=a)表示集合D经A=a分割后的不确定性(类似于熵),基尼指数越小,样本的不确定性越小(与熵类似)。
-
假设K个类别,第k个类别的概率为pk概率分布的基尼系数表达式:
-
推导:
-
对于样本D,个数为|D|,假设K个类别,第k个类别的数量为|Ck|,则样本D的基尼系数表达式:
(2)二分类问题
-
如果是二分类问题,第一个样本输出概率为p,概率分布的基尼系数表达式为:
-
对于样本D,个数为|D|,根据特征A的某个值a,把D分成|D1|和|D2|,则在特征A的条件下,样本D的基尼系数表达式为
比较基尼系数和熵模型的表达式,二次运算比对数简单很多。尤其是二分类问题,更加简单。
(3)熵模型的度量方式比,基尼系数对应的误差
- 对于二分类
- 基尼系数和熵之半的曲线非常接近,仅在45度角附近误差稍大。因此,基尼系数可以做为熵模型的一个近似替代。
三、决策树算法
3.1 ID3算法
3.1.1 ID3算法简述
- ID3算法主要针对属性选择问题。是决策树学习方法中最具影响和最为典型的算法。
3.1.2 熵值对决策的影响
- 从上述的结果可以看到一个趋势,当数据变得越来越纯净时,熵的值变得
越来越小。事实上可以证明,当正例(0.5),反例(0.5)时,熵取最大值。,即,熵越大,节点的信息量越多,越不纯;当
D 中所有数据都只属于一个类时,熵得到最小值。 - 信息增益大,代表着熵小,所以确定性较高
- 显然,熵可以作为数据纯净度或混乱度的衡量指标。这正是决策树学习中需要的
3.1.3 算法思想
- ID3算法递归地构建决策树,当选择某个特征作为节点时,我们就希望这个特征的信息熵越小越好,那么不确定性越小
- 从根节点开始,对所有特征计算信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法构建决策树
- 知道所有特征的信息增益均很小或者没有特征可以选择为止, 最后得到一个决策树
3.1.4 递归返回条件
- 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分。(此时将所含样本最多的类别设置为该叶子节点类别)
- 熵小于阀值,熵的大小表示数据的复杂程度,当熵过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度时,节点停止分裂
- 决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂
- 当前节点包含的样本集合为空,不能划分。(将其父节点中样本最多的类别设置为该叶子节点的类别)
3.1.5 算法步骤
-
输入:训练数据集 D ,特征集 A , 阈值 ϵ ;
-
过程:函数 TreeGenerate(D,A) .
- 输出:以node为根节点的一棵决策树
3.1.6 缺点
- ID3没考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。
- ID3用信息增益作为标准容易偏向取值较多的特征。然而在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个变量A有2个值,各为1/2(H(Y|A) = 0.5(-0.5log0.5-0.5log0.5)+0.5(-0.5log0.5-0.5log0.5)=0.693),另一个变量B为3个值,各为1/3(H(Y|B)=3(1/3(-1/3log(1/3)+1/3(-1/3)log(1/3)+1/3(-1/3)log(1/3)))=0.610),其实他们都是完全不确定的变量,但是取3个值比取2个值的信息增益大。如何校正这个问题
- ID3算法没考虑缺失值问题。
- 没考虑过拟合问题
3.2 C 4.5 算法
3.2.1 为什么采用C 4.5 算法?
(1)ID3算法缺点
-
不能处理连续特征
- 长度,密度等
-
使用信息增益为标准偏向于取值较多的属性,容易造成过拟合与缺失值处理的问题
3.2.2 C4.5对以上缺点的改进
(1)对于信息增益作为标准容易偏向于取值较多特征的问题
-
C4.5思路:
引入一个信息增益比GR(Y,X),它是信息增益G(D,A)与特征熵HA(D)(也称分裂信息)(分裂信息(Split information)的倒数)的比- 特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题。
(2)对不能处理连续值特征,
- C4.5思路:将连续的特征离散化
- 将m个连续样本从小到大排列。(比如 m 个样本的连续特征A有 m 个,从小到大排列 a1,a2,…am)
- 取相邻两样本值的平均数,会得m-1个划分点。
- 其中第i个划分点 ti 表示为:
- 其中第i个划分点 ti 表示为:
- 对于这m-1个点,分别计算以该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点。(比如取到的增益最大的点为at,则小于at的值为类别1,大于at的值为类别2,这样就做到了连续特征的离散化。注意的是,与离散属性不同,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。)
- 用信息增益比选择最佳划分。
注意:
- 选择连续特征的分类点采用信息增益这个指标,因为若采用增益比,影响分裂点信息度量准确性,若某分界点恰好将连续特征分成数目相等的两部分时其抑制作用最大,而选择属性的时候才使用增益比,这个指标能选择出最佳分类特征。
- 例:(贷款问题)
收入/百 40 48 60 72 80 90 贷款成功与否 否 否 是 是 是 否 - 可以证明这时候的切分点,只能出现在目标分类不同的相邻实例之间,即出现在(48,60)和(80,90)之间,这时候选取切分点 s1=(48+60)/2=54 和 s2=(80+90)/2=85.
- 只需按照s1分类算出s1作为分割点的增益值和按照s2分类算出s2作为分割点的增益值
- 比较大小,选出最大的增益值所代表的分割点,
- 选出最大的为s1后,利用s1=54就可以将收入分成小于54和大于54两类
- 例:(贷款问题)
(3)对于缺失值处理的问题
- 赋上该属性最常见的值
- 根据节点的样例上该属性值出现的情况赋一个概率,比如该节点上有10个样本,其中属性A的取值有6个为是,4个为否.那么对改节点上缺失的属性A,以0.6的概率设为是,0.4的概率设为否.
- 丢弃有缺失值的样本
-
需要解决的两个问题:
- 在样本某些特征缺失的情况下选择划分的属性
- 选定了划分属性,对于在该属性上缺失特征的样本的处理
- 解决办法:
- 对于第一个子问题,对于某一个有缺失特征值的特征A。C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值A的数据D1,另一部分是没有特征A的数据D2. 然后对于没有缺失特征A的数据集D1来和对应的A特征的各个特征值一起计算加权重后的信息增益比,最后乘上一个系数,这个系数是无特征A缺失的样本加权后所占加权总样本的比例
- 对于第二个子问题,可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9
3.2.3 算法思想
- 与ID3算法不同的是,选举决策结点时,计算信息增益率,选择最大的进行特征作为当前结点
3.2.4 算法步骤
- 输入:训练数据集 D ,特征集 A , 阈值 ϵ ;
- 过程:函数 TreeGenerate(D,A) .
1 :计算节点信息增益比 Gainratio(D,a) :
2 :节点a的熵: Ent(D,a)
3 :节点D的熵: Ent(D)
4 :节点信息增益: Gain(D,a)=Ent(D)−Ent(D,a)
5 :节点固定值: IV(a)
6 :节点信息增益比: Gainratio(D,a)=Gain(D,a)IV(a)
7 :生成节点node:
8 :if D 中样本全属于同一类别 C then
9 : 将node标记为 C 类叶节点;return
10:end if
11:if A=∅ OR D 中样本在 A 上取值相同then
12: 将node标记为叶节点,期类别标记为 D 中样本数最多的类;return
13:end if
14:按照节点信息增益,从 A 中选择最优划分属性 a∗
15:for a∗ 中的每一个值 ai∗ do
16: 为node生成一个分支;令 Di 表示 D 中在 a∗ 上取值为 ai∗ 的样本子集;
17: if Di 为空,then
18: 将分支节点标记为叶节点,其类别标记为 D 中样本最多的类;return
19: else
20: 以 TreeGenerate(Di,A/a∗) 为分支节点
21: end if
22:end for
- 输出:以node为根节点的一棵决策树
3.2.6 决策树C4.5算法的不足与改进
- 决策树算法非常容易过拟合,因此对于生成的决策树要进行剪枝。C4.5的剪枝方法有优化的空间。思路主要是两种,一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。后面在下篇讲CART树的时候我们会专门讲决策树的减枝思路,主要采用的是后剪枝加上交叉验证选择最合适的决策树。
- C4.5生成的是多叉树,在计算机中二叉树模型会比多叉树运算效率高。多叉树改二叉树,可以提高效率。
- C4.5只能用于分类。
- C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化减少运算强度但又不牺牲太多准确性的话,因此用基尼系数代替熵模型
3.3 CART分类/回归树
3.3.1 为什么引入CART分类/回归树
- 在决策树算法原理(ID3,C4.5)中,提到C4.5的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处理分类不能处理回归。
- 对这些问题,CART(Classification And Regression Tree)做了改进,可以处理分类,也可以处理回归
3.3.2 结点选择标准
(1)对于分类树,使用平均基尼系数作为分类依据
- 假设训练集为D,其中特征 A 将数据集划分为: D1,D2,…,Di
- 其中Gini_i为数据集为Di,即A = ai时,的基尼值
- 计算出的平均基尼系数越小越好
(2)对于回归树,使用反差作为分类依据
- 条件同上
- 其中σ为数据集为Di,即A=ai时的方差,u为平均值
- 计算出的均方差之和越小越好,代表与正确数据的偏差越小
3.3.3 CART分类树算法对连续特征和离散特征的处理
(1)CART分类树算法对连续值的处理
- 思想和C4.5相同,都是将连续的特征离散化。唯一区别在选择划分点时,C4.5是信息增益比,CART是基尼系数
- 具体思路:m个样本的连续特征A有m个,从小到大排列a1,a2,…,am,则CART取相邻两样本值的平均数做划分点,一共取m-1个,其中第i个划分点Ti表示为:Ti = (ai + ai+1)/2。分别计算以这m-1个点作为二元分类点时的基尼系数。选择基尼系数最小的点为该连续特征的二元离散分类点。比如取到的基尼系数最小的点为at,则小于at的值为类别1,大于at的值为类别2,这样就做到了连续特征的离散化。
- 注意:与ID3、C4.5处理离散属性不同的是,如果当前节点为连续属性,则该属性在后面还可以参与子节点的产生选择过程
(2)CART分类树算法对离散值的处理
-
采用的思路:不停的二分离散特征。
-
在ID3、C4.5,特征A被选取建立决策树节点,如果它有3个类别A1,A2,A3,我们会在决策树上建立一个三叉点,这样决策树是多叉树。
- CART采用的是不停的二分。
- 会考虑把特征A分成{A1}和{A2,A3}、{A2}和{A1,A3}、{A3}和{A1,A2}三种情况,找到基尼系数最小的组合,比如{A2}和{A1,A3},然后建立二叉树节点,一个节点是A2对应的样本,另一个节点是{A1,A3}对应的样本。由于这次没有把特征A的取值完全分开,后面还有机会对子节点继续选择特征A划分A1和A3。这和ID3、C4.5不同,在ID3或C4.5的一颗子树中,离散特征只会参与一次节点的建立。
例
3.3.4 CART分类树算法思想
- 从根节点开始,对节点计算现有特征的基尼指数
- 对每一个特征,例如A,再对其每个可能的取值如a,根据样本点对A=a的结果的”是“与”否“划分为两个部分,利用公式2.1.6(2)进行计算
- 在所有可能的特征A以及该特征所有的可能取值a中,选择基尼指数最小的特征及其对应的取值作为最优特征和最优切分点
- 根据最优特征和最优切分点,将本节点的数据集二分,生成两个子节点
- 对两个字节点递归地调用上述步骤,直至节点中的样本个数小于阈值,或者样本集的基尼指数小于阈值,或者没有更多特征后停止
- 生成CART分类树
3.3.6 CART剪枝
(1)后剪枝算法思想
- 剪枝的过程就是一个动态规划的过程:从叶结点开始,自底向上地对内部结点计算预测误差以及剪枝后的预测误差,如果两者的预测误差是相等或者剪枝后预测误差更小,当然是剪掉的好。但是如果剪枝后的预测误差更大,那就不要剪了。剪枝后,原内部结点会变成新的叶结点,其决策类别由多数表决法决定。不断重复这个过程往上剪枝,直到预测误差最小为止
(2)剪枝过程
- 令决策树的非叶子节点为{T1,T2,T3,…,Tn}
- 计算所有非叶子节点的表面误差率增益值 a={a1,a2,a3,…,an}
- 选择表面误差率增益值 ai 最小的非叶子节点 Ti(若多个非叶子节点具有相同小的表面误差率增益值,选择节点数最多的非叶子节点)
- 对 Ti 进行剪枝
(3)计算
-
表面误差率增益值
- 其中R(t)表示叶子节点的误差代价
- r(t)为结点错误率
- p(t)为结点数据量的占比
- R(T)表示子树的误差代价,如果该节点不被剪枝。它等于子树T上所有叶子节点的误差代价之和
- r_i(t)为子结点i的错误率
- p_i(t)表示结点i的数据结点占比
- N(t)表示子树叶结点个数
- 其中R(t)表示叶子节点的误差代价
-
例
三、总结
3.1 三种算法比较
3.1.1 对比
算法 | 支持模型 | 树结构 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 | 特征值属性多次使用 |
---|---|---|---|---|---|---|---|
ID3 | 分类 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 | 不支持 |
C4.5 | 分类 | 多叉树 | 信息增益率 | 支持 | 支持 | 支持 | 不支持 |
CART | 分类,回归 | 二叉树 | 基尼系数,均方差 | 支持 | 支持 | 支持 | 支持 |
上一篇: java生成图片验证码示例程序