python机器学习(六)决策树(上) 构造树、信息熵的分类和度量、信息增益、CART算法、剪枝

决策树算法

模拟相亲的过程,通过相亲决策图,男的去相亲,会先选择性别为女的,然后依次根据年龄、长相、收入、职业等信息对相亲的另一方有所了解。

通过决策图可以发现,生活中面临各种各样的选择,基于我们的经验和自身需求进行一些筛选,把判断背后的逻辑整理成结构图,会发现呈现树状的结构,也就是所说的树状图。

我们在做决策的时候,会经历两个阶段:构造和剪枝。

构造树

构造就是生成一颗完整的决策树,简单来说,构造的过程就是选择什么属性作为节点的过程,那么在构造过程中,会存在三种节点:

  • 根节点:位置位于树的最顶端,可以最大化的去划分类别,帮助我们筛选数据
  • 内部节点:位于树中间的节点,也为子节点。
  • 叶节点:每个节点决策的结果,不存在子节点。

所以在构造树的过程中,我们要解决三个重要的问题:

  • 选择哪个属性作为根节点
  • 选择哪些属性作为内部节点(子节点)
  • 什么时候停止并且得到目标状态(叶节点)

根节点选择的不同会导致树的选择也存在差异。

问题: 我们怎么来用程序选择根节点呢

目标:通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当成根节点,依次类推。

利用根节点可以更好的去切分数据,内部节点是为了更好的细分数据。

信息熵(Entropy)

信息熵是表示随机变量不确定性的度量。熵是物理学中的知识点,表示物体内部的混乱程度,比如口红种类色号繁多,意味着在商场中轻松买到一支完全满意的口红的概率非常低,说明当种类比较混乱的话,不确定性就越大,熵值也就越大;比如要买华为的手机,进入华为专卖店就可以购买,确定性越大,意味着熵值就越小。

熵与分类的关系

1图进行分类后更混乱了,混乱程度越大,不确定性越大,熵值就越大,2图分类后数据比较纯,分类明确规整,熵值就越小。

用程序去实现的话,就要把指标进行量化。

信息熵的度量

单位:1bit

一枚硬币有正反两面,抛硬币出现反面的概率是50%,出现证明的概率也是50%,这是最简单的二分类的问题,抛一个硬币的不确定性记为1bit,抛硬币的个数,与它呈现的不确定的结果是指数的关系。

python 复制代码
1枚硬币:不确定性为2,正反
2枚硬币:不确定性为4,全正,全反,一正一反,一反一正
3枚硬币:不确定性为8
n枚硬币:不确定性为2^n

等概率均匀分布

4种不确定结果 = 2 2 2^2 22,熵为2bit, 2 = l o g 2 4 2=log_24 2=log24

8种不确定结果 = 2 3 2^3 23,熵为3bit, 3 = l o g 2 8 3=log_28 3=log28

m种不确定结果 = 2 n 2^n 2n,熵为nbit, n = l o g 2 m n=log_2m n=log2m

概率都是相等的情况, n = l o g 2 m n=log_2m n=log2m,m为不确定性结果的个数。

概率不等分布

把 D D D分为6种情况,不确定性结果为6,也即为 m = 6 m=6 m=6, D D D的熵为: E n t ( D ) = l o g 2 6 Ent(D)=log_26 Ent(D)=log26

真实的情况可能更加复杂,如下图, D D D的不确定性分为 A 、 B 、 C A、B、C A、B、C三种, A A A又有三种情况为1/2的概率, B B B有两种情况为1/3的概率, C C C有一种情况为1/6的概率。 A A A有三种可能,对应的m(A)=3,单个A的熵为 l o g 2 3 log_23 log23, D D D的数据更纯,纯度高的减去纯度低的得到数据本身的纯度,再考虑概率的问题,乘以权重。
A A A处的熵为 E n t ( A ) = 1 2 ( l o g 2 6 − l o g 2 3 ) Ent(A)=\frac{1}{2}(log_26-log_23) Ent(A)=21(log26−log23)。
B 、 C B、C B、C的熵依此类推。
E n t ( B ) = 1 3 ( l o g 2 6 − l o g 2 2 ) Ent(B)=\frac{1}{3}(log_26-log_22) Ent(B)=31(log26−log22)
E n t ( C ) = 1 6 ( l o g 2 6 − l o g 2 1 ) Ent(C)=\frac{1}{6}(log_26-log_21) Ent(C)=61(log26−log21)

