机器学习(三) --- DT(Decision Tree)

2023-05-16

文章目录

  • Decision Tree
    • Introduction
    • Constructing Decision Trees
      • example
    • Pruning
    • 决策树、随机森林和Gradient Boosting
    • Reference:

Decision Tree

本文并不是给零基础的人看的哈,看之前需要了解一下啥是决策树。

Introduction

决策树是一种根据给定数据集产生一系列规则组成一棵树的算法。

一般来说,数据集中样本的特征包括两类:一类是数值属性,另一类是分类属性。

在一棵决策树中:

  • 内部结点表示属性
  • 边表示一种测试
  • 叶子结点表示某一类

建立一棵决策树一般采用自上而下的方式

决策树有两个主要问题需要解决,第一是如何选择最优结点进行划分(局部最优),第二是剪枝(全局最优)

Constructing Decision Trees

决策树建立过程中采用的是贪心的策略,每次选择局部最优特征来对数据集进行划分。那什么时候划分操作停止呢?第一是给定结点的所有样本都属于同一类别,第二是所有特征都已经选择完毕了(投票原则),第三是所有样本都选择完了。

介绍几个概念,熵(entropy)、信息增益(information gain)和信息增益比(information gain ratio)。

熵(entropy)用来衡量某个集合(序列)的纯度(purity/homogeneity),简单地说,某个集合里面如果全是同种元素,则熵为0,如果很多种元素均匀分布,则熵最大,即越纯越小,越混乱越大;决策树算法中,需要计算每个结点的熵。

The entropy for a completely pure set is 0 and is 1 for a set with equal for both the classes.

举个计算熵(entropy)的例子,公式需要记得

在这里插入图片描述

信息增益(information gain)用来确定某次划分过程的好坏,表示根据此特征划分之后,结点纯度提高了多少,即熵减小了多少;每次选择都应该选择信息增益最大的特征进行划分。

Information gain: Expected reduction in entropy caused by partitioning the training data according to a given attribute

关于信息增益的计算公式可以参考西瓜树或者李航的统计学习方法或者这个链接:https://blog.csdn.net/qq_41661809/article/details/90321622

注意只需要理解公式就可以跳过来接着看啦,

example

来看个构建决策树的例子吧,构建步骤如下。

  1. 计算根结点的熵
  2. 计算根据不同特征划分时的信息增益(公式内包含熵)
  3. 选择信息增益最大的属性进行划分
  4. 重复上述过程(注意这时候就不是计算根结点的熵了哦,而是新的父结点的熵)

下面例子中label是Play ball。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个例子里面最后形成的树就是这个样子啦

在这里插入图片描述

从上面这个例子可以看出来决策树使用的最简单的IF-THEN规则,很容易理解。

好的,到目前为止,我们已经知道了如何从零开始构造一颗决策树了;使用信息增益来选择划分结点的特征,这就是著名的ID3算法啦,注意ID3是Quinlan于1986年提出来的呢(这个我看到过争议,不纠结它)。比较常见的决策树算法除了ID3之外还有C4.5和CART,那么它们的区别是啥呢?或者说为啥要有呢?

核心的问题是选择局部最优特征作为划分属性的衡量标准不一样,比如也就是表的Splitting criteria列。

在这里插入图片描述

从上表可以看出ID3使用信息增益,C4.5使用信息增益率,CART使用基尼指数。C4.5是用来改进ID3的,因为用信息增益选择属性时偏向选择取值多的属性(吐槽一下,我看到的博客和书籍都只说了这句话,或者举了极端情况的例子,没讨论不是极端情况,也就是没说明白why,后面在知乎看到有大佬解释了,参见链接)为什么选择信息增益比作为衡量指标而不是信息增益:https://www.zhihu.com/question/22928442/answer/440836807

OK,前面讨论了为啥ID3进化到C4.5的原因,感觉已经挺合理了吧,那为啥还有CART呢?参考链接:cart算法为什么选用gini指数?https://www.zhihu.com/question/36659925

我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。能不能简化模型同时也不至于完全丢失熵模型的优点呢?有!CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。

(要不碰到问题先用知乎?哈哈哈)

测试的时候输入的样本就是从上往下根据IF-THEN的规则到达叶子结点,分类成功。

另外注意一下,CART算法生成的是一颗二叉树

Pruning

