决策树算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

决策树的思想就是程序设计中的条件分支结构,其实就是if-else结构,最早的决策树就是利用这类结构来分割数据


一、什么是决策树?

决策树:是一种树形结构,其中每一个内部节点表示一个属性上的判断,每一个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,本质是一颗有多个判断节点组成的树。
下面给出一个例子:
在这里插入图片描述

二、决策树分类原理

思考:

  • 这个女生为什么把年龄放在最上面
  • 上面案例是女生通过定性的主观意识,把年龄放在最上面,那么如果需要对该过程进行量化,又该如何人处理?
    想要知道上面的结果就需要用到信息熵和信息增益。

1.熵

1.1 慨念

物理学中,熵 Entropy是“混乱”程度的量度。

在这里插入图片描述
系统越有序,熵值越低;系统越混乱或分散,熵值越高。
1948年香农提出了信息熵(Entropy)的概念。

- 信息理论:
1、从信息的完整性上进行描述:

当系统的有序状态一致时,数据集集中的地方熵值越小,数据越分散的地方熵值越大。

2、从信息的有序性上进行的描述:

当数据量一致时,系统越有序,熵值越低;系统越混乱或分散,熵值越高。

“信息熵”(information entropy)是度量样本集合纯度最常用的一种指标。

假定当前样本集合 D D D中第 k k k类样本所占比例为 p k pk pk ( k = 1 , 2 , . . . ∣ y ∣ k=1,2,...|y| k=1,2,...∣y)
p k = C K D {pk=\frac{C^{K} }{D}} pk=DCK上面的式子中 D D D为样本的所以数量。 C k {C^{k}} Ck为第k类样本的数量。
D D D的信息熵定义为(log是以2为底,lg是以10为底):

E n t ( D ) = − ∑ k = 1 n C K D l o g C K D = − ∑ k = 1 n p k log ⁡ 2 p k = − p 1 log ⁡ 2 p 1 − p 2 log ⁡ 2 p 2 − . . . − p n log ⁡ 2 p n Ent(D)=-\sum_{k=1}^{n}\frac{C^{K} }{D}log\frac{C^{K} }{D}=-\sum_{k=1}^{n} p_{k} \log_{2}{ p_{k}} =- p_{1}\log_{2}{ p_{1}} -p_{2}\log_{2}{ p_{2}} -...-p_{n}\log_{2}{ p_{n}} Ent(D)=k=1nDCKlogDCK=k=1npklog2pk=p1log2p1p2log2p2...pnlog2pn

其中: E n t ( D ) Ent(D) EntD的值越小,则 D D D的纯度越高。

1.2 案例

在这里插入图片描述
在这里插入图片描述

2.决策树的划分依据一——信息增益

2.1 概念

信息增益:以某种特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合 D D D划分效果的好坏。

信息增益=entroy(前)-entroy(后)

  • 定义与公式
    假定离散属性a有V个可能的取值:
    a 1 , a 2 , . . . , a V a^{1},a^{2},...,a^{V} a1a2...aV
    若使用a来对样本集D进行划分,则会产生V个分支点,
    其中第v个分支点包含了D中所有在属性a上取值为 a V {a^{V} } aV的样本,记为 D v {D^{v }} Dv,我们可以根据前面给出的信息熵公式计算出 D v {D^{v }} Dv的信息熵,再考虑到不同分支节点所包含的样本数不同,给分支节点赋值权重 ∣ D v ∣ ∣ D ∣ {\frac{\left |D ^{v} \right | }{\left |D \right | } } DDv

即样本数越多的分支节点的影响越大,于是可计算出用属性a对样本集DD进行划分时所获得的“信息增益”(information gain)