D D D的熵为: E n t ( D ) = E n t ( A ) + E n t ( B ) + E n t ( C ) Ent(D)=Ent(A)+Ent(B)+Ent(C) Ent(D)=Ent(A)+Ent(B)+Ent(C),推导之后可得:

下图为对数的图形,必要过点 ( 1 , 0 ) (1,0) (1,0),横坐标为 P k P_k Pk,纵坐标为 E n t ( A ) Ent(A) Ent(A), P k = 1 P_k=1 Pk=1的时候意味着概率为1,熵为0,表示数据纯度最高。 P k = 1 P_k=1 Pk=1的作用域为0到1之间,所以图形中大于1的部分是没有的。

也就是说概率越大,混乱程度越低,熵值就越低。

  • 练习1

下图中,图2的熵值大,混乱程度高,图1数据比较纯,都是圆圈,不确定性小,熵值就越小。

  • 练习2
    集合A:[1,2,3,4,5,6,7,8,9,10]
    集合B:[1,1,1,1,1,1,1,1,9,10]
    集合B的熵值小,B的数据相对比较纯,出现1的概率比较大,熵值小,稳定性比较高。
    做决策树的时候,熵值越低表示数据越纯,分类的效果就会更明显,在数模型中,希望熵值越来越小,

信息增益

熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合Y划分结果的好坏。

信息增益表示特征X使得类Y的不确定性减少的程度,决策一个节点的选择。

下图中根节点Y的熵数据比较大为0.9,数据比较混乱,现对Y划分为Y_1和Y_2,熵分布为0.2和0.5,可以看出Y_1的分类效果比较明显。 0.9 − 0.2 > 0.9 − 0.5 0.9-0.2>0.9-0.5 0.9−0.2>0.9−0.5

特征A对训练数据集D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合 D D D的信息熵 H ( D ) H(D) H(D)与特征 A A A给定条件下 D D D的信息条件熵 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)

本质上为初始熵和信息熵的差距。

  • 信息增益计算例题
    如下图,我们根据天气、温度、湿度、刮风四个特征来判断是否打球。

    特征:天气、温度、湿度、刮风
    标签:是否打篮球
    每个特征都决定着标签,对最终结果的影响如下图所示:

    计算过程:
    单单从数据上无法判断哪个特征作为根节点,要根据信息增益来选择作为根节点的特征,信息增益越大越好,增益越大说明划分的越有效果,从数据不纯往数据数据越纯的方向上移动。
    • 1.计算初始熵
    • 2.计算各特征的熵
    • 3.进行球差得到信息增益
    • 4.选择信息增益大的特征作为根节点



计算结果为温度的信息增益最大,选择温度作为根节点,再从湿度、天气、刮风中选择子节点构建完整的决策树。

通过信息增益获得决策树,是决策算法的一种,称为ID3算法。

ID3算法的缺陷

如果在刚才的表格上增加一列ID,ID列的每个数字都不一样,以ID特征来进行分类,每一个ID值不相等且均为单独的一类,每个类都只有自己,意味着数据比较纯,每个数据出现的概率都是100%,意味着ID为0,它的熵为0;ID为6,熵依然为0。如果使用信息增益的话,ID列被作为根节点,它跟最后的结果打球不打球没有关系。

所以ID3算法是由缺陷的,信息增益倾向于分类较多的特征,有些噪音数据就会影响整体的分类,甚至整个树的构造,为了解决这个缺陷,提出了信息增益率。

信息增益率(C4.5)

ID3在计算的时候,倾向于选择取值比较多的属性。为了避免这个问题,C4.5采用信息增益率的方式来选择属性。信息增益率 = 信息增益 / 属性熵,属性就是特征。熵代表数据的混乱程度,数据的不确定性。如果一个属性有多个值,数据就会被划分为多份,数据的概率变大了,虽然信息增益变大了,属性熵也会变大,整体的信息增益率就没有变的那么大。分成多份后,每个类别的熵变低了,对于整个样本来说,不确定性增强了,熵变大了,分类越多,信息增益就越大,信息熵也就变大了。信息增益和熵是同时同向变化的,所以二者的比值就会减少影响,二者成正比的关系,减少信息增益的变大。

