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

决策树算法

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

构造树

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

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

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

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

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

信息熵(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,则也不会往下执行了

后剪枝

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本 tbms

​功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外…

视频汇聚平台EasyCVR视频广场侧边栏支持拖拽

为了提升用户体验以及让平台的操作更加符合用户使用习惯,我们在EasyCVR v3.3版本中,支持面包屑侧边栏的广场视频、分组列表、收藏这三个模块拖拽排序,并且该操作在视频广场、视频调阅、电子地图、录像回放等页面均能支持。 TSINGSEE青犀视频…

python解析帆软cpt及frm文件(xml)获取源数据表及下游依赖表

#!/user/bin/evn python import os,re,openpyxl 输入:帆软脚本文件路径输出:帆软文件检查结果Excel#获取来源表 def table_scan(sql_str):# remove the /* */ commentsq re.sub(r"/\*[^*]*\*(?:[^*/][^*]*\*)*/", "", sql_str)# r…

探索硬件王国:计算机硬件信息一览(使用powershell获得计算机硬件信息)

获得运行权限: 请确保在运行脚本文件之前,设置了适当的执行策略。如果需要,可以使用 Set-ExecutionPolicy 命令更改执行策略。例如,可以使用以下命令将执行策略设置为 RemoteSigned: Set-ExecutionPolicy RemoteSign…

云真机调研

1. 主流云真机 目前市面上主流的远程真机服务商有:Testin云测、百度MTC、TestBird、精灵云测、腾讯Wetest、泽众云等,设备上基本覆盖Android、iOS和鸿蒙等主流设备,通过远程真机可以进行手工测试、代码调试、自动化脚本录制及执行等 2. testin 登录-云测,助力产业…

通用指令(汇编)

一、数据处理指令1)数学运算数据运算指令的格式数据搬移指令立即数伪指令加法指令带进位的加法指令减法指令带借位的减法指令逆向减法指令乘法指令数据运算指令的扩展 2)逻辑运算按位与指令按位或指令按位异或指令左移指令右移指令位清零指令 3&#xff…

【枚举+trie+dfs】CF514 C

Problem - 514C - Codeforces 题意: 思路: 其实是trie上dfs的板题 先把字符串插入到字典树中 对于每次询问,都去字典树上dfs 注意到字符集只有3,因此如果发现有不同的字符,去枚举新的字符 Code: #in…

学习单片机的秘诀:实践与坚持

在学习单片机时,将实践与学习结合起来是一个很好的方法。不要一上来就死磕指令和名词,而是边学边做实验,循序渐进地理解和应用指令。通过实验,你能亲身感受到指令的控制效果,增强对单片机的理解和兴趣。 学习单片机不…

【iOS】App仿写--天气预报

文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报,特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页,搜索界面,添加界面,浏…

dflow工作流使用1——架构和基本概念

对于容器技术、工作流等概念完全不懂的情况下理解dflow的工作方式会很吃力,这里记录一下个人理解。 dflow涉及的基本概念 工作流的概念很好理解,即某个项目可以分为多个步骤,每个步骤可以实现独立运行,只保留输入输出接口&#x…

WebGL Shader着色器GLSL语言

在2D绘图中的坐标系统,默认情况下是与窗口坐标系统相同,它以canvas的左上角为坐标原点,沿X轴向右为正值,沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系,且每个方向都有可使用的值的…

c语言野指针int*p、空指针int*p = NULL、万能指针void* p

1、野指针&#xff0c;既没有初始化的指针&#xff0c;//如果没有给指针初始化&#xff0c;则指针p的内容为随机地址&#xff0c;会随机指向&#xff0c;故成为野指针&#xff0c;不可以操作野指针 #include "stdio.h" #include <stdlib.h>int main() {//1、野…

ORACLE常用基础

. 1.oracle开机启动流程 su - oracle lsnrctl start lsnrctl status sqlplus / as sysdba startup 2、如何查看数据库版本 select * from v$version; 3.如何查看用户从那个设备连接的数据库 SELECT DISTINCT machine , terminal FROM V$SESSION; 4.如何查看表结构 selec…

FANUC机器人SRVO-300机械手断裂故障报警原因分析及处理办法

FANUC机器人SRVO-300机械手断裂故障报警原因分析及处理办法 首先,我们查看报警说明书上的介绍: 总结:即在机械手断裂设置为无效时,机器人检测出了机械手断裂信号(不该有的信号,现在检测到了,所以报警) 使机械手断裂设定为无效/有效的具体方法:  按下示教器的MENU菜单…

Vue前端框架入门

文章目录 Vue快速入门Vue指令生命周期 Vue 经过一小段时间学习 我认为vue就是在原js上进行的一个加强 简化JS中的DOM操作 vue是分两个层的 一个叫做视图层(View)&#xff0c;你可以理解为展现出来的前端页面 一个叫数据模型层(Model),包含数据和一些数据的处理方法 MVVM就是实…

数据结构10 -查找_树表查找

创建二叉搜索树 二叉搜索树 二叉搜索树是有数值的了&#xff0c;二叉搜索树是一个有序树。 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b; 若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b; 它…

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】 1 实现\封装Message模块 zinx/ziface/imessage.go package zifacetype IMessage interface {GetMsdId() uint32GetMsgLen() uint32GetMsgData() []byteSetMsgId(uint32)SetData([]byte)SetData…

组合总和——力扣39

文章目录 题目描述回溯 题目描述 回溯 class Solution { public:vector<vector<int>> res;vector<int> seq; void dfs(vector<int>& nums, int pos, int target){if(target0){res.emplace_back(seq);return;}if(posnums.size()){return;}//直接跳过…

2023上半年手机及数码行业分析报告(京东销售数据分析)

2023年上半年&#xff0c;手机市场迎来复苏&#xff0c;同环比来看&#xff0c;销量销额纷纷上涨。 而数码市场中&#xff0c;各个热门品类表现不一。微单相机及智能手表同比去年呈现增长态势&#xff0c;而笔记本电脑市场则出现下滑。 基于此现状&#xff0c;鲸参谋发布了20…

Ubuntu 虚拟机和主机无法互相复制文字和文件

1.在虚拟机列表中&#xff0c;右键查看是否有安装VMware Tools&#xff0c;如果没有安装点击安装&#xff0c;如果已经安装了&#xff0c;上面显示重现安装VMware Tools&#xff0c;并且为灰色&#xff0c;如图&#xff1a; 2.如果没有安装点击安装&#xff0c;如果已经安装&am…