《机器学习》读书笔记:总结“第4章 决策树”中的概念

💠决策树

基于树结构进行决策。

一棵决策树包括:

  • 一个 根节点(起点)
  • 若干 叶节点(没有下游节点的节点)
  • 若干 内部节点(分支节点)

即:

根节点
内部节点1
叶节点A
叶节点B
内部节点2
内部节点3
内部节点4
叶节点C
叶节点D
叶节点E
叶节点F

💠决策树学习基本算法:分而治之(divide and conquer)

训练集: D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\{(\bold{x}_1,y_1),(\bold{x}_2,y_2),...,(\bold{x}_m,y_m)\} D={(x1,y1),(x2,y2),...(xm,ym)}
其中的 y y y 是标记,即分类,其值可能是 C 1 C_1 C1 C 2 C_2 C2、… C n C_n Cn
其中 x \bold{x} x 的属性集 A = { a 1 , a 2 , . . . , a d } A=\{a_1,a_2,...,a_d\} A={a1,a2,...,ad}

这个算法是一个递归函数:
(笔者标记:这里的伪代码和原文不一样。一是我改变了一些表述与排版使我自己更容易理解;二是原文第12行的 “return” 我认为不对,又或者那里的 “return” 并非C++中的 “从函数返回”,而是 “从循环中返回”。不管怎样,我改成了符合C++语法习惯的伪代码)

TreeGenerate( D D D, A A A)
{
····创建一个节点 node

····if ( D D D中的样本全属于同一类别 C C C)
····{
········node = “输出是 C C C的叶节点”
········return node
····}

····if ( A A A 为空) or ( D D D A A A上取值相同)
····{
········令 C C C D D D中样本最多的分类
········node = “输出是 C C C的叶节点”
········return node
····}

····从 A A A中选择最优划分属性 a ∗ a_* a (关键步骤)
····for ( a ∗ a_* a中的每一个值 a ∗ v a_*^v av)
····{
········在 node创建一个分支节点 node_child,用于对应 D D D 的子集 D v D_v Dv
········其中 D v D_v Dv 表示 D D D 中在 a ∗ a_* a 上取值为 a ∗ v a_*^v av 的子集
········if ( D v D_v Dv 为空)
········{
············令 C C C D D D中样本最多的分类
············node_child = “输出是 C C C的叶节点”
········}
········else
········{
············node_child = TreeGenerate( D v D_v Dv, A ∖ { a x } A \setminus \{a_x\} A{ax}) (其中\意思是从集合中去掉)
········}
····}
····return node
}

从上面算法可以看出,最关键步骤是: A A A中选择最优划分属性 a ∗ a_* a

💠纯度(purity)

我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的“纯度”越来越高。

💠信息熵(information entropy)

“信息熵” 是度量样本集合纯度最常用的一种指标。
在样本集合 D D D 中,用 p k ( k = 1 , 2 , . . . , ∣ Y ∣ ) p_k(k=1,2,...,|\mathcal{Y}|) pk(k=1,2,...,Y) 表第 k k k 类样本所占的比例。则 D D D 的信息熵定义为:
E n t ( D ) = − ∑ k = 1 ∣ Y ∣ p k log ⁡ 2 p k ( 约定当 p = 0 时, p log ⁡ 2 p = 0 ) Ent(D)=-\sum_{k=1}^{|\mathcal{Y}|} p_k\log_2p_k \\ (约定当 p=0 时,p\log_2p=0) Ent(D)=k=1Ypklog2pk(约定当p=0时,plog2p=0)

E n t ( D ) Ent(D) Ent(D) 越小,则 D D D 的纯度越高

💠信息增益(information gain)

假定离散属性 a a a V V V 个可能的取值 { a 1 , a 2 , . . . , a V } \{a^1,a^2,...,a^V\} {a1,a2,...,aV}

若使用 a a a 对样本集 D D D 进行划分,则会产生 V V V 个分支节点,其中第 v v v 个分支节点包含了 D D D 里所有在 a a a 上取值为 a v a^v av 的样本,这个子集记为 D v D_v Dv

可以算出它们各自的信息熵 E n t ( D v ) Ent(D_v) Ent(Dv)。又因为每个分支节点所包含的样本数目不同,所以再乘算上权重 ∣ D v ∣ ∣ D ∣ \frac{|D^v|}{|D|} DDv

最终,就可以计算出当使用 a a a 对样本集 D D D 进行划分时,所获得的 “信息增益”:
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a)=Ent(D)-\sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D_v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)

