1.决策树

目录

1. 什么是决策树?

2. 决策树的原理

2.1 如何构建决策树?

2.2 构建决策树的数据算法

2.2.1 信息熵

2.2.2 ID3算法

2.2.2.1 信息的定义

2.2.2.2 信息增益

2.2.2.3 ID3算法举例

2.2.2.4 ID3算法优缺点

2.2.3 C4.5算法

2.2.3.1 C4.5算法举例

2.2.4 CART算法

2.2.4.1 Gini指数(基尼指数)

2.2.4.2 Cart算法 相关公式

2.2.4.3 Cart算法举例

3. 未完待续。。。

4. 本文涉及的代码


1. 什么是决策树?

决策树分类的思想类似于找对象。

想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:

女孩决定是否见男孩的一个过程,就像一个树形结构,只不过是反正的树, 数学上或者机器学习里的树,根在最上方

最上方的为树的根节点下面的都是子节点

 像下图的橙色的部分,下面在没有往下的结点的叫叶子节点

如果一颗树每个节点下面最多只有两个节点就属于二叉树 

下图的就是一个非二叉树( 到收入下面有三个节点)

上图完整表达了这个女孩决定是否见一个约会对象的策略,

其中绿色节点表示判断条件

橙色节点表示决策结果

箭头表示在一个判断条件在不同情况下的决策路径

图中红色箭头表示了上面例子中女孩的决策过程
这幅图基本可以算是一颗决策树,说它“基本可以算”是因为图中的判定条件没有量化,

如收入高中低等等,还不能算是严格意义上的决策树,

如果将所有条件量化,则就变成真正的决策树了。
有了上面直观的认识,我们可以正式定义决策树了:

        决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。

其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。

使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节
点,将叶子节点存放的类别作为决策结果

        可以看到,决策树的决策过程非常直观,容易被人理解。目前决策树已经成功运用于医学、制造产业、天文学、分支
生物学以及商业等诸多领域。决策树的主要优势就在于数据形式非常容易理解。

        决策树算法能够读取数据集合,构建类似于上面的决策树,决策树很多任务都是为了数据中所蕴含的知识信息,因此决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,机器学习算法最终将使用这些机器从数据集中创造的规则。专家系统中经常使用决策树,而且决策树给出结果往往可以匹敌在当前领域具有几十年工作经验的人类专家

2. 决策树的原理

2.1 如何构建决策树?

首先,例如上方的图,我们可以分析到,我们要先选择 判断条件,

例如有些女孩找男朋友的第一个条件考虑年龄而有的考虑收入有的还考虑长相等等,所以这就是构造决策树的第一个关键的点判断条件的顺序,

有了判断条件之后,怎么判断这个节点的分裂,例如,年龄这个判断条件,是按照30岁分还是按照什么分,符合这个条件是一个节点,不符合这个判断条件的是另外一个节点,这就是构造决策树的第二个关键的点:节点分裂的界限或者说节点分裂的定义和分类

        构造决策树关键步骤是分裂属性,所谓分裂属性就是在某个节点处,按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能的“纯”,尽可能“纯” 就是尽量让一个分裂子集中待分类项属于同一类别

2.2 构建决策树的数据算法

2.2.1 信息熵

有了刚说的两个关键点,对于这个两个关键点的选择就有点困难,所以需要具体的算法来做

建决策树的数据算法有很多

ID3算法

C4.5算法

CART算法

.....

等等

这里面就牵扯了信息论中的信息熵 有关信息熵可参考(可以点开全部回答,然后搜索 阅读 ,或者自行查看 )