任何学习算法都会碰到欠拟合(underfitting)和过拟合(overfitting)的问题,决策树最经常碰到的问题就是过拟合,因为决策树很容易就变得很深。处理过拟合问题常用剪枝的方式(预剪枝和后剪枝两种)

  • 预剪枝:当结点的衡量指标(可以是熵、基本指数或者信息增益)低于某个阈值就不需要再进行分裂了。
  • 后剪枝:从一个完全形成的决策树由下往上开始剪枝,去除一些没必要的结点。

预剪枝一般来说比后剪枝会快一些,因为预剪枝不需要等决策树完全形成。但是后剪枝的效果可能比预剪枝好一些,因为后剪枝考虑了结点之间的“交互作用”;预剪枝通过单独评估每个属性来抑制增长,因此可能会忽略由于多个属性的交互作用而过早停止;后剪枝避免了这个问题。

最后贴一下优缺点:

在这里插入图片描述

注意:决策树是训练的时候需要很长时间,测试的时候很快。KNN是训练的时候花费很少的时间,但是测试的时候花费较长时间。

决策树、随机森林和Gradient Boosting

决策树算法是一种通过一系列的IF-THEN规则形成的具有树形结构的流程,人类可以很明白的理解算法的流程,并且提供可视化的指导做决策的步骤。但是它也有一些问题,比如overfitting、Bias和Variance等。Overfitting的发生来源于很多原因,可能是noise的存在、丢失一些很典型的样本(representative instances)。

随机森林和Gradient Boosting分别属于集成学习中的bagging和boosting思想。

随机森林是单个决策树的聚合。

