数据挖掘算法之决策树算法总结
机器学习中,决策树是一个预测模型;它代表的是对象属性值与对象值之间的一种映射关系。树中每个节点表示某个对象,每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应具有上述属性值的子对象。决策树仅有单一输出;若需要多个输出,可以建立独立的决策树以处理不同输出。
每个决策树都表述了一种树型结构,它由它的分支来对该类型的对象依靠属性进行分类。每个决策树可以依靠对源数据库的分割进行数据测试。这个过程可以递归式的对树进行修剪。当不能再进行分割或一个单独的类可以被应用于某一分支时,递归过程就完成了。另外,随机森林分类器将许多决策树结合起来以提升分类的正确率。
决策树同时也可以依靠计算条件概率来构造。决策树如果依靠数学的计算方法可以取得更加理想的效果。1986年Quinlan提出了著名的ID3算法。在ID3算法的基础上,1993年Quinlan又提出了C4.5算法。为了适应处理大规模数据集的需要,后来又提出了若干改进的算法,其中SLIQ (super-vised learning in quest)和SPRINT (scalable parallelizableinduction of decision trees)是比较有代表性的两个算法。
决策树的工作原理
决策树一般都是自上而下的来生成的。 选择分割的方法有多种,但是目的都是一致的,即对目标类尝试进行最佳的分割。
从根节点到叶子节点都有一条路径,这条路径就是一条“规则”。决策树可以是二叉的,也可以是多叉的。对每个节点的衡量:
- 通过该节点的记录数;
- 如果是叶子节点的话,分类的路径;
- 对叶子节点正确分类的比例。
ID3算法的核心是:在决策树各级结点上选择属性时,用信息增益(information gain)作为属性的选择标准,以使得在每一个非叶结点进行测试时,能获得关于被测试记录最大的类别信息。其具体方法是:检测所有的属性,选择信息增益最大的属性产生决策树结点,由该属性的不同取值建立分支,再对各分支的子集递归调用该方法建立决策树结点的分支,直到所有子集仅包含同一类别的数据为止。最后得到一棵决策树,它可以用来对新的样本进行分类。
ID3算法的优点是:算法的理论清晰,方法简单,学习能力较强。其缺点是:只对比较小的数据集有效,且对噪声比较敏感,当训练数据集加大时,决策树可能会随之改变。
(2) C4.5算法
C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:
- 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;
- 在树构造过程中进行剪枝;
- 能够完成对连续属性的离散化处理;
- 能够对不完整数据进行处理。
C4.5算法与其它分类算法如统计方法、神经网络等比较起来有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。此外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。
(3) SLIQ算法
SLIQ算法对C4.5决策树分类算法的实现方法进行了改进,在决策树的构造过程中采用了“预排序”和“广度优先策略”两种技术。
- 预排序。对于连续属性在每个内部结点寻找其最优分裂标准时,都需要对训练集按照该属性的取值进行排序,而排序是很浪费时间的操作。为此,SLIQ算法采用了预排序技术。所谓预排序,就是针对每个属性的取值,把所有的记录按照从小到大的顺序进行排序,以消除在决策树的每个结点对数据集进行的排序。具体实现时,需要为训练数据集的每个属性创建一个属性列表,为类别属性创建一个类别列表。
- 广度优先策略。在C4.5算法中,树的构造是按照深度优先策略完成的,需要对每个属性列表在每个结点处都进行一遍扫描,费时很多,为此,SLIQ采用广度优先策略构造决策树,即在决策树的每一层只需对每个属性列表扫描一次,就可以为当前决策树中每个叶子结点找到最优分裂标准。
SLIQ算法由于采用了上述两种技术,使得该算法能够处理比C4.5大得多的训练集,在一定范围内具有良好的随记录个数和属性个数增长的可伸缩性。然而它仍然存在如下缺点:
- 由于需要将类别列表存放于内存,而类别列表的元组数与训练集的元组数是相同的,这就一定程度上限制了可以处理的数据集的大小。
- 由于采用了预排序技术,而排序算法的复杂度本身并不是与记录个数成线性关系,因此,使得SLIQ算法不可能达到随记录数目增长的线性可伸缩性。
(4) SPRINT算法
为了减少驻留于内存的数据量,SPRINT算法进一步改进了决策树算法的数据结构,去掉了在SLIQ中需要驻留于内存的类别列表,将它的类别列合并到每个属性列表中。这样,在遍历每个属性列表寻找当前结点的最优分裂标准时,不必参照其他信息,将对结点的分裂表现在对属性列表的分裂,即将每个属性列表分成两个,分别存放属于各个结点的记录。
SPRINT算法的优点是在寻找每个结点的最优分裂标准时变得更简单。其缺点是对非分裂属性的属性列表进行分裂变得很困难。解决的办法是对分裂属性进行分裂时用哈希表记录下每个记录属于哪个孩子结点,若内存能够容纳下整个哈希表,其他属性列表的分裂只需参照该哈希表即可。由于哈希表的大小与训练集的大小成正比,当训练集很大时,哈希表可能无法在内存容纳,此时分裂只能分批执行,这使得SPRINT算法的可伸缩性仍然不是很好。
ID3算法
D3算法构造决策树。为了简单起见,我们假设训练集合包含
10个元素:
期望信息的点称为这个属性的最佳分裂点,其信息期望作为此属性的信息期望。
3.3.2、C4.5算法
参考来源:
http://www.cnblogs.com/kidoln/archive/2012/01/05/2312679.html
http://www.cnblogs.com/leoo2sk/archive/2010/09/19/1831151.html
数据挖掘算法之决策树算法总结相关推荐
- 二叉树剪枝_数据挖掘算法:决策树算法如何学习及分裂剪枝
1.决策树模型与学习 决策树(decision tree)算法基于特征属性进行分类,其主要的优点:模型具有可读性,计算量小,分类速度快.决策树算法包括了由Quinlan提出的ID3与C4.5,Brei ...
- 机器学习算法之决策树算法
决策树 综述 决策树(Decision Tree)算法是一种基本的分类与回归方法,根据数据的属性采用树状结构建立决策模型.决策树模型常常用来解决分类和回归问题.常见的算法包括CART(Classifi ...
- ML之监督学习算法之分类算法一 ——— 决策树算法
一.概述 决策树(decision tree)的一个重要任务是为了数据中所蕴含的知识信息,因此决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,在这些机器根据数据创建规则时,就是机器学习的过程. ...
- bootstrap算法_决策树算法之随机森林
在 CART 分类回归树的基础之上,我们可以很容易的掌握随机森林算法,它们之间的区别在于,CART 决策树较容易过拟合,而随机森林可以在一定程度上解决该问题. 随机森林的主要思想是:使用随机性产生出一 ...
- 机器学习-有监督学习-分类算法:决策树算法【CART树:分类树(基于信息熵;分类依据:信息增益、信息增益率、基尼系数)、回归树(基于均方误差)】【损失函数:叶节点信息熵和】【对特征具有很好的分析能力】
一.决策树概述 注:生产实践中,不使用决策树,太简单,而是使用决策树的升级版:集成学习算法. 集成学习算法有: Random Forest(随机森林) Extremely Randomized For ...
- r语言 C4.5 剪枝是用什么算法_决策树算法
决策树算法,从名字中也可以理解到该算法是以树形结构建立模型的,该算法主要根据分层和分割的方式将预测变量空间划分为一系列简单区域.对某个给定的待预测的观测值,用它所属区域中训练的平均值或众数进行预测.决 ...
- 【机器学习常见算法】决策树算法(含示例代码)
决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规 则,并用树状图的结构来呈现这些规则,以解决分类和回归问题.决策树算法容易理解,适用各种 ...
- gis 路径拟合算法_决策树算法十问及经典面试问题
简介和 算法 决策树是机器学习最常用的算法之一,它将算法组织成一颗树的形式.其实这就是将平时所说的if-then语句构建成了树的形式.这个决策树主要包括三个部分:内部节点.叶节点和边.内部节点是划分的 ...
- 毕设系列之 --- 算法教学 : 决策树算法
决策树理解案例 我们在买苹果的时候可以通过苹果的颜色.硬度来判断它的好坏,再决定是否买这个苹果.那么我们也许可以基于之前买苹果的经验做出这样一个分析: 某人不太会挑苹果,所以纯粹是随机写的几条数据,假 ...
最新文章
- Redis 那些故障转移、高可用方案
- 集合框架—HashMap
- linux命令:ftp
- ffmpeg利用libav库把yuv视频流转换为TS串流
- dataset存入mysql_将dataset写入数据库
- ZK Web框架思想
- c++类对象的创建方式
- 前端学习(3278):循环 遍历
- python---基础知识
- mysql 5.5.50_mysql 5.5.50 乱码解决
- POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)
- 被程序员怼完被自己人怼,产品经理就这样被逼哭了!
- 【廖雪峰官方网站/Java教程】设计模式(一)
- PHP文件操作 读取与写入
- Python re库match(),serach(),findall()和finditer()方法使用
- java guardedby_Oracle官方并发教程之Guarded Blocks
- 微信小程序:上传的图片显示旋转问题
- 【Linux】RHCE -- RHCSA 认证考试 模拟练习题解析
- STM32F411核心板固件库开发(一) GPIO基本配置
- 影响未来十年的2020十大科技趋势,除了AI与区块链,还有哪些?
热门文章
- C#刷遍Leetcode面试题系列连载(2): No.38 - 报数
- 简化 Pod 故障诊断:kubectl-debug 介绍
- 短信验证码“最佳实践”
- ASP.NET Core appsettings.json文件(9)《从零开始学ASP.NET CORE MVC》:
- 仅此一文让你明白事务隔离级别、脏读、不可重复读、幻读
- 微软内部全面拥抱开源流程Inner Source
- Docker最全教程——从理论到实战(二)
- 微软把UWP定位成业务线应用程序开发平台
- 探讨.NET Core的未来
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)