决策树相关知识小结

前言

本文是一篇关于决策树方面知识的小结,不包含具体的例子(想看例子推荐文献[1]的第4章),主要总结了ID3、C4.5和CART树三者的区别,剪枝处理,连续值和缺失值的处理。

决策树的基本算法

决策树的学习目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循“分治”的策略,基本算法如下所示:

***********************输入********************
训练集 D={(x1,y1),(x2,y2),...,(xm,ym)}x中有 (col1,col2,...,colk) 共k组特征
每个col下有相应的属性值(a1,a2,...,ap)y中有 (l1,l2,...,ln) 共n种类标签
***********************过程********************
if 数据集中的每个子项属于同一分类 thenreturn 类标签
else寻找划分数据集的最好特征*划分数据集创建分支结点for 每个划分的子集递归调用该函数并增加返回结果到分支结点中end forreturn 分支结点
end if 
***********************输出********************
一颗决策树

其中,最为重要的是“寻找划分数据集的最好特征”这一步(我特意打上了*号),这也是不同算法的区别所在。

ID3、C4.5和CART的区别

ID3算法

在划分数据集的过程当中,我们希望决策树的分支结点所包含的样本尽可能地属于同一类别,即结点的纯度越来越高。
在ID3算法中,利用了信息增益这一准则来划分数据集,要了解信息增益,首先要知道信息熵的概念。信息熵是度量样本集合纯度最常用的一项指标。假设当前样本DDD的第kkk类样本所占的比例为pk(k=1,2,...,n)p_k(k=1,2,...,n)pk(k=1,2,...,n),则,DDD的信息熵定义为

Ent(D)=−∑k=1npk⋅log2pkEnt(D)=-\sum_{k=1}^{n}p_k \cdot log_2p_kEnt(D)=k=1npklog2pk

En(D)En(D)En(D)的值越小,DDD的纯度就越高。
假定特征colcolcolVVV个可能的取值{a1,a2,...,aV}\{a^1,a^2,...,a^V\}{a1,a2,...,aV},若使用colcolcol来对样本集DDD划分,则会划分成VVV个子集,其中以ava^vav划分出来的子集,记为DvD^vDv,那么信息增益可以表示为

Gain(D,col)=Ent(D)−∑v=1V∣Dv∣∣D∣Ent(Dv)Gain(D,col)=Ent(D)-\sum_{v=1}^{V}\dfrac{|D^v|}{|D|}Ent(D^v)Gain(D,col)=Ent(D)v=1VDDvEnt(Dv)

其中,∣D∣|D|D表示数据集中的样本个数。
ID3就是使用信息增益最大为准则来划分数据集的,计算出每个colcolcol下的Gain(D,col)Gain(D,col)Gain(D,col),然后选择值最大的那一个。
但这样的做法为偏袒于属性数量较多的特征,即VVV较大的colcolcol,为解决这个问题,就有了C4.5算法。

C4.5算法

与ID3算法不同,C4.5是利用增益率来进行划分的,其定义如下:

Gain_ratio(D,col)=Gain(D,col)IV(col)Gain\_ratio(D,col)=\dfrac{Gain(D,col)}{IV(col)}Gain_ratio(D,col)=IV(col)Gain(D,col)

其中

IV(col)=−∑v=1V∣Dv∣∣D∣log2DvDIV(col)=-\sum_{v=1}^{V}\dfrac{|D^v|}{|D|}log_2\dfrac{D^v}{D}IV(col)=v=1VDDvlog2DDv

IV(col)IV(col)IV(col)称为特征colcolcol的固有值,特征colcolcol的属性越多,IV(col)IV(col)IV(col)的值就越大。
这样一来就可以解决ID3的弊端,然而,值得注意的是,增益率准则对属性值数目较少的特征有所偏好,故C4.5并不是直接取增益率最大的特征来划分数据集的,而是采用了一种启发式的方法:先从数据集中找出信息增益高于平均水平的特征,然后从中选择增益率最高的。