当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。来自(https://easyai.tech/ai-definition/random-forest/)

单个的决策树是一个比较弱的预测器,但是相对来说建立的比较快;随机森林是一个更加鲁棒性(robust)的模型,有效防止过拟合,但是随机森林中的树越多,训练过程就越慢。特征越多,训练过程就越慢。

另一个区别是决策树很容易理解,只要沿着一条路径往下走就好了,随机森林的推断过程相对来说复杂一些。

Gradient Boosting与随机森林一样,都是很多决策树的组合。Gradient Boosting与随机森林的主要区别有两个:

  1. 建立过程不一样。随机森林是每棵树的建立都是相互独立的,Gradient Boosting是一次构建一棵树,采用串联的方式,后续的每棵树是改进前面的弱学习器的缺点。
  2. 组合结果不一样,随机森林是多数投票或者平均值机制,Gradient Boosting只会沿途组合结果(combine results along the way)

Gradient Boosting不适合有很多噪声的数据,会很容易overfitting。

随机森林和Gradient Boosting的应用领域也有些不一样:

  • 随机森林在多目标检测和生物信息学方向应用比较多,这些领域往往有很多统计学的噪声。
  • Gradient Boosting在数据不平衡的时候往往表现良好。

Reference:

https://blog.csdn.net/qq_41661809/article/details/90321622

https://www.zhihu.com/question/22928442/answer/440836807

https://www.zhihu.com/question/36659925

https://blog.csdn.net/MusicDancing/article/details/119707982

李航统计学习方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习(三) --- DT(Decision Tree) 的相关文章

  • D3.js 在径向树中的元素之间添加链接(分层边缘捆绑元素)

    几个月前 我尝试过使用 d3 js 将分层边缘捆绑和径向 Reingold Tilford 树结合起来 https stackoverflow com questions 39150514 d3 js combining hierarchi
  • 在Python中生成字典树中的所有叶到根路径

    我有一个 非标准 形式的字典树 如下所示 tree 0 A B C D E F 叶节点被定义为字典键值对 其中值是空字典 我想将所有叶到根路径提取为列表列表 如下所示 paths C B A 0 E D 0 F D 0 如果有帮助的话 也可
  • 静止搜索性能

    这是一个双重问题 我组装了一个简单的国际象棋引擎 它执行 Alpha Beta 搜索 最后执行静止搜索 静止搜索正在影响性能 问题是 这是可以接受的性能影响吗 如果不是 那么应该采取什么措施来解决这个问题 下图给出了性能影响 请注意 这些统
  • C++ 中的动态树

    我想制作一棵树 每个节点都可以有一些子节点 但我不知道它们的数量 树必须在小内存中使用 无额外数据 以每个节点的恒定时间进行编码 我认为我将创建具有值和子属性 值是 int 子属性是堆栈 的类 Tree 以及指向该树中每个节点的指针数组 我
  • 如何在 HTML 表格中呈现树?

    我正在尝试在 HTML 表中显示树结构 它基本上是您提到某个网站的人员列表 但您可以展开每个人员并查看他们也提到的人员 仅 2 或 3 级 我还显示了每个人的许多信息 因此我使用了一个包含几列的表格 我想知道显示此内容的最佳方式是什么 以便
  • 从物化路径构建 JSON 树

    我计划在 MongoDB 中使用物化路径来表示树 并且需要将物化路径转换回 JSON 树 前任 物化路径 var input id 0 path javascript id 1 path javascript database id 2 p
  • 如何使用纯 CSS 在 HTML 中获取一棵树

    我正在尝试遵循这个tutorial http odyniec net articles turning lists into trees 这是my code https github com gurjeet CSSTree so far 本
  • 对整数树求和 (Haskell)

    我正在尝试创建一个对非二叉整数树的值求和的函数 datastructures hs data Tree a Empty Node a Tree a deriving Eq Show myNums Num a gt Tree a myNums
  • 在Python中动态评估简单的布尔逻辑

    我有一些动态生成的布尔逻辑表达式 例如 A 或 B 和 C 或 D A 或 A 和 B A 空 计算结果为 True 占位符被替换为布尔值 我是不是该 将此信息转换为 Python 表达式 例如True or True or False a
  • C# 解析宽松的 json 来制作一棵树

    所以我需要解析类似这样的文件 pl GENERIC BACK COFNIJ WAIT CZEKAJ PAGES ABOUTME ID ID INFO STATUS STATUS TOP MENU LOGGED Zalogowany OPTI
  • 以 BFS 风格将深度的嵌套字典(森林)写入文本文件

    继续我的旧问题 将深度巨大的嵌套字典 森林 写入文本文件 https stackoverflow com questions 51500003 writing nested dictionary forest of a huge depth
  • Python 中的树形图

    我想用 Python 绘制树 决策树 组织结构图等 有哪些库可以帮助我完成这些任务 I develop ETE http etetoolkit org which is a python package intended among oth
  • 命令提示符中树的输出

    我希望能够使用 tree F A gt desktop file txt 命令仅输出文本文件 目前 它输出每个文件扩展名 有谁知道有一个简单的方法可以做到这一点 Tree仅接受几个命令行参数 c gt Tree Graphically di
  • 二叉搜索树是平衡的吗?

    这已经讨论过了here https stackoverflow com questions 742844 how to determine if binary tree is balanced 但我在下面有一个实现 线程中从未讨论过 pub
  • 如何使用表达式树安全访问可为空对象的路径?

    当我将反序列化的 XML 结果放入 xsd 生成的对象树中 并希望使用该树 a b c d e f 内的某些深层对象时 如果该查询路径上的任何节点丢失 它将给出异常 if a b c d e f null Console Write ok
  • Tic-Tac-Toe AI:如何制作树?

    在制作井字游戏机器人时 我在尝试理解 树 时遇到了巨大的障碍 我理解这个概念 但我不知道如何实现它们 有人可以向我展示一个如何为这种情况生成树的示例吗 或者关于生成树的好教程 我想最困难的部分是生成部分树 我知道如何实现生成整棵树 但不知道
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • Silverlight 中的图形可视化

    我有一个表示有向图的数据结构 我正在寻找一个好的 Silverlight 可视化 以允许我从一个节点导航到另一个节点 最好带有一些漂亮的动画 有谁知道这种显示有什么好的 UI 控件或框架吗 甚至是来自另一个领域的样本 也许是社交网络 我的图
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循

随机推荐

  • python http 身份认证简介

    目录 授权方式简介 1 Basic Authentication 2 OAuth 3 Token Authentication 4 Digest Authentication xff08 重点说一下 xff09 代码实现 1 基本身份认证
  • 记录VScode调试过慢的问题

    目录 问题 xff1a 解决方案 xff1a 0806更新报错 问题 xff1a 最近在使用VScode的过程中调试慢到让人接受不了 xff0c 遂寻找解决方案 xff0c 重装VScode 在网上找了好多答案 xff0c 尝试后均无法解决
  • Android APP漏洞自动化静态扫描检测工具-Qark环境搭建与使用

    QARK 1 qark简介 LinkedIn最近开源了他的静态分析工具QARK xff0c 该工具用于分析那些用Java语言开发的Android应用中的潜在安全缺陷 QARK 全称 Quick Android Review Kit 这个工具
  • QT中CMakeLists添加第三方库

    1 新建项目 xff0c 打开CMakeLists txt文件 cmake minimum required VERSION 2 8 project fp test cm 括号内fp test cm为项目名称 add executable
  • Linux下curl模拟带header的Http请求

    格式 xff1a curl H 头部内容 http xxx 123 com curl span class hljs attribute H span span class hljs string 34 Accept text html a
  • 中断与查询方式的比较

    单片机在操作外部设备时 xff0c 常用的有中断和查询两种方式 除了在编程方面的区别外 xff0c 在性能和效率上都是有所区别 中断的性能要比查询强大 xff0c 反应速度快 xff0c 要求相应的ISR不能过于繁琐 xff0c 而且要求电
  • 解决nodejs报错TypeError: ParserIncomingMessage is not a constructor.

    当前最新的 node v8 12 v10 11 在 http模块里有一个bug bug报错如下 xff1a TypeError ParserIncomingMessage is not a constructor at HTTPParser
  • 串口通信基础知识(UART)

    目录 一 串口通信的具体分类 xff1a 二 常见的串行通信接口简介 xff1a 三 具体通信标准的实现 xff1a 1 UART xff08 通用异步收发传输器 xff09 xff1a 一 串口通信的具体分类 xff1a 总结一下 xff
  • ++声明、定义、类的定义、头文件作用、头文件重复引用

    转载至 xff1a 点击打开链接 C 43 43 声明 定义 类的定义 头文件作用 头文件重复引用 xff0c 不具名空间 转自 xff1a http www cnblogs com rocketfan archive 2009 10 02
  • 三维旋转矩阵;东北天坐标系(ENU);地心地固坐标系(ECEF);大地坐标系(Geodetic);经纬度对应圆弧距离

    目录 TOC自动生成 旋转矩阵东北天 站心坐标系地心坐标系参考文献 旋转矩阵 Givens rotation 逆时针 Jacobi rotation 顺时针 箭头朝里朝外 xff0c 顺时针 逆时针 xff0c 61 61 旋转角的正负 6
  • libcurl进行异步并发

    libcurl的easy 接口 xff0c easy接口的使用非常的简单 xff0c curl easy init用来初始化一个easy curl对象 xff0c curl easy setopt对easy curl对象进行相关设置 xff
  • unbuntu运行VINS-MONO实验总结

    ubuntu16 04运行VINS ONO实验总结 初探 简介1 环境配置2 运行Euroc数据集 xff13 小觅摄像头运行vins mono 简介 VINS Mono是香港科技大学沈劭劼团队开源的单目视觉惯导SLAM方案 前端KLT稀疏
  • 电子硬件3.杜邦线

    杜邦线是常用于电路连接的导线 xff0c 能够刚好插在常用的2 54mm间距的排针上 杜邦线的三种类型为 xff1a 公公线 公母线 母母线
  • Android应用安全检测工具简介

    Android应用安全检测工具简介 1 测试工具集 Appie 轻量级的软件包 可以用来进行基于Android的渗透测试 不想使用VM的时候可以尝试一下 Android Tamer 可以实时监控的虚拟环境 可以用来进行一系列的安全测试 恶意
  • C语言浮点型数据存储结构

    1 float类型 float类型占四个字节 xff0c 每个字节占8位 xff0c 总共32位 xff0c 其内存结构如下图 xff1a 31位为符号位 xff1a 0表示正数 xff0c 1表示负数 31 23位 xff1a 共8位表示
  • sockaddr和sockaddr_in详解

    struct sockaddr和struct sockaddr in这两个结构体用来处理网络通信的地址 一 sockaddr sockaddr在头文件 include lt sys socket h gt 中定义 xff0c sockadd
  • python requests模拟登陆带验证码的网站

    作为之前专利爬虫的续篇 xff0c 本篇准备描述如何通过python的requests模块登录专利查询网站 环境准备 python 3 6requests chrome尝试 首先 xff0c 我们使用chrome尝试登录专利网站 xff0c
  • 兔子与兔子(下一篇解释原理:字符串哈希)

    文章目录 兔子与兔子题目描述解题思路 兔子与兔子 题目描述 很久很久以前 xff0c 森林里住着一群兔子 有一天 xff0c 兔子们想要研究自己的 DNA 序列 我们首先选取一个好长好长的 DNA 序列 xff08 小兔子是外星生物 xff
  • 机器学习(二)--- KNN(K-Nearest Neighbors)

    KNN K Nearest Neighbors 简单类比 xff08 Simple Analogy xff09 KNN xff1a 通过你周围的人来判断你是哪一类人 Tell me about your friends who your n
  • 机器学习(三) --- DT(Decision Tree)

    文章目录 Decision TreeIntroductionConstructing Decision Treesexample Pruning决策树 随机森林和Gradient BoostingReference xff1a Decisi