信息增益越大,则表示用 a a a 来进行划分所获得的纯度提升越大。所以在之前算法里 “从 A A A中选择最优划分属性 a ∗ a_* a” 的步骤中就可以选择纯度提升最大的 a a a。著名的 ID3 决策树学习算法[Quinlan,1986] 就是以此为准则来选择划分的属性。

💠增益率(gain ratio)

实际上,“信息增益” 的准则对可取值数目较多的属性有偏好。为减少此不利影响,可以使用“增益率”,定义为:
G a i n _ r a i o ( D , a ) = G a i n ( D , a ) I V ( a ) 其中: I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ Gain\_raio(D,a)=\frac{Gain(D,a)}{IV(a)} \\ 其中:IV(a)=-\sum_{v=1}^V\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|} Gain_raio(D,a)=IV(a)Gain(D,a)其中:IV(a)=v=1VDDvlog2DDv

I V ( a ) IV(a) IV(a) 被称为属性 a a a 的“固有值(intrinsic value)”,通常属性取值数目越多( V V V越大)则 I V ( a ) IV(a) IV(a) 越大。

但需要注意,“增益率” 的准则对可能取值数目较少的属性有所偏好。C4.5 算法使用了一个启发式[Quinlan,1993]:先找出信息增益高于平均水平的属性,然后再从中选择增益率最高的。

💠基尼指数(Gini index)

数据集 D D D 的纯度可用“基尼值”来度量:
G i n i ( D ) = ∑ k = 1 ∣ Y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ Y ∣ p k 2 \begin{aligned} Gini(D) & = \sum_{k=1}^{|\mathcal{Y}|}\sum_{k'\ne k}p_kp_{k'} \\ & = 1- \sum_{k=1}^{|\mathcal{Y}|}{p_k}^2\\ \end{aligned} Gini(D)=k=1Yk=kpkpk=1k=1Ypk2

直观来说 G i n i ( D ) Gini(D) Gini(D) 反映了从数据集 D D D 中随机抽取两个样本,其类别标记不一致的概率。因此 G i n i ( D ) Gini(D) Gini(D) 越小,数据集 D D D 纯度越高。

类似,属性 a a a 的 基尼指数(Gini index) 定义为:
G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini\_index(D,a)=\sum_{v=1}^V\frac{|D^v|}{|D|}Gini(D_v) Gini_index(D,a)=v=1VDDvGini(Dv)

于是,在侯选属性集合 A A A 中,我们选择划分后基尼系数最小的属性。

💠剪枝(pruning)

决策树学习有时会出现决策树分支过多,也就是 “过拟合” 的情况。
剪枝(pruning)是决策树学习中对付 “过拟合” 的主要手段。

💠预剪枝(prepruning)

在决策树生成过程中,对每个节点在划分前先进行估计,如果不能带来泛化性提升,则停止划分并直接标记为叶节点。

优点:

  • 减少训练开销。

缺点:

  • 欠拟合风险。

💠后剪枝(post-pruning)

先生成一颗完整的决策树,然后自底向上地对非叶节点进行考察。若将该节点对应地子树替换为叶节点可以带来泛化性提升,则替换为叶节点。

优点:

  • 欠拟合风险很小。泛化性能往往优于预剪枝。

缺点:

  • 训练时间要大很多。

💠连续值处理:二分法(bi-partition)

当属性是连续值时,由于可取值的数目不再有限,因此无法再根据这个属性对节点进行划分。
此时可以用 “离散化技术”。最简单的策略是 二分法,C4.5决策树算法中采用了这个机制。

给定样本集 D D D 和连续属性 a a a 。假定 a a a D D D 上出现了 n n n 个不同的取值,将这些值从小到大进行排序,记为 { a 1 , a 2 , . . . , a n } \{a^1,a^2,...,a^n\} {a1,a2,...,an}。基于划分点 t t t 可将 D D D 划分为子集 D t − D_t^- Dt D t + D_t^+ Dt+,分别表示哪些在属性 a a a 上 “不大于 t t t” 和 “大于 t t t”的样本。显然, t t t 在区间 [ a i , a i + 1 ) [a^i,a^{i+1}) [ai,ai+1) 中取任意值的划分结果相同。因此,我们考察的候选划分点集合:
T a = { a i + a i + 1 2 ∣ 1 ⩽ i ⩽ n − 1 } T_a=\{\frac{a^i+a^{i+1}}{2}|1\leqslant i\leqslant n-1\} Ta={2ai+ai+1∣1in1}
随后,就可以像离散属性值一样考察这些划分点,选出最优的划分点对样本集合进行划分了。