其中:
特征a对训练数据集D的信息增益Gain(D,a),定义为**集合D的信息熵Ent(D)与给定特征a条件下D的信息条件熵Ent(D|a)之差,**公式为:
G a i n ( D , a ) = E n t ( D ) − E n t ( D ∣ a ) = E n t ( D ) − ∑ v = 1 V D v D E n t ( D v ) Gain(D,a)=Ent(D)-Ent(D|a)=Ent(D)-\sum_{v=1}^{V}\frac{D^{v} }{D}Ent(D^{v}) Gain(D,a)=Ent(D)Ent(Da)=Ent(D)v=1VDDvEnt(Dv)

公式的详细解释:
信息熵的计算:
E n t ( D ) = − ∑ k = 1 n C K D l o g C K D Ent(D)=-\sum_{k=1}^{n}\frac{C^{K} }{D}log\frac{C^{K} }{D} Ent(D)=k=1nDCKlogDCK

条件熵的计算:
E n t ( D , a ) = ∑ v = 1 V D v D E n t ( D v ) = − ∑ v = 1 V D v D ∑ k = 1 K C k v D v log ⁡ C k v D v Ent(D,a)=\sum_{v=1}^{V}\frac{D^{v} }{D}Ent(D^{v})=-\sum_{v=1}^{V}\frac{D^{v} }{D}\sum_{k=1}^{K}\frac{C^{kv} }{D_{v} }\log_{}{\frac{C^{kv}}{D_{v}} } Ent(D,a)=v=1VDDvEnt(Dv)=v=1VDDvk=1KDvCkvlogDvCkv

其中:
D v D^{v} Dv表示a属性中第v个分支节点包含的样本数。

C k v C^{kv} Ckv表示a属性中第v个分支节点包含的样本数中,第k个类别下包含的样本数

一般而言,信息增益越大,则意味着使用a属性来进行划分所获得的“纯度提升”越大。因此,我们可用信息增益来进行决策树的划分属性选择,著名的ID3(iterative Dichotomiser 迭代二分器)决策树学习算法就是一信息增益为准则来选择划分属性。

2.2 案例

在这里插入图片描述
解答过程如下:
在这里插入图片描述
在这里插入图片描述
由以上分析可以得出:活跃度的信息增益比性别大,也就是说,活跃度对用户流失的影响比性别大。在做特征选择或者数据分析的时候,我们应该重点观察活跃度这个指标。

3.决策树的划分依据二——信息增益率

信息增益准则对可取值数⽬较多的属性有所偏好,为减少这种偏好可能带
来的不利影响,著名的 C4.5 决策树算法 不直接使⽤信息增
益,⽽是使⽤"增益率" (gain ratio) 来选择最优划分属性.
增益率:增益率是⽤前⾯的信息增益Gain(D, a)和属性a对应的"固有值"(intrinsic
value)

G a i n − r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain-ratio(D,a)=\frac{Gain(D,a)}{IV(a)} Gainratio(D,a)=IV(a)Gain(D,a)
其中
I V ( a ) = ∑ v = 1 V D v D l o g D v D IV(a)=\sum_{v=1}^{V}{\frac{D^{v}}{D} } log\frac{D^{v}}{D} IV(a)=v=1VDDvlogDDv
属性a的可能取值数目越多(即V越大),则IV(a)的值通常会越大

3.1案例

使用信息增益率进行计算
在这里插入图片描述
计算信息增益率:
在这里插入图片描述
活跃度的信息增益率更⾼⼀些,所以在构建决策树的时候,优先选择通过这种⽅式,在选取节点的过程中,我们可以降低取值较多的属性的选取偏好。

4.决策树的划分依据三——基尼值和基尼指数

4.1 概念

基尼值Gini(D):从数据集D中随机抽取两个样本,其类别标记不⼀致的概率。故,Gini(D)值越⼩,数据集D的纯度越⾼。
数据集 D 的纯度可⽤基尼值来度量:
G i n i ( D ) = ∑ k = 1 ∣ y ∣ ∑ k ! = k p k p k = 1 − ∑ k = 1 ∣ y ∣ p k 2 Gini(D)=\sum_{k=1}^{|y|}\sum_{k!=k }p_{k} p_{k} =1-\sum_{k=1}^{|y|}p_{k} ^{2} Gini(D)=k=1yk!=kpkpk=1k=1ypk2
D为样本总数量

