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

news2024/9/23 3:29:06

决策树算法

模拟相亲的过程,通过相亲决策图,男的去相亲,会先选择性别为女的,然后依次根据年龄、长相、收入、职业等信息对相亲的另一方有所了解。
通过决策图可以发现,生活中面临各种各样的选择,基于我们的经验和自身需求进行一些筛选,把判断背后的逻辑整理成结构图,会发现呈现树状的结构,也就是所说的树状图。
我们在做决策的时候,会经历两个阶段:构造和剪枝。

构造树

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

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

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

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

根节点选择的不同会导致树的选择也存在差异。
问题: 我们怎么来用程序选择根节点呢
目标:通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当成根节点,依次类推。
利用根节点可以更好的去切分数据,内部节点是为了更好的细分数据。

信息熵(Entropy)

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

熵与分类的关系

在这里插入图片描述
1图进行分类后更混乱了,混乱程度越大,不确定性越大,熵值就越大,2图分类后数据比较纯,分类明确规整,熵值就越小。
用程序去实现的话,就要把指标进行量化。

信息熵的度量

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

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 ABC三种, 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(log26log23)
B 、 C B、C BC的熵依此类推。
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(log26log22)
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(log26log21)
在这里插入图片描述
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.90.2>0.90.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(DA)之差。即公式为: g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)
本质上为初始熵和信息熵的差距。

  • 信息增益计算例题
    如下图,我们根据天气、温度、湿度、刮风四个特征来判断是否打球。
    在这里插入图片描述
    特征:天气、温度、湿度、刮风
    标签:是否打篮球
    每个特征都决定着标签,对最终结果的影响如下图所示:
    在这里插入图片描述
    计算过程:
    单单从数据上无法判断哪个特征作为根节点,要根据信息增益来选择作为根节点的特征,信息增益越大越好,增益越大说明划分的越有效果,从数据不纯往数据数据越纯的方向上移动。
    • 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)=1k=1yPk2
如果概率为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,则也不会往下执行了

后剪枝

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

考研408 | 【计算机网络】物理层

导图: 一、通信基础 基本概念: 物理层接口特性:物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 物理层主要任务:确定与传输媒体接口有关的一些特性 典型的数据通信模型 数据通…

SAP-MM-发票校验的重复校验功能

路径:SPRO-物料管理-后勤发票校验-收入发票-设置重复发票检查 按公司代码设置重复检查,可以按三个方式进行检查,公司代码、参照、发票日期,如果此处未维护就是按供应商(XK02)的六项进行检查 但是如果两处都…

latex插入不连续的中线

在上面的示例中,\cmidrule(lr){1-3} 表示在第 1 列到第 3 列之间添加不连续的中线,\cmidrule(lr){4-6} 表示在第 4 列到第 6 列之间添加不连续的中线,以此类推。你可以根据需要调整列的范围和对齐方式。

合并两个有序链表(leetcode)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]思路 每次递归都会比较当前两个节点的值,选择较小的节点作为合并后的链…

Java8 文件工具类 FileUtils(持续更新中)

1. Java8 文件处理 使用 Java8 的 java.nio.file 方法,来进行文件处理。 1.1. 读文件 所有内容一次读出来,结果为字符串。 1.1.1. 代码 /*** 读取文件** param path 文件路径* return 文件内容(字符串)*/public static String…

Python导出SqlServerl数据字典为excel

sql代码 SELECTtableName D.name ,tableIntroduce isnull(F.value, ),sort A.colorder,fieldName A.name,catogary B.name,bytes A.Length,lengths COLUMNPROPERTY(A.id, A.name, PRECISION),scales isnull(COLUMNPROPERTY(A.id, A.name, Scale), 0),isOrNotNull Cas…

差值结构的相互作用能

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让A,B中各有3个点,且不重合,统计迭代次数并排序。 其中有10组数据 差值结构 A-B 迭代次数 构造平均列 平均列…

