目录
1.认识决策树
2.决策树分类原理
2.1 熵
2.1.1 概念
2.1.2 案例
2.2 决策树的划分依据-----信息增益
2.2.1 概念
2.2.2 案列:
2.3 决策树的划分依据二-----信息增益率
2.3.1 概念
2.3.2 案列
2.3.3 为什么使⽤C4.5要好
3 Cart剪枝
3.1 为什么要剪枝
3.2 常用的剪枝方法
3.2.1预剪枝
3.2.2 后剪枝
目录
1.认识决策树
2.决策树分类原理
2.1 熵
2.1.1 概念
2.1.2 案例
2.2 决策树的划分依据-----信息增益
2.2.1 概念
2.2.2 案列:
2.3 决策树的划分依据二-----信息增益率
2.3.1 概念
2.3.2 案列
2.3.3 为什么使⽤C4.5要好
3.1 为什么要剪枝
3.2 常用的剪枝方法
3.2.1预剪枝
3.2.2 后剪枝
什么是决策树呢?
决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一类分类学习方法。
决策树:
怎么理解这句话呢?通过一个对话例子
想⼀想这个⼥⽣为什么把年龄放在最上⾯判断! ! ! ! ! ! ! ! !
上⾯案例是⼥⽣通过定性的主观意识, 把年龄放到最上⾯, 那么如果需要对这⼀过程进⾏量化, 该如何处理呢?
此时需要⽤到信息论中的知识: 信息熵, 信息增益
物理学上,熵Entropy是“混乱”程度的量度。
如图所示,系统越有序,熵值越低;系统越混乱或者分散,熵值越高。
1948年香农提出了信息熵的概念
信息理论:
1、 从信息的完整性上进⾏的描述:
当系统的有序状态⼀致时, 数据越集中的地⽅熵值越⼩, 数据越分散的地⽅熵值越⼤。
2、 从信息的有序性上进⾏的描述:
当数据量⼀致时, 系统越有序, 熵值越低; 系统越混乱或者分散, 熵值越⾼。
"信息熵" (information entropy)是度量样本集合纯度最常⽤的⼀种指标。
假定当前样本集合 D 中第 k 类样本所占的⽐例为 ,
, D为样本的所有数量,
为第k类样本的数量。
则 D的信息熵定义为((log是以2为底, lg是以10为底) :
案例:
假设我们没有看世界杯的⽐赛, 但是想知道哪⽀球队会是冠军,
我们只能猜测某⽀球队是或不是冠军, 然后观众⽤对或不对来回答,
我们想要猜测次数尽可能少, 你会⽤什么⽅法?
答案:
⼆分法:
假如有 16 ⽀球队, 分别编号, 先问是否在 1-8 之间, 如果是就继续问是否在 1-4 之间,以此类推, 直到最后判断出冠军球队是哪⽀。
如果球队数量是 16, 我们需要问 4 次来得到最后的答案。 那么世界冠军这条消息的信息熵就是 4。那么信息熵等于4, 是如何进⾏计算的呢?
Ent(D) = -(p1 * logp1 + p2 * logp2 + ... + p16 * logp16) ,
其中 p1, ..., p16 分别是这 16 ⽀球队夺冠的概率。
当每⽀球队夺冠概率相等都是 1/16 的时: Ent(D) = -(16 * 1/16 * log1/16) = 4
每个事件概率相同时, 熵最⼤, 这件事越不确定。
小练习:
篮球⽐赛⾥, 有4个球队 {A,B,C,D} , 获胜概率分别为{1/2, 1/4, 1/8, 1/8},求Ent(D)。
信息增益: 以某特征划分数据集前后的熵的差值。 熵可以表示样本集合的不确定性, 熵越⼤, 样本的不确定性就越⼤。因此可以使⽤划分前后集合熵的差值来衡量使⽤当前特征对于样本集合D划分效果的好坏。
信息增益 = entroy(前) - entroy(后)
注: 信息增益表示得知特征X的信息⽽使得类Y的信息熵减少的程度
假设离散属性性别有2(男, 女) 个可能的取值
若使⽤a来对样本集 D 进⾏划分, 则会产⽣ V 个分⽀结点,
其中第v个分⽀结点包含了 D 中所有在属性a上取值为a 的样本, 记为D . 我们可根据前⾯给出的信息熵公式计算出D
的信息熵, 再考虑到不同的分⽀结点所包含的样本数不同, 给分⽀结点赋予权重
即样本数越多的分⽀结点的影响越⼤, 于是可计算出⽤属性a对样本集 D 进⾏划分所获得的"信息增益" (information gain)
其中:特征a对训练数据集D的信息增益Gain(D,a),定义为集合D的信息熵Ent(D)与给定特征a条件下D的信息条件熵Ent(D∣a)之
差, 即公式为:
其中:
表示a属性中第v个分⽀节点包含的样本数
表示a属性中第v个分⽀节点包含的样本数中, 第k个类别下包含的样本数
⼀般⽽⾔, 信息增益越⼤, 则意味着使⽤属性 a 来进⾏划分所获得的"纯度提升"越⼤。 因此, 我们可⽤信息增益来进⾏决策树的划分属性选择, 著名的 ID3 决策树学习算法 [Quinlan, 1986] 就是以信息增益为准则来选择划分属性。
如下图, 第⼀列为论坛号码, 第⼆列为性别, 第三列为活跃度, 最后⼀列⽤户是否流失。
我们要解决⼀个问题: 性别和活跃度两个特征, 哪个对⽤户流失影响更⼤?
通过计算信息增益可以解决这个问题, 统计上右表信息
其中Positive为正样本(已流失) , Negative为负样本(未流失) , 下⾯的数值为不同划分下对应的⼈数。
可得到三个熵:
a.计算类别信息熵
整体熵:
b1.计算性别属性的信息熵(a="性别")
b1.计算活跃度属性的信息熵(a="活跃度")
c2.计算活跃度的信息增益(a="活跃度")
活跃度的信息增益⽐性别的信息增益⼤, 也就是说, 活跃度对⽤户流失的影响⽐性别⼤。 在做特征选择或者数据分析的时候, 我们应该重点考察活跃度这个指标。
在上⾯的介绍中, 我们有意忽略了"编号"这⼀列.若把"编号"也作为⼀个候选划分属性, 则根据信息增益公式可计算出它的信息增益为 0.9182, 远⼤于其他候选划分属性。
计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就是其信息增益为0.9182. 但是很明显这么分类,最后出现的结果不具有泛化效果.⽆法对新样本进⾏有效预测。
实际上, 信息增益准则对可取值数⽬较多的属性有所偏好, 为减少这种偏好可能带来的不利影响, 著名的 C4.5 决策树算法 [Quinlan, 1993J 不直接使⽤信息增益, ⽽是使⽤"增益率" (gain ratio) 来选择最优划分属性。
增益率:增益率是⽤前⾯的信息增益Gain(D, a)和属性a对应的"固有值"(intrinsic value) [Quinlan , 1993J的⽐值来共同定义的。
其中:
属性 a 的可能取值数⽬越多(即 V 越⼤), 则 IV(a) 的值通常会越⼤。
案列一:
d .计算属性分裂信息度量
⽤分裂信息度量来考虑某种属性进⾏分裂时分⽀的数量信息和尺⼨信息, 我们把这些信息称为属性的内在信息(instrisic information) 。 信息增益率⽤信息增益/内在信息, 会导致属性的重要性随着内在信息的增⼤⽽减⼩(也就是说, 如果这个属性本身不确定性就很⼤, 那我就越不倾向于选取它) , 这样算是对单纯⽤信息增益有所补偿。
e.计算信息增益率
活跃度的信息增益率更⾼⼀些, 所以在构建决策树的时候, 优先选择通过这种⽅式, 在选取节点的过程中, 我们可以降低取值较多的属性的选取偏好。
案列二
如下图, 第⼀列为天⽓, 第⼆列为温度, 第三列为湿度, 第四列为⻛速, 最后⼀列该活动是否进⾏。我们要解决: 根据下⾯表格数据, 判断在对应天⽓下, 活动是否会进⾏?
该数据集有四个属性, 属性集合A={ 天⽓, 温度, 湿度, ⻛速}, 类别标签有两个, 类别集合L={进⾏, 取消}。
a.计算类别信息熵
类别信息熵表示的是所有样本中各种类别出现的不确定性之和。 根据熵的概念, 熵越⼤, 不确定性就越⼤, 把事情搞清楚所需要的信息量就越多。
b.计算每个属性的信息熵
每个属性的信息熵相当于⼀种条件熵。 他表示的是在某种属性的条件下, 各种类别出现的不确定性之和。 属性的信息熵越⼤, 表示这个属性中拥有的样本类别越不“纯”。
c.计算信息增益
信息增益的 = 熵 - 条件熵, 在这⾥就是 类别信息熵 - 属性信息熵, 它表示的是信息不确定性减少的程度。 如果⼀个属性的信息增益越⼤, 就表示⽤这个属性进⾏样本划分可以更好的减少划分后样本的不确定性, 当然, 选择该属性就可以更快更好地完成我们的分类⽬标。
信息增益就是ID3算法的特征选择指标。
假设我们把上⾯表格1的数据前⾯添加⼀列为"编号",取值(1--14). 若把"编号"也作为⼀个候选划分属性,则根据前⾯步骤: 计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就是其信息增益为0.940. 但是很明显这么分类,最后出现的结果不具有泛化效果.此时根据信息增益就⽆法选择出有效分类特征。 所以, C4.5选择使⽤信息增益率对ID3进⾏改进。
d.计算属性分裂信息度量
⽤分裂信息度量来考虑某种属性进⾏分裂时分⽀的数量信息和尺⼨信息, 我们把这些信息称为属性的内在信息(instrisic information) 。 信息增益率⽤信息增益/内在信息, 会导致属性的重要性随着内在信息的增⼤⽽减⼩(也就是说, 如果这个属性本身不确定性就很⼤, 那我就越不倾向于选取它) , 这样算是对单纯⽤信息增益有所补偿。
天⽓的信息增益率最⾼, 选择天⽓为分裂属性。 发现分裂了之后, 天⽓是“阴”的条件下, 类别是”纯“的, 所以把它定义为叶⼦节点, 选择不“纯”的结点继续分裂。
在⼦结点当中重复过程1~5, 直到所有的叶⼦结点⾜够"纯"。
现在我们来总结⼀下C4.5的算法流程
while(当前节点"不纯"):
1.计算当前节点的类别熵(以类别取值计算)
2.计算当前阶段的属性熵(按照属性取值下的类别取值计算)
3.计算信息增益
4.计算各个属性的分裂信息度量
5.计算各个属性的信息增益率
end while
当前阶段设置为叶⼦节点
1.⽤信息增益率来选择属性
克服了⽤信息增益来选择属性时偏向选择值多的属性的不⾜。
2.采⽤了⼀种后剪枝⽅法
避免树的⾼度⽆节制的增⻓, 避免过度拟合数据
3.对于缺失值的处理
在某些情况下, 可供使⽤的数据可能缺少某些属性的值。 假如〈x, c(x)〉 是样本集S中的⼀个训练实例, 但是其属性A的值A(x)未知。
处理缺少属性值的⼀种策略是赋给它结点n所对应的训练实例中该属性的最常⻅值;
另外⼀种更复杂的策略是为A的每个可能值赋予⼀个概率。
例如, 给定⼀个布尔属性A, 如果结点n包含6个已知A=1和4个A=0的实例, 那么A(x)=1的概率是0.6, ⽽A(x)=0的概率
是0.4。 于是, 实例x的60%被分配到A=1的分⽀, 40%被分配到另⼀个分⽀。
C4.5就是使⽤这种⽅法处理缺少的属性值。
1.横轴表示在决策树创建过程中树的结点总数, 纵轴表示决策树的预测精度。
2.实线显示的是决策树在训练集上的精度, 虚线显示的则是在⼀个独⽴的测试集上测量出来的精度。
3.随着树的增⻓, 在训练样集上的精度是单调上升的, 然⽽在独⽴的测试样例上测出的精度先上升后下降。
原因1: 噪声、 样本冲突, 即错误的样本数据。
原因2: 特征即属性不能完全作为分类标准。
原因3: 巧合的规律性, 数据量不够⼤。
剪枝 (pruning)是决策树学习算法对付"过拟合"的主要⼿段。
在决策树学习中, 为了尽可能正确分类训练样本, 结点划分过程将不断重复, 有时会造成决策树分⽀过多, 这时就可能因训练样本学得"太好"了, 以致于把训练集⾃身的⼀些特点当作所有数据都具有的⼀般性质⽽导致过拟合。 因此, 可通过主动去掉⼀些分⽀来降低过拟合的⻛险。
如何判断决策树泛化性能是否提升呢?
可使⽤前⾯介绍的留出法, 即预留⼀部分数据⽤作"验证集"以进⾏性 能评估。 例如对下表的⻄⽠数据集, 我们将其随机划分为两部分, 其中编号为 {1, 2, 3, 6, 7, 10, 14, 15, 16, 17} 的样例组成训练集, 编号为 {4, 5,8, 9, 11, 12, 13} 的样例组成验证集。
假定咱们采⽤信息增益准则来划分属性选择, 则上表中训练集将会⽣成⼀棵下⾯决策树。
为便于讨论, 我们对圈中的部分结点做了编号。
接下来, 我们⼀起看⼀下, 如何对这⼀棵树进⾏剪枝。
决策树剪枝的基本策略有"预剪枝" (pre-pruning)和"后剪枝"(post- pruning) 。
⾸先, 基于信息增益准则, 我们会选取属性"脐部"来对训练集进⾏划分, 并产⽣ 3 个分⽀, 如下图所示。 然⽽, 是否应该进⾏这个划分呢? 预剪枝要对划分前后的泛化性能进⾏估计。
在划分之前, 所有样例集中在根结点。
在⽤属性"脐部"划分之后, 上图中的结点2、 3、 4分别包含编号为 {1, 2, 3, 14}、 {6, 7, 15, 17}、 {10, 16} 的训练样例, 因此这 3 个结点分别被标记为叶结点"好⽠"、 "好⽠"、 "坏⽠"。
此时, 验证集中编号为 {4, 5, 8, 11, 12} 的样例被分类正确, 验证集精度为5/7 ∗ 100% = 71.4% > 42.9%.于是, ⽤"脐部"进⾏划分得以确定。
然后, 决策树算法应该对结点2进⾏划分, 基于信息增益准则将挑选出划分属性"⾊泽"。 然⽽, 在使⽤"⾊泽"划分后, 编号为 {5} 的验证集样本分类结果会由正确转为错误, 使得验证集精度下降57.1%。 于是, 预剪枝策略将禁 ⽌结点2被划分。
对结点3, 最优划分属性为"根蒂", 划分后验证集精度仍为 71.4%. 这个 划分不能提升验证集精度, 于是, 预剪枝策略禁⽌结点3被划分。
对结点4, 其所含训练样例⼰属于同⼀类, 不再进⾏划分。
于是, 基于预剪枝策略从上表数据所⽣成的决策树如上图所示, 其验证集精度为 71.4%. 这是⼀棵仅有⼀层划分的决策树, 亦称"决策树桩" (decision stump).
后剪枝先从训练集⽣成⼀棵完整决策树, 继续使⽤上⾯的案例, 从前⾯计算, 我们知前⾯构造的决策树的验证集精度为42.9%。
后剪枝⾸先考察结点6, 若将其领衔的分⽀剪除则相当于把6替换为叶结点。 替换后的叶结点包含编号为 {7, 15} 的训练样本, 于是该叶结点的类别标记为"好⽠", 此时决策树的验证集精度提⾼⾄ 57.1%。 于是, 后剪枝策略决定剪枝, 如下图所示。
然后考察结点5, 若将其领衔的⼦树替换为叶结点, 则替换后的叶结点包含编号为 {6, 7, 15}的训练样例, 叶结点类别标记为"好⽠'; 此时决策树验证集精度仍为 57.1%. 于是, 可以不进⾏剪枝.
对结点2, 若将其领衔的⼦树替换为叶结点, 则替换后的叶结点包含编号 为 {1, 2, 3, 14} 的训练样例, 叶结点标记为"好⽠"此时决策树的验证集精度提⾼⾄ 71.4%. 于是, 后剪枝策略决定剪枝.
对结点3和1, 若将其领衔的⼦树替换为叶结点, 则所得决策树的验证集 精度分别为 71.4% 与 42.9%, 均未得到提⾼,于是它们被保留。最终, 基于后剪枝策略所⽣成的决策树就如上图所示, 其验证集精度为 71.4%。
对⽐两种剪枝⽅法,
参考:黑马程序员课程