4.2案例

在这里插入图片描述
1、对数据集非序列标号属性{是否有房,婚姻状况,年收入}分别计算它们的Gini指数,取Gini指数最小的属性作为决策树的根节点属性。

第一次大循环

2、根节点的Gini值为:
G i n i (是否拖欠贷款) = 1 − ( 3 10 ) 2 − ( 7 10 ) 2 = 0.42 Gini(是否拖欠贷款)=1-(\frac{3}{10} )^{2} -(\frac{7}{10} )^{2} =0.42 Gini(是否拖欠贷款)=1(103)2(107)2=0.42

3、当根据是否有房来进行划分时,Gini指数计算过程为:
G i n i (左子节点) = 1 − ( 0 3 ) 2 − ( 3 3 ) 2 = 0 Gini(左子节点)=1-(\frac{0}{3} )^{2} -(\frac{3}{3} )^{2} =0 Gini(左子节点)=1(30)2(33)2=0
G i n i (右子节点) = 1 − ( 3 7 ) 2 − ( 4 7 ) 2 = 0.4898 Gini(右子节点)=1-(\frac{3}{7} )^{2} -(\frac{4}{7} )^{2} =0.4898 Gini(右子节点)=1(73)2(74)2=0.4898
G i n i ( D , 是否有房) = 7 10 ∗ 0.4898 + 3 10 ∗ 0 = 0.343 Gini(D,是否有房)=\frac{7}{10} *0.4898+\frac{3}{10}*0=0.343 GiniD,是否有房)=1070.4898+1030=0.343

在这里插入图片描述
在这里插入图片描述
5、同理可得年收入Gini:
对于年收入属性为数值型属性,首先需要随数据按照升序排序,然后从小到大依次用相邻的中间值作为分隔将样本划分为两组。例如当面对年收入为60和70这两个值时,我们算的中间值为65,以中间值65作为分割点求出Gini指数。
在这里插入图片描述
根据计算知道,三个属性划分节点的指数最小有两个:年收入和婚姻状况,他们的Gini指数都为0.3。一般我们选用首先出现的属性作为第一次的划分。

第二次大循环

6、接下来,采用同样的方法,分别计算剩下的属性,其中根节点的Gini系数为(此时是否拖欠贷款的各有3个records)
G i n i (是否拖欠贷款) = 1 − ( 3 6 ) 2 − ( 3 6 ) 2 = 0.5 Gini(是否拖欠贷款)=1-(\frac{3}{6}) ^{2} -(\frac{3}{6}) ^{2} =0.5 Gini(是否拖欠贷款)=1632632=0.5

7、对于是否有房属性,可得:
G i n i _ i n d e x ( D , 是否有房) = 2 6 ∗ 0 + 4 6 ∗ [ 1 − ( 3 4 ) 2 − ( 1 4 ) 2 ] = 0.25 Gini\_index(D,是否有房)=\frac{2}{6}*0+\frac{4}{6}*[1-(\frac{3}{4})^2-(\frac{1}{4})^2]=0.25 Gini_indexD,是否有房)=620+64[1(43)2(41)2]=0.25

8、对于年收入属性则有:

在这里插入图片描述
经过上述流程,构建的决策树,如下图:
在这里插入图片描述
总结的CART的算法流程

while(当前节点“不纯”):
1.遍历每一个变量的每一种分割方式,找到最好的分割点
2.分割成两个节点N1和N2
end while
每一个节点足够“纯”为止