2.4G芯片G350开发的遥控玩具解决方案

玩具从早期的简单功能,到现如今各种各样的智能操作,发展的速度也是飞速的。随着玩具市场的逐步完善与推进,中国的智能玩具市场也出现了很多远程遥控玩具。遥控玩具也是从最初的有线到现在的无线,从地上跑的到天上飞的,…

vue2-常用的修饰符有哪些应用场景?

1、修饰符是什么? 在程序的世界里,修饰符是用于限定类型以及类型成员的声明的一种 符号。 在vue中,修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间去处理这些重复的事情,而能有更多的精力专注于程序的逻辑…

安全作业-Race竞争型漏洞、原型链污染

1.race漏洞一直卡在虚拟机安装上(待研究) 2.原型链污染 一、第一题js代码 const express require(express) var hbs require(hbs); var bodyParser require(body-parser); const md5 require(md5); var morganBody require(morgan-body); const app express(); var use…

入侵检测-IDS

1. 什么是IDS? IDS(intrusion detection system)入侵检测系统,是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。它会对系统的运行状态进行监视,发现各种攻击企…

外边距实现居中的写法

1、代码实例 2、默认是贴到左侧对齐的,但我们想要把他贴到中间对齐 3、居中的写法 4、这样就可以保证盒子居中了 5、以上写法仅适于行内元素和行内块元素的写法,有没有什么方法适用于行内块元素:可以添加text-align:center进行添加&#xff0…

stl_list类(使用+实现)(C++)

list 一、list-简单介绍二、list的常用接口1.常见构造2.iterator的使用3.Capacity和Element access4.Modifiers5.list的迭代器失效 三、list实现四、vector 和 list 对比五、迭代器1.迭代器的实现2.迭代器的分类(按照功能分类)3.反向迭代器(1)、包装逻辑…

Julia 日期和时间

Julia 通过 Dates 模块提供了以下三个函数来处理日期和时间: Date:表示日期,精确到日,只显示日期。DateTime:表示日期和时间,精确到毫秒。DateTime:表示日时间,精确到纳秒&#xff…

Unity 3D ScrollRect和ScrollView回弹问题的解决

你是否是这样&#xff1f; Content高度 < 全部Cell加在一起的总高 他就认为你的全部Cell加起来就跟Content一样大&#xff0c;所以才出现了这种完全回弹 我该怎么办&#xff1f; 很简单&#xff0c;改变Content的长度跟所有Cell的和一样大 void RefreshSize(){float allD…

分布式Redis详解

目录 前言安装redis的俩种方法Redis 与 MySQL的区别Redis可以实现那些功能Redis常用的数据类型有序列表的底层是如何实现的?什么是跳跃表 Redis在Spring中的使用 前言 Redis我们最近学习必备工具之一了, 接下来我们将讲解Redis的简单应用 ,以及相关原理 安装redis的俩种方法…

python自动收集粘贴板

win10的粘贴板可以用“winV”查看&#xff1a; 每次复制都相当于入栈一个字符串&#xff0c;粘贴相当于获取栈顶。 但是系统自带的这个粘贴板貌似不能一键导出&#xff0c;所以我写了个python代码完成这个功能&#xff1a; import pyperclip import timetmp while True:txt…

【LeetCode】剑指 Offer Ⅱ 第3章:字符串(7道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 题目解决方案剑指 Offer II 014. 字符串中的变位词双指针 数组模拟哈希表 ⭐剑指 Offer II 015. 找到字符串中所有字母异位词双指针 数组模拟哈希表 ⭐剑指 Offer II 016. 不含重复字符的最长子字符串双指针…

vue2-vue中mixin到底是什么?

1、mixin是什么&#xff1f; Mixin是面向对象程序设计语言中的类&#xff0c;提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类。 Mixin类通常作为功能模块使用&#xff0c;在需要该功能时“混入”&#xff0c;有利于代码的复用又避免了多继承的复杂。 1.1 vue中…