CART算法

CART则采用了基尼指数来划分属性,数据集DDD的纯度可以用基尼值来度量:

Gini(D)=∑k1=1n∑k1!=k2npk1pk2=1−∑k=1npk2Gini(D)=\sum_{k1=1}^{n}\sum_{k1!=k2}^{n}p_{k1}p_{k2}=1-\sum_{k=1}^{n}p_k^2Gini(D)=k1=1nk1!=k2npk1pk2=1k=1npk2

基尼值反应了从数据集中随机抽取两个样本,其类标签不一致的概率,因此基尼值越小,数据集的纯度越高。
特征colcolcol的基尼指数定义为

Gini_index(D,col)=∑v=1V∣Dv∣DGini(Dv)Gini\_index(D,col)=\sum_{v=1}^{V}\dfrac{|D^v|}{D}Gini(D^v)Gini_index(D,col)=v=1VDDvGini(Dv)

CART就是选择划分后基尼指数最小的特征为最优划分特征的。

剪枝

剪枝是解决过拟合问题的重要手段,主要分为“预剪枝”和“后剪枝”两种。在剪枝的时候我们要引入验证集用来帮助我们判断是否需要剪枝。

预剪枝

预剪枝是边生成决策树边剪枝的一种做法。基于信息增益准则或者增益率准则或者基尼指数,我们会选出最优的特征来进行数据集的划分,这个时候预剪枝做的就是判断划分前后,验证集的精度是否会提高,如果提高的话就进行划分,否则不进行划分,也就是剪枝了。
预剪枝可以降低过拟合的风险,而且还显著减少了决策树的训练时间开销和测试时间开销。
不过,预剪枝是一种贪心的做法,有些划分可能在当前不能提高性能,但在之后的划分中可以显著提高决策树的性能,所以预剪枝有着欠拟合的风险。

后剪枝

后剪枝是先生成一颗完整的决策树,然后自底向上地进行剪枝,判断某个分支结点替换为叶子结点后是否会提高验证集的精度,可以提高则将分支结点替换为叶子结点,否则不替换。
后剪枝比预剪枝保留了更多的分支,欠拟合的风险很小,泛化性能也往往优于预剪枝。但后剪枝的训练时间开销要比预剪枝大得多。

连续值的处理

以上讨论的都是针对离散特征进行处理的,如果遇到了属性为连续值的特征,往往采用二分法进行处理。
给定样本集DDD和连续特征colcolcol,假定在colcolcol上出现了mmm个不同的取值,将这些值从小到大进行排序,即为{a1,a2,...,am}\{a^1,a^2,...,a^m\}{a1,a2,...,am}。基于划分点ttt可将DDD划分为子集Dt−D_t^-DtDt+D_t^+Dt+,其中Dt−D_t^-Dt中包含了在特征colcolcol上取值小于ttt的样本,而Dt+D_t^+Dt+中包含了在特征colcolcol上取值不小于ttt的样本,ttt的取值属于集合

Ta={ai+ai+12∣1≤i≤m−1}T_a=\{\dfrac{a^i+a^{i+1}}{2}|1\leq i \leq m-1\}Ta={2ai+ai+11im1}

之后可以基于不同的ttt值进行数据集划分,选择使得信息增益准则或者增益率准则最大,或者基尼指数最小的ttt作为划分点。

缺失值的处理

现实数据中往往会遇到不完成的样本,即样本的某些值有缺失,这时候如果放弃该样本不用则太过浪费,所以一般做如下处理。
给定训练集DDD和特征colcolcol,令D^\hat{D}D^表示在特征colcolcol上没有缺失值的样本子集。我们给每个样本xxx赋予一个权重wxw_xwx,并定义

ρ=∑x∈D^wx∑x∈Dwx\rho=\dfrac{\sum_{x \in \hat{D}}w_x}{\sum_{x \in D}w_x}ρ=xDwxxD^wx

不难看出,对于特征col,ρ\rhoρ表示无缺失值样本所占的比例。这样一来,比如信息增益就可以推广为

