决策树(第四周)

一、决策树基本原理

如下图所示,是一个用来辨别是否是猫的二分类器。输入值有三个(x1,x2,x3)=(耳朵形状,脸形状,胡须),其中x1={尖的,圆的},x2={圆脸,不是圆脸},x3={有胡须,没有胡须},这三个输入值都是1/0。输出y=1表示是猫,否则不是猫。

椭圆型称为决策节点,矩形称为叶节点,下图模型称为决策树。

对于同一个问题,可以有许多个不同的决策树模型,如下图所示。我们需要做的就是选出最优的模型,让他在交叉验证集上表现最优,这就是决策树学习算法。

1.1 学习过程

1、决定在根节点使用什么特征。根据这个特征将训练数据划分到两个分支。假如选择耳朵形状:

2、先关注左侧分支,再根据算法选择出新的决策特征(算法后面讲解)。假如选择面部形状:

注意到 左侧的四个训练数据都是猫,接下来不用再选择新特征 进行分裂,将这个节点转化成叶节点。同理右侧节点:

3、接下来看右侧分支,再利用算法决策出一个合适的特征进行分裂,假如是胡须,后面的操作同上:

 1.2 一般步骤

1、在每一个决策节点上选择出合适的特征进行分裂,这个特征必须将子集尽量最大化纯度(也就是说,这个子集当中,尽量都是猫或者都不是猫)。下图是分别将三个特征作为根节点进行分类的结果:

2、决定何时停止分裂

  • 当子集纯度达到100% (也就是说,一个子集中只有一个类别)
  • 当分类节点已经达到最大的允许深度,则停止分裂。(限制决策树深度的一个原因是确保我们的树不会变得太大和笨重,其次,通过保持树小,它不太容易过度拟合)
  • 当纯度已经低于阈值
  • 当决策节点的示例数量低于阈值

1.3 纯度purity

1.3.1 熵

熵可以用来量化纯度,越小表示纯度越高。

P1表示所有子集中猫的占有比例,下图的曲线图是熵随着P1变化的曲线图,横轴表示P1,数据范围在0-1,纵轴表示熵,数据范围在0-1。只有当P1很大或者很小时,熵会很小。

下图是熵的计算公式: 

1.4 选择拆分信息增益

在构建决策树时,我们决定在节点上拆分哪个特征,将基于哪种特征选择最能减少熵(最大化纯度)。熵的减少称为信息增益。下图是选择不同特征进行分类后,各个分支的熵:

接下来我们需要一个标准来衡量 哪种决策方式最好。如果熵很大,分裂子集也很大,这意味着子集中有很多复杂数据。但是若熵很大,子集比较小,这种情况没有前者糟糕。因此这个标准一定要兼顾到熵值和子集大小。

可以使用加权平均值来衡量,“权”表示子集在全部示例中的占有比例。然后选出最小的那个模型即可。

但是 实际当中,我们也会计算根节点的熵值,然后用根节点熵值减去分裂后加权平均熵值 ,使用这个差值来计划选择哪个特征。

我们刚刚计算的这些数字,0.28、0.03.和0.12这些被称为信息增益,衡量的是由于分裂而导致的树中熵的减少。

为什么我们不直接使用加权平均熵来衡量,而是使用更费劲的差值呢?这是因为,熵减小的程度可以用来度量何时停止分裂。如果差值太小,小于某种阈值,可以判断此时停止分裂。

1.4.1 信息增益的一般公式

如下图所示:

二、决策树的优化

4.1 独热编码one-hot

前面的示例中,耳朵形状特征只有两个 ---尖的、圆的。如果我们增加一个取值,即尖的、圆的、椭圆的。此时根据耳朵形状分裂就会变成下图所示:

这会导致 决策树变复杂。现在有一种方法one-hot来解决两个以上值的特征问题。我们删除耳朵形状这个特征,而是换成以下三个二值特征:是否是尖耳朵、是否是圆耳朵、是否是椭圆耳朵。如下图所示:

4.2 连续值特征

如果我们在特征中增加一个新的特征weight(体重),如下图所示,这个特征的取值无穷多,可以说是连续值特征。对于这样的特征该怎么处理呢?

如下图所示,横轴是体重值,纵轴y=1表示是猫,y=0表示不是猫。我们可以设置不同的体重阈值来进行分裂。例如当阈值为8时,将体重小于等于8的分裂为一个子集,体重大于8的分裂为另一个子集。然后计算这个分裂标准的信息增益来判断这个阈值是否合理。我们可以设置多个不同的阈值来进行判断,如下图所示,分别设置了阈值为8,9,13,分别计算信息增益,由此可以看出,阈值为9的效果最好。

 三、回归树

现在我们把问题换成下图所示,用耳朵形状、面部形状、胡须这三个特征来预测体重。

下图是构建的回归树, 叶节点的值是分裂子集的体重的平均值。当测试新数据时,让他像往常一样往下走,当走到叶节点的时候,用平均值来预测新测试数据的weight。

3.1 选择最佳特征

如同决策树,在根节点有三个特征允许选择进行分裂,如下图所示,那么如何评价三种分裂方式的好坏呢?

在构建回归树时,我们不是试图减少熵(对分类问题的杂质度量),而是尝试减少每 个数据子集的值Y的权重方差。我们计算左右分支的方差,然后求取加权平均值,最后选出最小的那个模型即可。

同决策树一样,我们也可以计算根节点的方差,然后用根节点方差减去分裂后加权平均方差 ,选择可以使方差最大程度减少的模型。

四、决策树集成

使用单个决策树的缺点之一 是该决策树可能对数据中的微小变化高度敏感,如下图所示。左边是针对数据做出的最佳分裂模型,右边是仅仅更改一个数据后做出的最佳模型。10个测试数据只更改了一个,造成两个决策树完全不一样。

一种解决方案是不构建一个决策树, 而是构建很多决策树,我们称之为树集成,如下图所示。当有一个新的测试数据,我们将这个数据在三个决策树上都跑一遍,每个决策树都会给出一个预测结果。这些结果相当于投票,哪个票数最多,最终就预测哪个。比如说,这里的三颗决策树,两个预测是猫,那么最终结果就是猫。

我们使用树集合的原因是通过拥有大量决策树并让它们投票,它使整体算法对任何一棵树可能正在做的事情不太敏感,因为它只能获得三分之一的投票, 可以使整体算法更加健壮。

4.1 替换采样

如何构建决策树集合呢?可以使用替换采样的方法。替换采样的意思就是,从训练数据(数量为M)中随机抽取一个记录下来,把这个数据再放回去,再进行随机抽取。。。。。直到达到M个数据集(可能有重复的数据,不过这都是正常的)。这样是第一个数据集,利用这个数据集构建第一个决策树。然后用同样的方法,构建第二、第三等决策树。

构建决策树集合时,假设构建B棵决策树。事实证明将B设置得更大不会损害性能,但超过某个点后,最终会得到收益递减的结果,而且当B远大于1000左右时,它实际上并没有变得更好。

4.2 随机森林

即使使用这种带有替换过程的采样,有时最终还是会在根节点处始终使用相同的拆分,而在其余分裂节点附近使用非常相似的拆分。这种情况在小样示例中不明显,但是训练数据大的情况下会比较严重。因此,需要对算法再进行一次修改,以进一步尝试随机化每 个分裂节点的特征选择,这会使树集彼此之间变得更加不同,这样的话,当您投票给他们时,您最终会得到更准确的预测。

通常这样做的方法是在每个分裂节点上选择一个特征以用于切割 (如果最终特征可用)。选择K个特征作为允许的特征,然后从这K个特征中选择具有最高信息增益的特征作为使用分割的特征选择。K 值的典型选择是 N的平方根,这种技术往往更多地用于具有大量特征的较大问题。注意k是从N个特征中随机抽取的。

4.3 XGBoost

在4.1中,构建决策树集成时,每次都从测试数据中,等概率(1/M的概率大小)抽取M个数据来构建决策树。XGBoost算法在此基础上继续改进,除了第一棵决策树和之前一样之外,剩余决策树都不是等概率抽取数据,而是更大概率能选择先前训练的树表现不佳的错误分类样本(这种方法称为“刻意练习”)。事实证明它可以帮助学习算法更快地学习,做得更好。因为后面的决策树把学习的重点放在了错误分类的数据上。

下图是第一棵决策树的构建,构建成功之后,对原始训练数据进行第一次预测,如下图红框的表格。我们在这个循环中第二次要做的是使用替换采样来生成另一 个包含十个例子的训练集。但是每次我们从这10个中选择一个示例时,都会有更高的机会从这三个错误分类的示例中选择。

XGBoost算法还有很多优点,是一个不错的选择。用XGBoost算法实现分类和回归的简单示例如下图所示。XGBoost算法的实现细节比较麻烦,建议直接调用开源库。

五、什么时候选择决策树

决策树和神经网路都是非常强大,非常有效的算法,什么时候选择决策树?什么时候选择神经网络呢?

决策树和树集成通常适用于表格数据,也称为结构化数据。这意味着如果您的数据集看起来像一个巨大的电子表格, 那么决策树就值得考虑。他根本不适合于非结构优化数据。另一个优点是,速度快。

神经网络往往更适合处理非结构化数据(图像、文本、音频)任务。但是对于结构化数据神经网络也非常擅长。

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

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

相关文章

叠加原理(superposition principle)、线性系统

叠加原理(superposition principle):指对一个系统而言,两个或多个输入产生的输出,等于这几个输入单独引起的输出的和,即输入的叠加等于各输入单独引起的输出的叠加。 线性系统:一个系统&#x…

常用的Linux的指令

目录 常用指令 1、文件和目录操作: 2、文件查看和编辑 3、系统信息 4、进程管理 5、用户和权限 6、网络操作 7、压缩和解压 8、软件包管理 常用指令 1、文件和目录操作: ls:列出目录内容 cd: 切换目录 pwd:显…

十分钟让你搞懂JVM中的GC垃圾回收机制(分代回收)

文章目录 0. 为什么要有垃圾回收?1. 垃圾回收哪个内存区域?2. 如何找到垃圾(死亡对象的判断)2.1 引用计数法2.2 可达性分析法2.3 两种算法的差别 3. 如何清理垃圾(死亡对象的回收)3.1 标记-清楚法3.2 复制法3.3 标记-整理法 4. JVM使用的回收方法4.1 什么是分代回收4.2 哪些对…

JVM——几种常见的对象引用

目录 1. 软引用软引用的使用场景-缓存 2.弱引用3.虚引用和终结器引用 可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系,只要这层关系存在, 普通对象就不会被回收。除了强引用之外,Ja…

C++局域网从服务器获取已连接用户的列表(linux to linux)

目录 服务器端 代码 客户端 代码解析 服务器端 原理 遇到的阻碍以及解决办法 客户端 原理 遇到的阻碍以及解决办法 运行结果截图 总结 服务器端 代码 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet…

深入了解 Pinia:现代 Vue 应用的状态管理利器

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【Python】用三种方法创建tkinter桌面窗口

Python的tkinter是Python的标准GUI库之一&#xff0c;它是一个开源的、跨平台的GUI工具包&#xff0c;可以用于创建桌面应用程序。 tkinter提供了许多常见的GUI组件&#xff0c;例如按钮、文本框、标签、列表框等等&#xff0c;可以轻松地创建各种类型的桌面应用程序。它还支持…

云服务器上部署 Web 项目及端口异常处理

文章目录 1. 在云服务器的 MySQL(MariaDB) 中, 建库建表2. 微调代码3. 打包4. 把 war 包 拷贝到云服务器上端口被占用处理 1. 在云服务器的 MySQL(MariaDB) 中, 建库建表 在云服务器中进入 MySQL mysql -u root -p把之前本地写好的 SQL 代码一粘贴即可 例如: -- 这个文件主要…

