1、决策树定义

决策树模型呈现树形结构,在分类问题中,表示基于特征(属性或数值) 对实例进行分类的过程。
决策树学习本质上是从训练数据集中归纳出一组分类规则,其算法通常是一个递归地选择最优的特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个很好的分类的过程,如此递归地进行下去,直至所有训练数据子集能被基本正确分类。
决策树学习算法包括3部分:特征选择、树的生成和树的剪枝。常用的算法有ID3、C4.5和CART。

2、特征选择

特征选择在于选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率。目前特征选择的准则是信息增益、信息增益比及基尼指数(Gini指数)。

2.1、信息增益(ID3)

(1)概念补充
设XXX是一个取有限个值的离散随机变量,其概率分布为
P(X=xi)=Pi,i=1,2,...nP(X=x_i)=P_i,i=1,2,...nP(X=xi​)=Pi​,i=1,2,...n
则随机变量XXX的熵定义为
H(X)=−∑i=1npilogpiH(X)=-\sum_{i=1}^{n}{p_ilogp_i}H(X)=−i=1∑n​pi​logpi​
熵越大,随机变量的不确定性就越大。
条件熵H(Y∣X)H(Y|X)H(Y∣X)表示在已知随机变量XXX的条件下随机变量YYY的不确定性。随机变量XXX给定条件下随机变量YYY的条件熵H(Y∣X)H(Y|X)H(Y∣X),定义为XXX给定条件下YYY的条件概率分布的熵对XXX的数学期望
H(Y∣X)=∑i=1npiH(Y∣X=xi)H(Y|X)=\sum_{i=1}^{n}{p_iH(Y|X=x_i)}H(Y∣X)=i=1∑n​pi​H(Y∣X=xi​)
这里,pi=P(X=xi),i=1,2,...n.p_i=P(X=x_i),i=1,2,...n.pi​=P(X=xi​),i=1,2,...n.
(2)信息增益
特征AAA对训练数据集DDD的信息增益g(D∣A)g(D|A)g(D∣A),定义为集合DDD的经验熵H(D)H(D)H(D)与特征AAA给定条件下DDD的经验条件熵H(D∣A)H(D|A)H(D∣A)之差,即
g(D∣A)=H(D)−H(D∣A)g(D|A)=H(D)-H(D|A)g(D∣A)=H(D)−H(D∣A)
一般地,熵H(Y)H(Y)H(Y)与条件熵H(Y∣X)H(Y|X)H(Y∣X)之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
(3)信息增益算法
设训练数据集为DDD, ∣D∣|D|∣D∣表示样本个数。设有KKK个类CkC_kCk​, k=1,2,…,Kk=1,2,…,Kk=1,2,…,K,∣Ck∣|C_k|∣Ck​∣为属于类CkC_kCk​的样本个数, ∑k=1K∣Ck∣=∣D∣\sum_{k=1}^{K}|C_k|=|D|∑k=1K​∣Ck​∣=∣D∣。设特征AAA有nnn个不同的取值a1,a2,…,an{a_1,a_2,…,a_n}a1​,a2​,…,an​,根据特征AAA的取值将DDD划分为nnn个子集D1,D2,…,DnD_1,D_2,…,D_nD1​,D2​,…,Dn​,∣Di∣|D_i|∣Di​∣为DiD_iDi​的样本个数,∑i=1n∣Di∣=∣D∣\sum_{i=1}^{n}|D_i|=|D|∑i=1n​∣Di​∣=∣D∣。记子集DiD_iDi​中属于类CkC_kCk​的样本的集合为DikD_{ik}Dik​ ,即 Dik=Di∩CkD_{ik}=D_i\cap C_kDik​=Di​∩Ck​,∣Dik∣|D_{ik}|∣Dik​∣为DikD_{ik}Dik​的样本个数。
算法流程:
输入:训练数据集DDD和特征AAA;
输出:特征AAA对训练数据集DDD的信息增益g(D,A)g(D,A)g(D,A)。
(1)计算数据集D的经验熵H(D)H(D)H(D)
H(D)=−∑k=1KCkDlog⁡2CkDH(D)=-\sum_{k=1}^{K}\frac{C_k}{D}\log_2{\frac{C_k}{D}}H(D)=−k=1∑K​DCk​​log2​DCk​​
(2)计算特征AAA对数据集DDD的经验条件熵H(D∣A)H(D|A)H(D∣A)
H(D∣A)=∑i=1n∣Di∣DH(Di)=−∑i=1n∣Di∣∣D∣∑k=1K∣Dik∣∣Di∣log⁡2∣Dik∣∣Di∣H(D|A)=\sum_{i=1}^{n}\frac{|D_i|}{D}H(D_i)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}\sum_{k=1}^{K}{\frac{|D_{ik}|}{|D_i|}}{\log_2{\frac{|D_{ik}|}{|D_i|}}}H(D∣A)=i=1∑n​D∣Di​∣​H(Di​)=−i=1∑n​∣D∣∣Di​∣​k=1∑K​∣Di​∣∣Dik​∣​log2​∣Di​∣∣Dik​∣​
(3)计算信息增益
g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)−H(D∣A)