需要注意,不同于离散属性,若当前节点划分属性为连续属性,后续节点仍旧可以用这个属性进行划分。

💠缺失值处理

样本的某些属性可能出现缺失,如果简单放弃不完整的样本,显然是对数据信息极大的浪费。

考虑有缺失值的训练样本进行学习,需要解决两个问题:


(问题1)如何选择用于划分的属性?

给定训练集 D D D 和属性 a a a a a a V V V 个可能的取值 { a 1 , a 2 , . . . , a V } \{a^1,a^2,...,a^V\} {a1,a2,...,aV}。分类取值为 ( k = 1 , 2 , . . . , ∣ Y ∣ ) (k=1,2,...,|\mathcal{Y}|) (k=1,2,...,Y)。令:
D ~ \tilde{D} D~ 表示 D D D a a a 上没有缺失值的样本子集。
D ~ v \tilde{D}^v D~v 表示 D ~ \tilde{D} D~ a a a 上取值为 a v a^v av 的子集。
D ~ k \tilde{D}_k D~k 表示 D ~ \tilde{D} D~ 属于 k k k 类的子集。

假定每个样本 x \bold{x} x都有一个权重 ω x \omega_{\bold{x}} ωx。然后定义:
ρ \rho ρ 表示无缺失值样本所占的比例,即: ρ = ∑ x ∈ D ~ ω x ∑ x ∈ D ω x \rho=\frac{\sum_{\bold{x}\in\tilde{D}}\omega_{\bold{x}}}{\sum_{\bold{x}\in D}\omega_{\bold{x}}} ρ=xDωxxD~ωx
p ~ k \tilde{p}_k p~k表示无缺失值样本中第 k k k 类所占的比例,即 p ~ k = ∑ x ∈ D ~ k ω x ∑ x ∈ D ~ ω x \tilde{p}_k=\frac{\sum_{\bold{x}\in\tilde{D}_k}\omega_{\bold{x}}}{\sum_{\bold{x}\in \tilde{D}}\omega_{\bold{x}}} p~k=xD~ωxxD~kωx
r ~ v \tilde{r}_v r~v表示无缺失值样本中在属性 a a a 上取值为 a v a^v av 的样本所占的比例,即 r ~ v = ∑ x ∈ D ~ v ω x ∑ x ∈ D ~ ω x \tilde{r}_v=\frac{\sum_{\bold{x}\in\tilde{D}^v}\omega_{\bold{x}}}{\sum_{\bold{x}\in \tilde{D}}\omega_{\bold{x}}} r~v=xD~ωxxD~vωx

基于上述定义,用属性 a a a 进行划分的信息增益的计算公式推广为:
G a i n ( D , a ) = ρ × G a i n ( D ~ , a ) = ρ × ( E n t ( D ~ ) − ∑ v = 1 V r ~ v E n t ( D ~ v ) ) 其中: E n t ( D ~ v ) = − ∑ k = 1 ∣ Y ∣ p ~ k log ⁡ 2 p ~ k \begin{aligned} Gain(D,a) & = \rho \times Gain(\tilde{D},a) \\ & = \rho \times (Ent(\tilde{D})-\sum_{v=1}^V \tilde{r}_vEnt(\tilde{D}^v))\\ \end{aligned}\\ 其中:Ent(\tilde{D}^v)=-\sum_{k=1}^{|\mathcal{Y}|} \tilde{p}_k\log_2\tilde{p}_k Gain(D,a)=ρ×Gain(D~,a)=ρ×(Ent(D~)v=1Vr~vEnt(D~v))其中:Ent(D~v)=k=1Yp~klog2p~k

接着就可以正常计算出用哪个属性进行划分最好了


(问题2)若样本在该属性上缺失,则应该划分到哪个分支节点?
采用以下逻辑:

  • 假如样本 x \bold{x} x 在属性 a a a 上已知,则正常划分到对应分支节点,权重值保持为 ω x \omega_{\bold{x}} ωx
  • 假如样本 x \bold{x} x 在属性 a a a 上缺失,则将 x \bold{x} x 划分到所有的分支节点,并将 a v a^v av 对应的分支节点中的权重值调整为 r ~ v ⋅ ω x \tilde{r}_v \cdot \omega_{\bold{x}} r~vωx

💠多变量决策树