基尼指数Gini_index(D):⼀般,选择使划分后基尼系数最⼩的属性作为最优化分属性。
G i n i − i n d e x ( D , a ) = ∑ v = 1 V D v D G i n i ( D ) Gini-index(D,a)=\sum_{v=1}^{V}{\frac{D^{v} }{D} } Gini(D) Giniindex(Da)=v=1VDDvGini(D)
GINI系数较多的用在决策树中是有原因的。因为决策树是一个纵向有深度的预测模型,它通过不断的向下伸展,提高深度,同时将样本划分为不同的类别。

计算流程:

  • 计算每个节点的基尼得分;
  • 计算划分出的所有节点基尼得分的加权平均和;
  • 比较各种划分方式所得到的所有节点的基尼平均和,Gini加权平均和超过父节点的Gini得分,并且Gini加权平均和最大的划分方式作为最终的划分方式。

(1)如何计算划分出的某一个子节点的Gini得分

  1. 一个子节点的Gini得分=节点中各类别记录数所占的百分比的平方和。
    比如:一个决策树的目标变量有两个分类A和B,一个子节点,A的记录占比是80%,B的记录占比是20%,那么,本节点的Gini得分为0.80.8+0.20.2=0.64+0.04 = 0.68。

(2)如何计算划分出的所有子节点的Gini加权平均和

  1. 计算每个子节点的Gini得分
  2. 计算每个子节点的Gini得分加权平均值;
    例如:一个子节点的Gini得分加权平均值=节点Gini得分节点记录数占所有子节点总记录数的比例。比如:一个子节点的Gini得分是0.68,本节点有3000个记录,另外还有两个子节点,记录数分别为5000和2000,那么,本节点的Gini得分加权平均值是:0.683000/(3000+5000+2000)=0.68*0.3= 0.204

5、小结

在这里插入图片描述

5.1.1 ID3 算法

存在的缺点
(1) ID3算法在选择根节点和各内部节点中的分⽀属性时,采⽤信息增益作为评价标准。信息增益的缺点是倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息.
(2) ID3算法只能对描述属性为离散型属性的数据集构造决策树。

5.1.2 C4.5算法

做出的改进(为什么使⽤C4.5要好)
(1) ⽤信息增益率来选择属性
(2) 可以处理连续数值型属性
(3)采⽤了⼀种后剪枝⽅法
(4)对于缺失值的处理
C4.5算法的优缺点
优点:
产⽣的分类规则易于理解,准确率较⾼。
缺点:
在构造树的过程中,需要对数据集进⾏多次的顺序扫描和排序,因⽽导致算法的低效。此外,C4.5只适合于能够驻留于内存的数据集,当训练集⼤得⽆法在内存容纳时程序⽆法运⾏。

5.1.3 CART算法

CART算法相⽐C4.5算法的分类⽅法,采⽤了简化的⼆叉树模型,同时特征选择采⽤了近似的基尼系数来简化计算。
C4.5不⼀定是⼆叉树,但CART⼀定是⼆叉树。

三、CART剪枝

3.1为什么要剪枝?

在这里插入图片描述

  • 图形描述
    • 横轴表示在决策树创建过程中树的结点总数,纵轴表示决策树的预测精度。
    • 实线显示的是决策树在训练集上的精度,虚线显示的则是在⼀个独⽴的测试集上测量出来的精度。
    • 随着树的增⻓,在训练样集上的精度是单调上升的, 然⽽在独⽴的测试样例上测出的精度先上升后下降。
  • 出现这种情况的原因:
    • 原因1:噪声、样本冲突,即错误的样本数据
    • 原因2:特征即属性不能完全作为分类标准
    • 原因3:巧合的规律性,数据量不够⼤

剪枝 (pruning)是决策树学习算法对付"过拟合"的主要⼿段。
在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分⽀过多,这时就可能因训练样本学得"太好"了,以致于把训练集⾃身的⼀些特点当作所有数据都具有的⼀般性质⽽导致过拟合。因此,可通过主动去掉⼀些分⽀来降低过拟合的⻛险