2.2、信息增益比(C4.5)

信息增益值的大小是相对于训练数据集而言的,并没有绝对意义。在分类问题困难时,也就是说在训练数据集的经验熵大的时候,信息增益值会偏大。反之,信息增益值会偏小。使用信息增益比可以对这一问题进行校正。

特征AAA对训练数据集DDD的信息增益比gR(D,A)g_R(D,A)gR​(D,A)定义为其信息增益g(D,A)g(D,A)g(D,A)与训练数据集DDD的经验熵H(D)H(D)H(D)之比:
gR(D,A)=g(D,A)HA(D)g_R(D,A)=\frac{g(D,A)}{H_A(D)}gR​(D,A)=HA​(D)g(D,A)​
其中,HA(D)=−∑i=1n∣Di∣∣D∣log⁡2∣Di∣∣D∣H_A(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}\log_2{\frac{|D_i|}{|D|}}HA​(D)=−∑i=1n​∣D∣∣Di​∣​log2​∣D∣∣Di​∣​,nnn是特征AAA取值的个数。

2.3、基尼指数(CART)

分类问题中,假设有KKK个类,样本点属于第kkk类的概率为pkp_kpk​,则概率分布的基尼指数定义为
Gini(p)=∑k=1Kpk(i−pk)=1−∑k=1Kpk2Gini(p)=\sum_{k=1}^{K}p_k(i-p_k)=1-\sum_{k=1}^{K}{p_k}^2Gini(p)=k=1∑K​pk​(i−pk​)=1−k=1∑K​pk​2
对于二类分类问题,若样本点属于第1个类的概率是ppp,则概率分布的基尼指数为
Gini(p)=2p(1−p)Gini(p)=2p(1-p)Gini(p)=2p(1−p)
对于给定的样本集合DDD,其基尼指数为
Gini(D)=1−∑k=1K(∣Ck∣∣D∣)2Gini(D)=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2Gini(D)=1−k=1∑K​(∣D∣∣Ck​∣​)2
这里,CkC_kCk​是DDD中属于第kkk类的样本子集,KKK是类的个数。
如果样本集合DDD根据特征AAA是否取某一可能值aaa被分割成D1D_1D1​和D2D_2D2​两部分,则在特征AAA的条件下,集合DDD的基尼指数定义为
Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)Gini(D,A)=∣D∣∣D1​∣​Gini(D1​)+∣D∣∣D2​∣​Gini(D2​)
基尼指数Gini(D)Gini(D)Gini(D)表示集合DDD的不确定性,基尼指数Gini(D,A)Gini(D,A)Gini(D,A)表示经A=aA=aA=a分割后集合DDD的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。

3、树的生成

3.1、ID3生成算法

输入:训练数据集DDD,特征集AAA,阈值ε\varepsilonε;
输出:决策树TTT。
(1)若DDD中所有实例属于同一类CkC_kCk​,则TTT为单结点树,并将类CkC_kCk​作为该结点的类标记,返回TTT;
(2)若A=∅A=\varnothingA=∅,则TTT为单结点树,并将DDD中实例数最大的类CkC_kCk​作为该结点的类标记,返回TTT;
(3)否则,计算AAA中各特征对DDD的信息增益,选择信息增益最大的特征AgA_gAg​;
(4)如果AgA_gAg​的信息增益小于阈值ε\varepsilonε,则置TTT为单结点树,并将DDD中实例数最大的类CkC_kCk​作为该结点的类标记,返回TTT;
(5)否则,对AgA_gAg​的每一可能值aia_iai​,依Ag=aiA_g=a_iAg​=ai​将DDD分割为若干非空子集DiD_iDi​,将DiD_iDi​中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树TTT,返回TTT;
(6)对第iii个子结点,以DiD_iDi​为训练集,以A−AgA-{A_g}A−Ag​为特征集,递归地调用步(1)~步(5),得到子树TiT_iTi​,返回TiT_iTi​。

3.2、C4.5生成算法

C4.5算法与ID3算法相似,C4.5在生成的过程中,用信息增益比来选择特征。

3.3、CART生成算法