上面所讨论的都是变量的决策树,也就是每个分支节点都使用一个属性进行划分。

若我们把每个属性视为坐标空间中的一个坐标轴,则 d d d 个属性描述的样本就对应了 d d d 维空间中的一个点。对样本分类意味着在这个空间中寻找不同样本间的分类边界变量的决策树所形成的分类边界的特点是:分类边界是与坐标轴平行的(axis-parallel)。举例:

左图是决策树,右侧是其对应的分类边界:
在这里插入图片描述
但是,当学习任务的真实分类边界 比较复杂时,必须使用很多段划分才能获得较好的近似,如下图:
在这里插入图片描述
其中绿线是真实的分类边界。
此时如果还使用单变量的决策树,则会需要很多分段。可以看到黑线有9段。
但如果使用多变量的决策树,则只需要3段。红线代表使用多变量决策树的分类边界。

在多变量决策树中,每个分支节点不再是针对于一个属性,而是对属性的线性组合进行测试,即每个分支节点都是一个形如 ∑ i = 1 d ω i a i = t \sum_{i=1}^d\omega_ia_i=t i=1dωiai=t 的线性分类器,其中 ω i \omega_i ωi a i a_i ai 的权重, ω i \omega_i ωi t t t 都是学习所得。

这样,对于之前的样本,学习成多变量决策树如左图,对应的分类边界如右图:
在这里插入图片描述

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

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

相关文章

leetcode每日一题-3101 交替子数组计数

暴力遍历&#xff1a;看起来像是回溯,实际上就是递归 class Solution { private:long long _res 0; public:long long countAlternatingSubarrays(vector<int>& nums) {backtrack(nums, 0);return _res;}void backtrack(vector<int>& nums, long long st…

黑马|最新AI+若依 |初识项目

本章主要内容是&#xff1a; 1.快速搭建了若依前后端项目在本地 2.实现了单表的增删改查快速生成 文章目录 介绍1.若依介绍2.若依的不同版本3.项目运行环境 初始化前后端项目1.下载若依项目2.初始化后端a.把表导入到数据库中b.更改application.yml文件 3.初始化前端a.安装依赖…

【游戏引擎之路】登神长阶(六)——雅达利2600汇编学习,任天堂居然还真不是抄袭起家

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7…

基于海思Hi3403V100方案开发双目1600万拼接相机测试截图

海思Hi3403V100平台SOC内置四核A55&#xff0c;提供高效且丰富和灵活的CPU资源&#xff0c;以满足客户计算和控制需求&#xff0c;并且集成单核MCU&#xff0c;已满足一些低延时要求较高场景。 多目相机PE108CB板是针对该芯片设计的一款多目凭借相机PCBA&#xff0c;硬件接口支…

node.js_HTTP协议

Hypertext Transfer Protocol 超文本传输协议 1.HTTP报文 请求行 请求头 请求体 它的内容形式很灵活&#xff0c;可以设置任意内容 2.HTTP响应报文 响应状态码 响应状态的描述 遇到陌生的状态码可以参考一下这个网址&#xff1a; https://developer.mozilla.org/zh-C…

期末成绩发布方式

期末考试结束后&#xff0c;成绩单的发放总是让老师们头疼不已。想象一下&#xff0c;每个学生的成绩都需要老师一个个私信给家长&#xff0c;不仅耗时耗力&#xff0c;而且极易出错。 在传统的成绩单发放方式中&#xff0c;老师往往需要通过电子邮件、短信或者微信等方式&…

python爬虫入门(一)之HTTP请求和响应

一、爬虫的三个步骤&#xff08;要学习的内容&#xff09; 1、获取网页内容 &#xff08;HTTP请求、Requests库&#xff09; 2、解析网页内容 &#xff08;HTML网页结构、Beautiful Soup库&#xff09; 3、存储或分析数据 b站学习链接&#xff1a; 【【Python爬虫】爆肝两…

数据合并 26-30题(30 天 Pandas 挑战)