线性表,也是Java中数组的知识点!

线性表定义&#xff1a; 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表&#xff0c;(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…

人力资源管理后台 === 登陆+主页灵鉴权

目录 1. 分析登录流程 2. Vuex中用户模块的实现 3.Vue-cli代理解决跨域 4.axios封装 5.环境区分 6. 登录联调 7.主页权限验证-鉴权 1. 分析登录流程 传统思路都是登录校验通过之后&#xff0c;直接调用接口&#xff0c;获取token之后&#xff0c;跳转到主页。 vue-elemen…

html实现360度产品预览(附源码)

文章目录 1.设计来源1.1 拖动汽车产品旋转1.2 汽车产品自动控制 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134613931 html实现360度产品预览&#xff08;附源码&…

VUE留言板

效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>作业</title><styl…

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决 问题描述&#xff1a; 长按TextField后&#xff0c;显示剪切、复制等选项为英文&#xff0c;如下图所示&#xff0c;这是因为问未设置语言本地化&#xff0c;我们需要进行设置。 首先在pubspec.yaml加入以下依赖…

rsyslog出现Unit rsyslog.service is masked不可用问题解决

博主在测试将日志发送到日志服务器的功能时遇到了rsyslog服务不可用的问题&#xff0c;具体来说&#xff0c;就是执行systemctl restart rsyslog或者 service rsyslog restart命令时&#xff0c;出现了标题中所述的Unit rsyslog.service is masked问题。网上查找了很多资料&…

【代码】平抑风电波动的电-氢混合储能容量优化配置(完美复现)matlab-yalmip-cplex/gurobi

程序名称&#xff1a;平抑风电波动的电-氢混合储能容量优化配置 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;针对电-氢混合系统协同平抑接入新型电力系统的 新能源波动问题&#xff0c;提出考虑碱性电解槽运行特性的电-氢 混合储能容量优化配置方案…

这一款 Mac 系统终端工具,已经用的爱不释手了!

&#x1f525;&#x1f525;&#x1f525;作为程序员或者运维管理人员&#xff0c;我们经常需要使用终端工具来进行服务器管理及各种操作&#xff0c;比如部署项目、调试代码、查看/优化服务、管理服务器等。 相信大家用的最多的终端工具就是 Xshell、iTerm2和Mobaxterm&#…

【JavaEE初阶】浅谈进程

✏️✏️✏️今天正式进入JavaEE初阶的学习&#xff0c;给大家分享一下关于进程的一些基础知识。了解这部分内容&#xff0c;只是为后续多线程编程打好基础&#xff0c;因此进程部分的知识&#xff0c;不需要了解更加细节的内容。 清风的CSDN博客 &#x1f61b;&#x1f61b;&a…

汽车电子 - UDS

汽车电子 - UDS 概念基本概念分类请求与响应寻址信息物理寻址功能寻址 协议格式&#xff1f;&#xff1f;&#xff1f;750/758厂家自定义的吗&#xff1f;&#xff1f;&#xff1f;&#xff0c; 所有的UDS服务都在这里边吗&#xff1f;&#xff1f;&#xff1f;&#xff0c;代码…

offer 选择难?说说我的 2 个思考

大家好&#xff0c;我是鱼皮。秋招仍在进行中&#xff0c;随着越来越多的公司开奖&#xff0c;最近 编程导航星球 的小伙伴们也陆续发来了 offer 报喜&#xff1a; 图片 图片 但也有一部分小伙伴陷入了 “甜蜜的烦恼”&#xff0c;拿了几个 offer 却不知道怎么选择。 offer 选择…

存算一体还是存算分离?谈谈数据库基础设施的架构选择

从一则用户案例说起 某金融用户问&#xff0c;数据库用服务器本地盘性能好还是外置存储好&#xff1f;直觉上&#xff0c;本地盘路径短性能应该更好。然而测试结果却出乎意料&#xff1a;同等中等并发压力&#xff0c;混合随机读写模型&#xff0c;服务器本地SSD盘合计4万 IOPS…