信息熵是什么? - 知乎原创文章,一家之言。转载请注明出处。个人公众号:follow_bobo机器学习入门:重要的概念---信息熵(Shan…icon-default.png?t=N7T8https://www.zhihu.com/question/22178202/answer/265757803

信息熵的数学公式:

2.2.2 ID3算法

ID3算法算的是信息增益

2.2.2.1 信息的定义

熵定义为信息的期望值,在明确这个概念之前,我们必须知道信息的定义,如果待分类的事务划分在多个分类之中,则符合X的信息定义为:
l(x_i)=-log_2p(x_i)

其中p(x)是选择该分类的概率

为了计算熵,我们需要计算所有类别所有可能的信息期望值,通过下面的公式得到:

                                                                         H=-\sum ^n_{i=1}p(x_i)log_2p(x_i)

其中n 是分类的数目

在决策树当中,设D为用类别对训练元组进行的划分,则D的熵(entropy)表示为:

                                                                  info(D)=-\sum_{i=1}^{m}p_ilog_2(p_i)

其中pi 表示第i个类别在整个训练元组出现的概率,可以用属于此类别元素的数量除以训练元组元素总数作为估计。

熵的实际意义表示是D中元组的类标号所需要的平均信息量

现在我们假设将训练元组D按属性A进行划分,则A对D划分的期望信息为:

                                                                info_A(D)=\sum_{j=1}^{v}\frac{|D_j|}{D}info(D_j)

2.2.2.2 信息增益

ID3算法 利用 信息增益来决定优先使用哪个特征进行分裂

先用没有进行任何属性分类的时候,计算一个信息熵

再选其中的某一个特征进行分裂构造决策树,再计算一个信息熵,具体用哪个特征来计算,要看哪个特征计算出来的信息熵大,就用哪个,因为这样算出来的值越大相减之后就消除了原来数据里面最大的不确定性

这两个信息熵之间会有一个差值, 这两个信息熵之差,得到的值叫做信息增益

2.2.2.3 ID3算法举例

ID3算法就是在每次需要分裂时,计算每个属性的增益率,然后选择增益率最大的属性进行分裂,

如下图假设训练集合包含10条数据,预测一下,社交网站上的账号是否真实的账号

根据日志密度,好友密度,是否使用真是头像等(这些都为特征)来预测

代表的含义: s 小,m中等,l 大

先完成构建决策树其中一个关键点:首先用那个特征进行分裂

计算思路:

1⃣️ 先计算没有使用任何特征对账号是否真实的计算的信息熵

2⃣️ 再算随便使用一个特征对账号是否真实的计算的信息熵

代码如下:(使用 jupyter notebook)

import pandas as pd
import numpy as np
# 计算图中的信息熵,确定一个分类的特征
# D 就是我们的原始数据
# 先计算未使用任何特征的进行分类的信息熵(所以只需关心账号是否真实这一列)
# 账号是否真实: 有两种情况,分别为 yes no, yes数量为7(概率为0.7),no的数量为3(概率为0.3)
# 根据信息熵公式:
info_D = -(0.7 * np.log2(0.7) + 0.3 * np.log2(0.3))
info_D
# 0.8812908992306927

使用 日志密度 对账号是否真实的信息熵 
使用公式  
$info_A(D)=\sum_{j=1}^{v}\frac{|D_j|}{D}info(D_j)$

# 使用 日志密度 对账号是否真实的信息熵 使用公式
# j 就是 3(因为日志密度有三种情况,s,l,m)
# s 三个(0.3),对应账号是否真实列,2个no, 1个yes
# l 三个(0.3), 对应账号是否真实列,0个no, 3个yes
# m 四个(0.4), 对应账号是否真实列,1个no, 3个yes
# s情况中对日志密度划分的信息熵 = s 的 概率 ✖️  s 中对账号是否真实的信息熵 = 0.3 * ((-1/3) * np.log2(1/2) + (-2/3) * np.log2(2/3))
# 同理 l  = 0.3 * (-1 * log2(1))
# 同理 m  = 
info_D_Log = 0.3 * ((-1/3) * np.log2(1/3) + (-2/3) * np.log2(2/3)) + 0.3 * (-1 * np.log2(1)) + 0.4 * ((-1/4) * np.log2(1/4) + (-3/4) * np.log2(3/4))
info_D_Log
# 使用 日志密度 进行划分的信息增益
info_D - info_D_Log
# 0.2812908992306927
# 使用 好友密度 对账号是否真实的信息熵
# s 4个(0.4),对应账号是否真实列,3个no, 1个yes
# m 4个(0.4), 对应账号是否真实列,0个no, 4个yes
# l 2个(0.2), 对应账号是否真实列,0个no, 2个yes
info_D_F = 0.4 * ((-3/4) * np.log2(3/4) + (-1/4) * np.log2(1/4)) + 0 + 0
info_D_F
# 0.32451124978365314
# 使用 好友密度 进行划分的信息增益
info_D - info_D_F
# 0.5567796494470396
# 使用 是否使用真实头像 对账号是否真实的信息熵
# no 5个  2个no,3个yes 
# yes  5个 1个no,4个yes
info_D_H = 0.5 * ((-2/5) * np.log2(2/5) + (-3/5) * np.log2(3/5)) + 0.5 * ((-1/5) * np.log2(1/5) + (-4/5) * np.log2(4/5))
info_D_H
# 0.8464393446710154
# 使用 是否使用真实头像 进行划分的信息增益
info_D - info_D_H
# 0.034851554559677256

根据上述的运算结果,可以看到, 使用 好友密度 进行划分的信息增益 的 值最大 ,所以 我们就用好友密度这个特征来构建决策树

再完成构建决策树另外一个关键点:首先用那个特征进行分裂节点分裂的界限或者说节点分裂的定义和分类, 而这些我们不需要关心,ID3算法会帮我们做好,只要能确定出来用哪个特征即可

分裂属性分为三种不同的情况:

  1. 属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。
  2. 属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
  3. 属性是连续值。此时确定一个值作为分裂点split_point,
     按照>split_point和<=split_points生成两个分支。

离散值即 例子中的 s,m,l,这种就是有三个划分,而连续值类似年龄这种连续值,29,30,31等

2.2.2.4 ID3算法优缺点
  • 优点:简单、时间复杂度、时间复杂度都不高
  • 缺点:数据中大量的离散型的数据,会对分裂造成误差

2.2.3 C4.5算法

因为ID3算法在对于离散型特征的处理不好,引入C4.5算法

C4.5算法,计算的是信息增益率

计算步骤:

  1. 先计算信息增益
  2. 再除以这个特征本身的信息熵
2.2.3.1 C4.5算法举例

信息增益,上面ID3算法已经计算出来,可以直接使用, 代码如下

2.2.4 CART算法

2.2.4.1 Gini指数(基尼指数)

        由上面的内容我们已经知道,决策树的核心就是寻找纯净的划分,因此引入了纯度的概念。在属性选择上,我们是通过统计“不纯度”来做判断的,ID3 是基于信息增益做判断,C4.5 在 ID3 的基础上做了改进,提出了信息增益率的概念。实际上 CART 分类树与 C4.5 算法类似,只是属性选择的指标采用的是基尼指数

        基尼指数本身反应了样本的不确定度。当基尼系数越小的时候,说明样本之间的差异性小不确定程度低分类的过程本身是一个不确定度降低的过程,即纯度的提升过程。所以 CART 算法在构造分类树的时候,会选择基尼系数最小的属性作为属性的划分。

        在决策树Cart算法中用Gini指数来衡量数据的不纯度或者不确定性

2.2.4.2 Cart算法 相关公式

Gini(D)=1-\sum_{i}p_i^2   在分类问题中,样本属于第 i 类的概率为p_i

Gini(D,a)=\sum_{v}\frac{|D_v|}{D}Gini(D_v)  经过特征a分割之后集合D的不确定性,基尼指数越大,不确定性越大,因此我们需要寻找基尼指数越小的特征作为节点

2.2.4.3 Cart算法举例

3. 本文涉及的代码

https://download.csdn.net/download/wei18791957243/88660903icon-default.png?t=N7T8https://download.csdn.net/download/wei18791957243/88660903https://download.csdn.net/download/wei18791957243/88660904icon-default.png?t=N7T8https://download.csdn.net/download/wei18791957243/88660904

https://download.csdn.net/download/wei18791957243/88664136icon-default.png?t=N7T8https://download.csdn.net/download/wei18791957243/88664136

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

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

相关文章

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十六:统计报表模块相关功能实现

一、本章内容 本章使用Echarts及DataV实现常用图表、特殊图表、地图及综合图表等图表展示功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址: 基于VUE3+Layui从

Python——yolov8识别车牌2.0

目录 一、前言 二、关于项目UI 2.1、修改界面内容的文本 2.2、修改界面的图标和图片 三、项目修改地方 四、其他配置问题 一、前言 因为后续有许多兄弟说摄像头卡顿&#xff0c;我在之前那个MATS上面改一下就可以了&#xff0c;MAST项目&#xff1a;基于YOLOv8的多端车流检…

【leetcode100-019】【矩阵】螺旋矩阵

【题干】 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 【思路】 不难注意到&#xff0c;每进行一次转向&#xff0c;都有一行/列被输出&#xff08;并失效&#xff09;&#xff1b;既然已经失效&#xff0c;那我…

倒计时1天!WAVE SUMMIT+ 2023将开启,五大亮点抢鲜看!

10句话2分钟&#xff0c;挑战成功说服宿管阿姨开门&#xff0c;这个人群中的“显眼包”是一个接入文心大模型4.0游戏里的NPC&#xff0c;妥妥 “工具人”实锤&#xff5e; 尝试用AI一键自动识别好坏咖啡豆&#xff0c;看一眼便知好坏&#xff0c;真正“颜值即正义”&#xff0…

信息筑牢安全防线|隐私安全保护仍任重道远!

在日常生活中&#xff0c;就连小小一张快递面单可以显示很多关键信息&#xff0c;让不法分子盗取个人信息有机可乘。 今年2月1日&#xff0c;《快递电子运单》国家标准开始实施。根据国家邮政局数据&#xff0c;中国快递日均包裹量3.4亿余件&#xff0c;隐私面单日均使用量已超…

13.鸿蒙HarmonyOS App(JAVA)文本框组件按钮点击提示

13.鸿蒙HarmonyOS App(JAVA)文本框按钮点击提示 点击按钮触发组件状态&#xff0c;点击改变颜色 文本框组件&#xff0c;文本居中&#xff0c;斜体&#xff0c;左右对齐&#xff0c;点击显示提示信息 Button button(Button) findComponentById(ResourceTable.Id_btn_1); but…

git集成github(一):主要步骤

一、创建仓库 1、创建本地git仓库 在pcharm主界面顶栏&#xff0c;点击VCS&#xff0c;再点击创建git仓库&#xff0c;然后选择项目根路径&#xff0c;点击确认。这时&#xff0c;可以看到顶栏的VCS变成了git。 2、远程仓库下载到本地 打开一个远程仓库&#xff0c;点击code…

C# Winform教程(一):MD5加密

1、介绍 在C#中&#xff0c;MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数&#xff0c;用于将任意长度的数据转换为固定长度的哈希值&#xff08;通常是128位&#xff09;。MD5广泛用于校验数据完整性、密码存储等领域。 2、示例 创建MD5加密…

元宇宙与VR虚拟现实的未来如何?

从科幻小说到商业现实 自从 Facebook年更名为 Meta 以来&#xff0c;关于元宇宙的热议不断&#xff0c;人们对虚拟世界的兴趣也重新燃起&#xff0c;因为尽管虚拟现实 (VR) 的概念由来已久&#xff0c;但该技术现在才开始真正得以应用。 定义元宇宙和虚拟现实 首先是 The Met…

【Java、Python】获取电脑当前网络IP进行位置获取(附源码)

我相信看到这篇博客的时候心里肯定是想解决自己的一个问题的&#xff0c;而这篇博客我就以简单快速的方式解决这些烦恼&#xff01; 一、获取当前IP 在Java中自带了一些自己的流对象来获取当前的IP地址&#xff0c;不多说我们直接上代码。 //获取当前网络ip地址 ipAddress Ine…

TCP并发服务器

一.进程实现TCP并发服务器 #include <func.h> #define PORT 6666 #define IP "192.168.124.42"void handler(int arm) {while(waitpid(-1,NULL,WNOHANG) > 0); } int main(int argc, const char *argv[]) {//接受17号信号signal(17, handler);i…

2014年第三届数学建模国际赛小美赛A题吹口哨解题全过程文档及程序

2014年第三届数学建模国际赛小美赛 A题 吹口哨 原题再现&#xff1a; 哨子是一种小装置&#xff0c;当空气被迫通过开口时会发出声音。哨声的巨大而引人注目&#xff0c;使其对警察和体育裁判来说至关重要。当救生员、迷路的露营者或犯罪受害者使用它们时&#xff0c;它们可以…

网站显示不安全警告怎么办?消除网站不安全警告超全指南

网站显示不安全警告怎么办&#xff1f;当用户访问你的网站&#xff0c;而您的网站没有部署SSL证书实现HTTPS加密时&#xff0c;网站就会显示不安全警告&#xff0c;这种警告&#xff0c;不仅有可能阻止用户继续浏览网站&#xff0c;影响网站声誉&#xff0c;还有可能影响网站在…

阿赵UE学习笔记——5、创建关卡元素

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   之前介绍了从空白模板创建关卡&#xff0c;接下来尝试着在这个空白的世界里面&#xff0c;创建一些内容。 一、创建地面 1、创建面片作为地面 创建——形状——平面&#xff0c;可以创建一个面片 在细节面板设置合适的…

分布式锁竟然这么简单?(荣耀典藏版)

大家好&#xff0c;我是小月夜枫&#xff0c;作为一个后台开发&#xff0c;不管是工作还是面试中&#xff0c;分布式一直是一个让人又爱又恨的话题。它如同一座神秘的迷宫&#xff0c;时而让你迷失方向&#xff0c;时而又为你揭示出令人惊叹的宝藏。 今天&#xff0c;让我们来…

项目零散记录

Ts托管 仅本项目禁用本地vscode内置的ts服务 提交代码前的检查 husky(哈士奇)工具&#xff08;是一个git hooks工具&#xff09; 1、安装 pnpm dlx husky-init && pnpm install安装的时候&#xff0c;出现如下报错 解决方案&#xff0c;需要先执行git init初始化…

Android10.0 人脸解锁流程分析

人脸解锁概述 人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的支持&#xff0c;也为安全合规地启用集成交易的应用&#xff08;网上银行或其他服务&am…

Java Web基础详解

回顾 之前的两篇的文章已经大概的带我们了解了tomcat的一些基本的操作&#xff0c;比如从零搭建我们自己的调试环境以及官方文档构建的方式&#xff0c;接下来的话&#xff0c;我将带大家来了解一下tomcat的一些基础知识&#xff0c;这些基础知识将以问题的方式抛出&#xff0…

【SpringCloud笔记】(11)消息驱动之Stream

Stream 技术背景 底层不同模块可能使用不同的消息中间件&#xff0c;这就导致技术的切换&#xff0c;微服务的维护及开发变得麻烦起来 概述 官网&#xff1a; https://spring.io/projects/spring-cloud-stream#overview https://cloud.spring.io/spring-cloud-static/spring…

最小覆盖子串(LeetCode 76)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff…