决策树(第四周)

news2024/11/28 2:41:21

一、决策树基本原理

如下图所示,是一个用来辨别是否是猫的二分类器。输入值有三个(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.coloradmin.cn/o/1254467.html

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

相关文章

***利用SecureCRT上传、下载文件(使用sz与rz命令)

使用SecureCrt连接到服务器。 1、上传文件:rz命令 输入“rz”,回车,在弹窗的文件选择框中选择本地磁盘中需要上传的文件,点击【Add】按钮,再点击传输指令即可。 注意(如果没有权限不可能成功,…

Runloop解析

RunLoop 前言 ​ 本文介绍RunLoop的概念,并使用swift和Objective-C来描述RunLoop机制。 简介 ​ RunLoop——运行循环(死循环),它提供了一个事件循环机制在程序运行过程中处理各种事件,例如用户交互、网络请求、定…

ps5ps4游戏室如何计时?计费系统怎么查看游戏时间以及收费如何管理

ps5ps4游戏室如何计时?计费系统怎么查看游戏时间以及收费如何管理 1、ps5ps4游戏室如何计时? 下图以佳易王计时计费软件V17.9为例说明 在开始计时的时候,只需点 开始计时按钮,那么开台时间和使用的时间长度项目显示在屏幕上&am…

Pure-Pursuit 跟踪五次多项式轨迹

Pure-Pursuit 跟踪五次多项式轨迹 考虑双移线轨迹 X 轴方向位移较大,机械楼停车场长度无法满足 100 ~ 120 m,因此采用五次多项式进行轨迹规划,在轨迹跟踪部分也能水一些内容 调整 double_lane.cpp 为 ref_lane.cpp,结合 FrenetP…

基于 GPS 定位信息的 Pure-Pursuit 轨迹跟踪实车测试(1)

基于 GPS 定位信息的 Pure-Pursuit 轨迹跟踪实车测试(1) 进行了多组实验,包括顺逆时针转向,直线圆弧轨迹行驶,以及Pure-Pursuit 轨迹跟踪测试 代码修改 需要修改的代码并不多,主要对 gps_sensor 功能包和…

蓝桥杯每日一题2023.11.26

题目描述 奖券数目 - 蓝桥云课 (lanqiao.cn) 将每一个数字进行一一枚举&#xff0c;如果检查时不带有数字4则答案可以加1 #include<bits/stdc.h> using namespace std; int ans; bool check(int n) {while(n){if(n % 10 4)return false;n / 10; }return true; } int m…

基于Haclon的标签旋转项目案例

项目要求&#xff1a; 图为HALCON附图“25interleaved_exposure_04”&#xff0c;里面为旋转的二维码标签&#xff0c;请将其旋转到水平位置。 项目知识&#xff1a; 在HALCON中进行图像平移和旋转通常有以下步骤&#xff1a; &#xff08;1&#xff09;通过hom_mat2d_ident…

<JavaEE> Thread线程类 和 Thread的常用方法

目录 一、Thread概述 二、构造方法 三、常用方法 1.1 getId()、getName()、getState()、getPririty() 1.2 start() 1.3 isDaemon()、setDaemon() 1.4 isAlive() 1.5 currentThread() 1.6 Interrupt()、interrupted()、isInterrupted() 1.6.1 方法一&#xff1a;添加共…

基于Haclon的图形镜像案例

项目要求&#xff1a; 图为HALCON的例图“green-dot”&#xff0c;请将其中的圆形图案按水平和垂直两个方向分别进行镜像。 项目知识&#xff1a; 首先要用BLOB分析的方法&#xff0c;得到圆形图案的目标区域&#xff0c;再对其进行镜像。 在HALCON中与镜像相关的算子为mirr…

跟着chatgpt学习|1.spark入门

首先先让chatgpt帮我规划学习路径&#xff0c;使用Markdown格式返回&#xff0c;并转成思维导图的形式 目录 目录 1. 了解spark 1.1 Spark的概念 1.2 Spark的架构 1.3 Spark的基本功能 2.spark中的数据抽象和操作方式 2.1.RDD&#xff08;弹性分布式数据集&#xff09; 2…

实战oj题——括号匹配问题

前言&#xff1a;前面我们已经做了一些关于顺序表和链表的oj题&#xff0c;今天我们就来解决一些有关于栈和队列的oj题。 我们对这个题看起来毫无头绪&#xff0c;但是我们刚学习了栈&#xff0c;就可以用栈来解决这一类问题&#xff0c;如果我们读取到左括号就入栈&#xff0c…

Cache学习(3):Cache地址映射(直接映射缓存组相连缓存全相连缓存)

1 Cache的与存储地址的映射 以一个Cache Size 为 128 Bytes 并且Cache Line是 16 Bytes的Cache为例。首先把这个Cache想象成一个数组&#xff0c;数组总共8个元素&#xff0c;每个元素大小是 16 Bytes&#xff0c;如下图&#xff1a; 现在考虑一个问题&#xff0c;CPU从0x0654…

再见 Pandas,再见算法

大家好,《再见pandas》 系列已有200多位朋友加入学习了,这段时间亲眼见证了很多朋友的飞跃进步,从无到有,从一个问问题的小白到开始慢慢回答别人的问题,在讨论和练习中不断成长。虽说pandas已经很普及了,但普及内容的深度却远远不够。 下面这套原创图文是我和几位小伙伴…

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

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

手把手教你如何在Linux下写进度条小程序(附源码)

效果展示 录屏2023 一、建立文件 mkdir ProgressBar //在当前目录下&#xff0c;建立新的目录 cd ProgressBar //进入这个目录 touch main.c makefile progressbar.c progressbar.h //在ProgressBar这个目录建立这几个文件进入ProgressBar这个目录之后&#xff0c;使…

python树长子兄弟链存储结构(孩子兄弟链存储结构)

长子兄弟链存储结构&#xff08;孩子兄弟链存储结构&#xff09;解释&#xff1a; 长子兄弟链存储结构是一种树的存储结构&#xff0c;它使用孩子兄弟表示法&#xff08;也称作左孩子右兄弟表示法&#xff09;来表示树的结构。这种表示方法主要用于存储一般的树&#xff0c;而不…

Linux服务器SSH客户端断开后保持程序继续运行的方法

目录 1. nohup 命令&#xff1a; 2. tmux 或 screen&#xff1a; 3 final shell 断开后服务器如何继续执行令&#xff1f; 方法一&#xff1a;使用 nohup 命令 方法二&#xff1a;将命令放在后台执行 4 你可以使用 jobs 命令查看当前终端中正在后台运行的任务 &#xff…

飞翔的鸟小游戏

第一步是创建项目 项目名自拟 第二步创建个包名 来规范class 再创建一个包 来存储照片 如下&#xff1a; package game; import java.awt.*; import javax.swing.*; import javax.imageio.ImageIO;public class Bird {Image image;int x,y;int width,height;int size;doub…

Qt4用子类化ProxyModel和子类化MainWindow实现全表筛选,中文排序和复制粘贴

目录 1 需求 2 子类化ProxyModel实现全表筛选 3 字符串列表实现中文排序 3.1 Qt5中文排序 3.2 Qt4排序 4 表格的复制粘贴 5 应用 1 需求 模型视图编程是Qt开发的基本功&#xff0c;其中有几个关键问题需要解决&#xff1a; 全表筛选&#xff0c;或者说多列搜索中文排序…

【精选必看】MyBatis映射文件及动态SQL,一级,二级缓存介绍

文章目录 MyBatis映射文件 < r e s u l t M a p > <resultMap> <resultMap>resultMap < sql>&< include>特殊字符处理 动态SQL < i f > < if> <if> < w h e r e > <where> <where> < s e t > <…