例如对下面的西瓜数据集,我们将其随机划分为两部分,其中编号为{1,2,3,6,7,10,14,15,16,17}的样例组成训练集,编号为{4,5,8,9,11,12,13}的样例组成验证集。
在这里插入图片描述
假定采用信息增益准则来划分属性选择,则上表中训练集将会生成一棵下面的决策树。
在这里插入图片描述

3.2剪枝方法

决策树剪枝的基本策略有"预剪枝" (pre-pruning)和"后剪枝"(post- pruning) 。

  • 预剪枝是指在决策树⽣成过程中,对每个结点在划分前先进⾏估计,若当前结点的划分不能带来决策树泛化性能提升,则停⽌划分并将当前结点标记为叶结点;
  • 后剪枝则是先从训练集⽣成⼀棵完整的决策树,然后⾃底向上地对⾮叶结点进⾏考察,若将该结点对应的⼦树替换为叶结点能带来决策树泛化性能提升,则将该⼦树替换为叶结点。

3.3预剪枝

首先,⾸先,基于信息增益准则,我们会选取属性"脐部"来对训练集进⾏划分,并产⽣ 3个分⽀,如下图所示。然⽽,是否应该进⾏这个划分呢?预剪枝要对划分前后的泛化性能进⾏估计。
在这里插入图片描述
在划分之前,所有样例集中在根节点。

  • 若不进⾏划分,该结点将被标记为叶结点,其类别标记为训练样例数最多的类别,假设我们将这个叶结点标记为"好⽠"。
  • ⽤前⾯表的验证集对这个单结点决策树进⾏评估。则编号为 {4,5,8} 的样例
    被分类正确。另外 4个样例分类错误,于是验证集精度为 3 7 \frac{3}{7} 73 ∗ 100% = 42.9%。

在⽤属性"脐部"划分之后,上图中的结点2、3、4分别包含编号为 {1,2,3,14}、 {6,7, 15, 17}、 {10, 16} 的训练样例,因此这 3 个结点分别被标记为叶结点"好⽠"、 “好⽠”、 “坏⽠”。

在这里插入图片描述
此时,验证集中编号为 {4, 5, 8,11, 12} 的样例被分类正确,验证集精度为 5 7 \frac{5}{7} 75 ∗ 100% = 71.4% > 42.9%.

于是,⽤"脐部"进⾏划分得以确定。然后,决策树算法应该对结点2进⾏划分,基于信息增益准则将挑选出划分属性"⾊泽"。然⽽,**在使⽤"⾊泽"划分后,编号为 {5} 的验证集样本分类结果会由正确转为错误,使得验证集精度下降为 57.1%。**于是,预剪枝策略将禁 ⽌结点2被划分。对结点3,最优划分属性为"根蒂",划分后验证集精度仍为 71.4%. 这个 划分不能提升验证集精度,于是,预剪枝策略禁⽌结点3被划分。对结点4,其所含训练样例⼰属于同⼀类,不再进⾏划分.于是,基于预剪枝策略从上表数据所⽣成的决策树如上图所示,其验证集精度为71.4%. 这是⼀棵仅有⼀层划分的决策树,亦称"决策树桩" (decision stump).

3.4后剪枝

后剪枝先从训练集⽣成⼀棵完整决策树,继续使⽤上⾯的案例,从前⾯计算,我们知前⾯构造的决策树的验证集精度为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%。
对⽐两种剪枝⽅法

  • 后剪枝决策树通常⽐预剪枝决策树保留了更多的分⽀。
  • ⼀般情形下,后剪枝决策树的⽋拟合⻛险很⼩,泛化性能往往优于预剪枝决策树。
  • 但后剪枝过程是在⽣成完全决策树之后进⾏的。 并且要⾃底向上地对树中的所有⾮叶结点进⾏逐⼀考察,因此其训练时间开销⽐未剪枝决策树和预剪枝决策树都要⼤得多.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值