Gain(D,col)=ρ⋅Gain(D^,col)Gain(D,col)=\rho \cdot Gain(\hat{D},col) Gain(D,col)=ρGain(D^,col)

其它的准则也可以用类似的方法进行转换。

结束语

以上是对决策树部分知识的小结。如有不足,还请指正~

参考文献

[1] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.
[2] Peter Harrington. 机器学习实战[M]. 人民邮电出版社, 2013.

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

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

相关文章

Android 中如何计算 App 的启动时间?

(转载) 已知的两种方法貌似可以获取,但是感觉结果不准确:一种是,adb shell am start -w packagename/activity,这个可以得到两个值,ThisTime和TotalTime,不知道两个有什么区别,而且与…

项目实战:Express实现学生管理系统(CRUD)

一、起步 初始化 npm init -y 生成package.json文件 模板处理 cnpm install express --save cnpm install bootstrap --savenpm install --save art-template npm install --save express-art-template//两个一起安装 npm i --save art-template express-art-template文件目录…

2016年度 JavaScript 展望(下)

【编者按】本文作者为资深 Web 开发者 TJ VanToll, TJ 专注于移动端 Web 应用及其性能,是《jQuery UI 实践》 一书的作者。 本文系 OneAPM 工程师编译呈现,以下为正文的第二部分。点此阅读第一部分。 本地移动 apps 在2015年,出现了一种新的基…

LeetCode547. Friends Circles 利用union find | bfs | dfs三种方法解决

问题来源 此题来源于LeetCode547. Friend Circles,主要运用了并查集(union find)、广度优先遍历(bfs)和深度优先遍历(bfs)三种方法解决。 问题简述 给定一个NN的矩阵M表示了N个人之见的朋友关…

Python模块之MyQR——制作个性化动态二维码(超详细)

一、首先安装MyQR 第一种方式:cmd 命令行输入 pip install MyQR 第二种方式:pyCharm中手动选择进行安装 二、 myqr.run() 函数里面的参数 三、编写代码 # encodingutf-8 from MyQR import myqrmyqr.run(words"https://blog.csdn.net/weixin_448…

地址选择控件开发-

先睹为快 闲话少说&#xff0c;我们先来看看今天我们研究的控件的最终效果图(参照天猫的送货地址设置的效果)&#xff1a; “地址选择Web控件”的基本组成&#xff1a; 使用控件举例&#xff1a; <!--需要加载和引用的文件--> <link rel"stylesheet" href&q…

逻辑回归(logistic regression)的本质——极大似然估计

文章目录1 前言2 什么是逻辑回归3 逻辑回归的代价函数4 利用梯度下降法求参数5 结束语6 参考文献1 前言 逻辑回归是分类当中极为常用的手段&#xff0c;因此&#xff0c;掌握其内在原理是非常必要的。我会争取在本文中尽可能简明地展现逻辑回归(logistic regression)的整个推导…

使用mongoose 在 Node中操作MongoDB数据库

MongoDB 关系型和非关系型数据库 关系型数据库&#xff08;表就是关系&#xff0c;或者说表与表之间存在关系&#xff09;。 所有的关系型数据库都需要通过sql语言来操作所有的关系型数据库在操作之前都需要设计表结构而且数据表还支持约束 唯一的主键默认值非空 非关系型…

回调和异步

// 回调函数&#xff1a;一个函数中调用传入的另一个函数 // 这里的callback就是个回调函数 function we(callback,something){something" is cool";callback(something); }function learn(something){console.log(something); }we(learn,"node.js"); //第…

pip install时发生raise ReadTimeoutError(self._pool, None, 'Read timed out.')的解决方案

问题描述 在windows下&#xff0c;python在安装一些包的时候&#xff0c;常常会碰到time out的情况&#xff0c;如下图所示。不管再重试几次都是如此&#xff0c;这时候该怎么办呢&#xff1f; 解决方案 方案一&#xff1a;更换安装源&#xff08;推荐使用豆瓣源&#xff09…