数据合并 1. 知识点1.27 左连接1.28 数据填充与交叉连接1.29 获取列值列表 题目2.26 合作过至少三次的演员和导演2.27 使用唯一标识码替换员工ID2.28 学生们参加各科测试的次数2.29 至少有5名直接下属的经理2.30 销售员 1. 知识点 1.27 左连接 datapd.merge(employees,employ…

什么是五级流水?银行眼中的“好流水”,到底是什么样的?

无论是按揭买房还是日常贷款&#xff0c;银行流水都是绕不开的一环。规划好你的流水&#xff0c;不仅能让你在申请贷款时更有底气&#xff0c;还可能帮你省下不少冤枉钱。今天&#xff0c;咱们就来一场深度剖析&#xff0c;聊聊如何在按揭贷款、个人经营抵押贷款前&#xff0c;…

什么是SysTick?

一&#xff0c;滴答定时器SysTick SysTick&#xff0c;即滴答定时器&#xff0c;是内核中一个特殊的定时器&#xff0c;用于提供系统级的定时服务。是一个24位递减计时器&#xff0c;具有自动重载值寄存器的功能 。当计数器到达自动重载值时&#xff0c;它会自动重新加载新的计…

深入探索Python库的奇妙世界:赋能编程的无限可能

在编程的浩瀚宇宙中&#xff0c;Python以其简洁的语法、强大的功能和广泛的应用领域&#xff0c;成为了众多开发者心中的璀璨明星。而Python之所以能够如此耀眼&#xff0c;很大程度上得益于其背后庞大的库生态系统。这些库&#xff0c;如同一块块精心雕琢的积木&#xff0c;让…

【Linux详解】进程等待 | 非阻塞轮询

引入&#xff1a; 为什么&#xff1f;是什么&#xff1f;怎么办 是什么&#xff1f; 进程等待是指父进程暂停自己的执行&#xff0c;直到某个特定的子进程结束或发生某些特定的事件。 为什么&#xff1f; 僵尸进程刀枪不入&#xff0c;不可被杀死&#xff0c;存在内存泄露…

安卓备忘录App开发

安卓备忘录APP开发,文章末尾有源码和apk安装包 目标用户: 普通安卓手机用户,需要一个简单易用的备忘录App来记录和管理日常事务。 主要功能: 用户注册: 用户可以创建一个账号,输入用户名和密码。 用户登录: 用户可以通过用户名和密码登录到应用。 用户信息存储: 用户名和…

【python】OpenCV—Feature Detection and Matching

参考学习来自OpenCV基础&#xff08;23&#xff09;特征检测与匹配 文章目录 1 背景介绍2 Harris角点检测3 Shi-Tomasi角点检测4 Fast 角点检测5 BRIEF 特征描述子6 ORB(Oriented Fast and Rotated Brief) 特征描述子7 SIFT(Scale Invariant Feature Transform) 特征描述子8 SU…

从一个(模型设计的)想法到完成模型验证的步骤

从有一个大型语言模型&#xff08;LLM&#xff09;设计的想法到完成该想法的验证&#xff0c;可以遵循以下实践步骤&#xff1a; 需求分析&#xff1a; 明确模型的目的和应用场景。确定所需的语言类型、模型大小和性能要求。分析目标用户群体和使用环境。 文献调研&#xff1a…

【全面讲解下iPhone新机官网验机流程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

实现多数相加,但是传的参不固定

一、情景 一般实现的加法和减法等简单的相加减函数的话。一般都是写好固定传的参数。比如&#xff1a; function add(a,b) {return a b;} 这是固定的传入俩个&#xff0c;如果是三个呢&#xff0c;有人说当然好办&#xff01; 这样写不就行了&#xff01; function add(a…

protobuf及其使用

首先打开proto文件&#xff0c;定义一个类&#xff08;数据结构&#xff09;&#xff0c;并编写成员变量 使用protobuf编译器protoc编译proto文件为.pb.h和.pb.c文件(c) 看绿色注释部分&#xff1a;从左至右为&#xff0c;编译器&#xff0c;.proto文件的路径&#xff0c;编译的…

YOLO V7网络实现细节(2)—网络整体架构总结

YOLO V7网络整体架构总结 YOLO v7网络架构的整体介绍 不同GPU和对应模型&#xff1a; ​​​​​​​边缘GPU&#xff1a;YOLOv7-tiny普通GPU&#xff1a;YOLOv7​​​​​​​云GPU的基本模型&#xff1a; YOLOv7-W6 激活函数&#xff1a; YOLOv7 tiny&#xff1a; leaky R…

微深节能 煤码头自动化翻堆及取料集控系统 格雷母线

微深节能格雷母线高精度位移测量系统是一种先进的工业自动化位置检测解决方案&#xff0c;它被广泛应用于煤码头自动化翻堆及取料集控系统中&#xff0c;以实现对斗轮堆取料机等大型机械设备的精准定位和自动化控制。 系统原理简述&#xff1a; 格雷母线系统的工作原理基于电磁…