输入:训练数据集DDD,停止计算的条件;
输出:CART决策树。
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:
(1)设结点的训练数据集为DDD,计算现有特征对该数据集的基尼指数。此时,对每一个特征AAA,对其可能取的每个值aaa,根据样本点对A=aA=aA=a的测试为“是”或“否”将DDD分割成D1D_1D1​和D2D_2D2​两部分,计算A=aA=aA=a时的基尼指数。
(2)在所有可能的特征AAA以及它们所有可能的切分点aaa中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
(3)对两个子结点递归地调用(1),(2),直至满足停止条件。
(4)生成CART决策树。
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。

4、树的剪枝

在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning)。具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)来实现。设树TTT的叶结点个数为∣T∣|T|∣T∣,ttt是树TTT的叶结点,该叶结点有NtN_tNt​个样本点,其中kkk类的样本点有NtkN_{tk}Ntk​个,k=1,2,…,Kk=1,2,…,Kk=1,2,…,K,Ht(T)H_t(T)Ht​(T)为叶结点ttt上的经验熵,α≥0\alpha\geq0α≥0为参数,则决策树学习的损失函数可以定义为
Cα(T)=∑t=1∣T∣NtHt(T)+α∣T∣C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|Cα​(T)=t=1∑∣T∣​Nt​Ht​(T)+α∣T∣
其中经验熵为
Ht(T)=−∑kNtkNtlog⁡NtkNtH_t(T)=-\sum_{k}^{}\frac{N_{tk}}{N_t}\log{\frac{N_{tk}}{N_t}}Ht​(T)=−k∑​Nt​Ntk​​logNt​Ntk​​
令C(T)=∑t=1∣T∣NtHt(T)=−∑t=1∣T∣∑k=1KNtklog⁡NtkNtC(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^{K}{N_{tk}}\log{\frac{N_{tk}}{N_t}}C(T)=t=1∑∣T∣​Nt​Ht​(T)=−t=1∑∣T∣​k=1∑K​Ntk​logNt​Ntk​​
这时有
Cα(T)=C(T)+α(T)C_\alpha(T)=C(T)+\alpha(T)Cα​(T)=C(T)+α(T)
式中,C(T)C(T)C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,∣T∣|T|∣T∣表示模型复杂度,参数α≥0\alpha\geq0α≥0控制两者之间的影响。较大的α\alphaα促使选择较简单的模型(树),较小的α\alphaα促使选择较复杂的模型(树)。

4.1、树的剪枝算法

输入:生成算法产生的整个树TTT,参数α\alphaα;
输出:修剪后的子树TαT_\alphaTα​。
(1)计算每个结点的经验熵。
(2)递归地从树的叶结点向上回缩。
设一组叶结点回缩到其父结点之前与之后的整体树分别为TBT_BTB​与TAT_ATA​,其对应的损失函数值分别是Ca(TB)C_a(T_B)Ca​(TB​)与Ca(TA)C_a(T_A)Ca​(TA​),如果
Ca(TA)≤Ca(TB)C_a(T_A)\leq C_a(T_B)Ca​(TA​)≤Ca​(TB​)
则进行剪枝,即将父结点变为新的叶结点。
(3)返回(2),直至不能继续为止,得到损失函数最小的子树TαT_\alphaTα​。

4.2、CART剪枝算法

从整体树T0T_0T0​开始剪枝。对T0T_0T0​的任意内部结点ttt,以ttt为单结点树的损失函数是
Cα(t)=C(t)+αC_\alpha(t)=C(t)+\alphaCα​(t)=C(t)+α
以ttt为根结点的子树TtT_tTt​的损失函数是
Cα(Tt)=C(Tt)+α∣Tt∣C_\alpha(T_t)=C(T_t)+\alpha|T_t|Cα​(Tt​)=C(Tt​)+α∣Tt​∣
对T0T_0T0​中每一内部结点ttt,计算
g(t)=C(t)−C(Tt)∣Tt∣−1g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}g(t)=∣Tt​∣−1C(t)−C(Tt​)​
它表示剪枝后整体损失函数减少的程度。