使用Node 操作MySQL数据库

1. 安装 官方文档&#xff1a;https://www.npmjs.com/package/mysql npm install --save mysql2.代码演示 var mysql require(mysql);// 1.创建连接 var connection mysql.createConnection({host : localhost,user : root,password : root,database : my_db …

利用随机森林对特征重要性进行评估

文章目录1 前言2 随机森林&#xff08;RF&#xff09;简介3 特征重要性评估4 举个例子5 参考文献1 前言 随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单&#xff0c;易于实现&#xff0c;计算开销也很小&#xff0c;更令人惊奇的是它在分类和回归上表现出了十…

个人博客总结3

一&#xff0e;昨天做了什么&#xff1f; 昨天利用安卓连接数据库完成一个图片的保存的程序例子&#xff0c;为我们的团队作业刷脸将人脸图片保存到数据中打下基础。 创建了一个相片和数据库保存和查询的工程创建了一个数据库然后将图片保存到数据库中&#xff0c;先将图片转化…

Promise学习——解决回调地狱问题

Promise promise 容器概念&#xff1a; callback hell&#xff08;回调地狱&#xff09;: 文件的读取无法判断执行顺序&#xff08;文件的执行顺序是依据文件的大小来决定的&#xff09;(异步api无法保证文件的执行顺序) var fs require(fs);fs.readFile(./data/a.text,ut…

基于哈希表的索引堆变形(Hackerrank: QHEAP1)

问题来源 此题来自于Hackerrank中的QHEAP1问题&#xff0c;考查了对堆结构的充分理解。成功完成此题&#xff0c;对最大堆或者最小堆的基本操作实现就没什么太大问题了。 问题简述 实现一个最小堆&#xff0c;对3种类型的输入能给出正确的操作&#xff1a; “1 v” - 表示往…

Node 中的path模块

参考文档&#xff1a;https://nodejs.org/docs/latest-v13.x/api/path.html path模块中的常用API&#xff1a; path.basename&#xff1a;获取路径的文件名&#xff0c;默认包含扩展名path.dirname&#xff1a;获取路径中的目录部分path.extname&#xff1a;获取一个路径中的扩…

利用回溯法解决1-9之间添加+或-或使得运算结果为100的问题

问题描述 编写一个在1&#xff0c;2&#xff0c;…&#xff0c;9&#xff08;顺序不能变&#xff09;数字之间插入或-或什么都不插入&#xff0c;使得计算结果总是100的程序&#xff0c;并输出所有的可能性。例如&#xff1a;1 2 34 – 5 67 – 8 9 100。 问题分析 这时…

Atitit。数据库 安全性 重要敏感数据加密存储解决方案

Atitit。数据库 安全性 重要敏感数据加密存储解决方案 1.1. 加密存储的重要性1 1.2. 使用的加密算法aes1 1.3. 数据加密以后会有一些问题。1 1.3.1. 一个是统计&#xff0c;比如统计资金总额。。就无法直接使用sql的sum等数据库内部聚合函数来处理了。。1 1.3.2. 还有一个就是按…

Node中的fs模块

1.fs.stat检测是文件还是目录 2.fs.mkdir创建目录 3.fs.writeFile创建写入文件 4.fs.appendFile追加文件 5.fs.readFile 读取文件 6.fs.readdir读取目录 7.fs.rename重命名 8.fs.rmdir删除目录 9.fs.unlink 删除文件 fs.stat 检测是文件还是目录 const fs require(fs)fs.stat…

主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门

文章目录1 前言2 PCA的原理2.1 什么是投影2.2 投影后的方差2.3 转化为求特征值的问题2.4 符号的表示3 KPCA的原理4 PCA和KPCA在Python中的使用4.1 PCA的使用4.2 KPCA的使用5 参考文献1 前言 主成分分析是在做特征筛选时的重要手段&#xff0c;这个方法在大部分的书中都只是介绍…