CART算法

CART算法,英文全名为(Classification And Regression Tree),中文叫做分类回归树。ID3和C4.5算法可以生成二叉树或多叉树,而CART只支持二叉树。同时CART决策树比较特殊,既可以作分类树,又可以作回归树。

CART分类树与C4.5算法类似,只是在属性选择的衡量指标采用的是基尼系数,用的不再是信息增益或信息增益率。基尼系数是用来衡量一个国家收入差距的常用指标。基尼系数本身反映了样本的不确定度,当基尼系数越小的时候,说明样本之间的差异性小,不确定程度低。分类的过程本身就是提纯的过程,使用CART算法在构造分类树的时候,会选择基尼系数最小的作为属性的划分,跟熵是相反的。

GINI系数公式: G i n i ( D ) = 1 − ∑ k = 1 ∣ y ∣ P k 2 Gini(D)= 1-\displaystyle{\sum_{k=1}^{|y|}P_k^2} Gini(D)=1−k=1∑∣y∣Pk2

如果概率为1,数据的纯度越高,基尼系数就为0。二分类的问题,y不是0就为1,

基尼系数构建决策树:

  • 计算初始基尼系数
  • 分别计算各特征的基尼系数
  • 做差计算基尼系数增益


    通过计算得知,温度的基尼系数最大,可以选择作为根节点。

连续性数据处理实现

在实际过程中,我们有很多连续值,比如下图年收益就是连续的值,其实就是数值型的属性,那我们怎么来计算基尼系数呢?

流程如下:

  • 将乱序的值进行从小到大排序
  • 不断的二分

    对数据两两数据取中间值,如60和70的中间值是65,70和75的中间值为72.5,依次类推。以65作为分割点,小于65的数只有1个,占数据的十分之一,剩下十分之九里面6个无贷款,3个有贷款计算出基尼增益为0.02;依次以72.5为分割点进行计算,得到上图中的Gini系数增益,得到基尼增益最好的点作为根节点。

    连续性数据的处理过程是将连续值进行离散化的过程。

剪枝

剪枝就是给决策树瘦身,这一步想实现的目标就是,不需要太多的判断,同样可以得到不同的结果。比如梯度下降的时候进行了1万次,可能在几百次的时候已经出现了最好的结果,剪枝是为了防止"过拟合"(Overfitting)现象的发生,得到最好结果的时候就停止。过拟合训练集太过完美,测试集在测试的时候结果就会不是很满意。

需要使用剪枝防止过拟合的发生,如果不剪枝一直进行分裂,那样本数据100%会被分割到一个正确的结果。如下图所示,一直进行分裂。

不停的分下去跟分到一半的效果是一样的,就没有必要一直往下分了,否则会一直占用计算机的资源。

预剪枝

在构造树枝前进行一些设定:

  • 指定树的高度或者深度,比如上图对10进行分裂了4次,如果指定高度为3,则第4次就不会被执行
  • 每一个结点所包含的最小样本数目,比如说指定最小样本数为3,则到3之后也不会往下执行了
  • 指定结点的熵小于某个值,不再划分,比如指定熵为0.2,恰好2处的熵为0.2,则也不会往下执行了

后剪枝

在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。

相关推荐
AC使者5 分钟前
#B1630. 数字走向4
算法
ROBOT玲玉6 分钟前
Milvus 中,FieldSchema 的 dim 参数和索引参数中的 “nlist“ 的区别
python·机器学习·numpy
冠位观测者9 分钟前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
GocNeverGiveUp15 分钟前
机器学习2-NumPy
人工智能·机器学习·numpy
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca1 小时前
洛谷 P1706 全排列问题 C语言
算法
Kai HVZ1 小时前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神1 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
浊酒南街1 小时前
决策树(理论知识1)
算法·决策树·机器学习
m0_748244831 小时前
StarRocks 排查单副本表
大数据·数据库·python