算法:
输入:CART算法生成的决策树T0T_0T0​;
输出:最优决策树TαT_\alphaTα​.
(1)设k=0k=0k=0,T=T0T=T_0T=T0​.
(2)设a=+∞a=+\inftya=+∞.
(3)自下而上地对各内部结点ttt计算C(Tt)C(T_t)C(Tt​),∣Tt∣|T_t|∣Tt​∣以及
g(t)=C(t)−C(Tt)∣Tt∣−1g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}g(t)=∣Tt​∣−1C(t)−C(Tt​)​
α=min(α,g(t))\alpha=min(\alpha,g(t))α=min(α,g(t))
这里,TtT_tTt​表示以ttt为根结点的子树,C(Tt)C(T_t)C(Tt​)是对训练数据的预测误差,∣Tt∣|T_t|∣Tt​∣是TtT_tTt​的叶结点个数。
(4)对 g(t)=αg(t)=\alphag(t)=α 的内部结点 ttt 进行剪枝,并对叶结点 ttt 以多数表决法决定其类,得到树TTT。
(5)设k=k+1k=k+1k=k+1,αk=α\alpha_k=\alphaαk​=α,Tk=TT_k=TTk​=T.
(6)如果 TkT_kTk​ 不是由根结点及两个叶结点构成的树,则回到步骤(3),否则令 Tk=TnT_k=T_nTk​=Tn​ 。
(7)采用交叉验证法在子树序列T0,T1,…,TnT_0,T_1,…,T_nT0​,T1​,…,Tn​中选取最优子树TαT_\alphaTα​。

<机器学习>决策树理论相关推荐

  1. 机器学习--决策树理论知识(二)

    文章转自:http://bbit.vip/service/main.php?version=1&type=article&id=136

  2. 3.1 机器学习 --- 决策树

    3.1 机器学习 - 决策树 一 金融评分卡 模型做好后尽量快的上线,以符合要求的模型,尽快上线. 超参数赋予权重,使得模型的参数不一致,而达到均衡样本数据 二 决策树原理 1. 找女朋友 性别:男 ...

  3. 白话机器学习算法理论+实战番外篇之LightGBM

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...

  4. 机器学习 | 决策树原理剪枝连续值缺失值处理

    机器学习 | 决策树 最近学习了西瓜书决策树一章,简单整理了笔记,后续会继续补充给 文章目录 机器学习 | 决策树 一.基本信息论 1. 信息量 2. 信息熵 二.决策树常用算法 1.ID3 2.C4 ...

  5. 白话机器学习算法理论+实战之PCA降维

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑 ...

  6. 《机器学习》理论——速读学习1 基础知识

    <机器学习>理论--速读学习1 基础知识 该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动! Time: 2021-12-05 学习目标:我需要了解神经网络除了工程 ...

  7. 1、决策树理论知识详解与sklearn实践

    看过我数学建模专栏的读者应该知道,我从去年开始就计划写这专栏,但由于各种原因,一直无暇实施计划.而从本篇开始,这个专栏将开始填坑.每篇博文会采用理论+实践的形式,试图用sklearn这个强大的工具包来 ...

  8. 白话机器学习算法理论+实战之支持向量机(SVM)

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑 ...

  9. 白话机器学习算法理论+实战之EM聚类

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑 ...

  10. 白话机器学习算法理论+实战之K近邻算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑 ...

最新文章

  1. 精品德国软件 UltraShredder 文件粉碎机
  2. 为什么 ConcurrentHashMap 的读操作不需要加锁?
  3. ajax提交无反应,IE中jquery.form中ajax提交没反应解决方法分享
  4. nginx 缓存时间说明
  5. Jenkins创建Maven项目及SSH部署
  6. JS的document.all函数使用 示例
  7. python爬虫中三种数据解析方式
  8. lua math.random()
  9. Redis的常用JavaAPI(Jedis)实现
  10. swiper 上滑触发_新知 | 为何红酒杯壁挂“眼泪”,骑自行车不会倒,冰面那么滑?...
  11. LabView---双通道示波器(内含信号发生器)
  12. 清华紫光输入法linux,清华紫光拼音输入法
  13. automation服务器不能创建对象问题解决
  14. Java计算组合数以及生成组合排列
  15. oracle11204补丁包,Oracle 11.2.0.4 RAC 最新补丁下载(11.2.0.4.200714)
  16. 经典圣诞老人题----同步与互斥
  17. 4pm 方法操datagrid
  18. iOS之UITableView组头组尾视图/标题悬停
  19. 交叉编译apr和apr-util库
  20. VMware虚拟机配置IP地址

热门文章

  1. Blender 吸附(贴合)到模型表面-缩裹Shrinkwrap
  2. idea 集成mybatis,利用MyBatis Generator自动生成实体类、mapper文件
  3. 胡宏开:4.8数字货币操作建议及盘面分析总结
  4. poj 1873The Fortified Forest (凸包 二进制枚举)
  5. 初学者学Java应该安装什么软件?
  6. javaScript 数组对象取出某一列
  7. 常类型的使用 常成员函数(设计一个日期类和时间)
  8. Redis实战案例及问题分析之好友关注功能(关注、共同好友、消息推送)
  9. HJ97 记负均正(c++)
  10. GeoPandas官方快速入门文档(中文翻译版)