决策树随笔-深度AI科普团队
决策树原理
决策树是一种多功能的机器学习算法,它可以实现分类和回归任务,甚至是多输出任务。它们功能强大,能够拟合 复杂的数据集。
- -优点:简单直观,基本不需要预处理,不用会议华,处理缺失值,精度高、对异常值不敏感、无数据输入假定。可以处理离散或连续值,可以处理多维度输出的分类问题
- 缺点:计算复杂度高、容易过拟合,泛化能力不好,可能因为样本的一点点改动导致树的结构剧烈改变,空间复杂度高。
- 适用数据范围:数值型和标称型。
创建分支的伪代码函数createBranch()如下所示:
检测数据集中的每个子项是否属于同一分类:
If so return 类标签;
Else 寻找划分数据集的最好特征划分数据集创建分支节点for 每个划分的子集调用函数createBranch并增加返回结果到分支节点中return 分支节点
上面的伪代码createBranch是一个递归函数,在倒数第二行直接调用了它自己。
其工作原理很简单如图所示的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形代表终止模块(terminating block),表示已经得出结论,可以终止运行。从判断模块引出的左右箭头称作分支(branch),它可以到达另一个判断模块或者终止模块。
k-近邻算法可以完成很多分类任务,但是它最大的缺点就是无法给出数据的内在含义,决策树的主要优势就在于数据形式非常容易理解。决策树需要的数据准备工作非常少,特别是,完全不需要进行特征缩放或集中。
(1) 收集数据:可以使用任何方法。
(2) 准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化。
(3) 分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
(4) 训练算法:构造树的数据结构。
(5) 测试算法:使用经验树计算错误率。
(6) 使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据
的内在含义。
做出预测
以鸢尾花分类为例(有四个特征,三种类别),如图显示了决策树的决策边界。加粗直线表示根节点(深度0) 的决策边界:花瓣长度=2.45厘米。因为左侧区域是纯的(只有Setosa 鸢尾花),所以它不可再分。但是右侧区域是不纯的,所以深度1右 侧的节点在花瓣宽度=1.75厘米处(虚线所示)再次分裂。因为这里 最大深度max_depth设置为2,所以决策树在此停止。但是如果你将 max_depth设置为3,那么两个深度为2的节点将各自再产生一条决策 边界(点线所示)。
决策树的分类
1.CLS算法
CLS (Concept Learning System)学习算法是Hunt.E.B等人在1966年提出的。它第一次提出了用决策树进行概念学习,后来的许多决策树学习算法都可以看作是CLS算法的改进与更新。CLS的主要思想是从一个空的决策树出发,通过添加新的判定节点来改善原来的决策树,直到树能够正确地将训练实例分类为止。它对决策树的构造过程也就是假设特化的过程,所以CLS可以看作是只带一个操作符的学习算法。此操作可以表示为: 通过添加一个新的判定条件(新的判定节点),特化当前假设。CLS算法递归调用这个操作符,作用在每个叶节点_上来构造决策树。
2.ID3算法
ID3 (Iterative Dichotomizer3)算法是Quinlan在1986年提出的。它是决策树算法的代表,绝大多数决策树算法都是在它的基础.上加以改进而实现的。它采用分治策略,在决策树各级节点上选择属性时,用信息增益作为属性的选择标准,以便在每一个非叶节点上进行测试时,能获得关于被测试记录最大的类别信息具体方法是:检测所有的属性,选择信息增益最大的属性产生决策树节点,由该属性的不同取值建立分支,再对各分支的子集递归调用该方法建立决策树节点的分支,直到所有子集仅包含同一类别的数据为止。最后得到一棵决策树,它可以对新的样本进行分类。
3.C4.5算法
C4.5算法是Quinlan.J.R在1993年提出的,它是从ID3算法演变而来,继承了ID3 算法的优点,C4.5算法引入了新的方法和功能:.
- 用信息增益的概念,克服了用信息增益选择属性时偏向多值属性的不足;
- 在树构造程中进行剪枝,以避免树的过度拟合;
- 能够对连续属性的离散化处理;
- 可以处理具有缺少属性值的训练样本集;
- 能够对不完整数据进行处理;
- K折交叉验证;
C4.5算法降低了计算复杂度,增强了计算的效率。它对于ID3算法的重要改进是使用信息增益率来选择属性。理论和实验表明,采用信息增益率比采用信息增益效果更好,主要是克服了ID3方法选择偏向取值多的属性。C4. 5算法还针对连续值属性的数据进行了处理,弥补了ID3算法只能处理离散值属性数据的缺陷。
然而C4.5算法在处理连续型测试属性中线性搜索阈值付出了很大代价。在2002 年,Salvatore Ruggieri提出了C4.5的改进算法: EC4. 5算法。EC4. 5算法采用二分搜索取代线性搜索,从而克服了这个缺点。实验明,在生成同样一-棵决策树时, 与C4.5算法相比,EC4. 5算法可将效率提高5倍,但缺点EC4. 5算法占用内存多。5.SLIQ算法上述算法由于要求训练样本集驻留内存,因此不适合处理大规模数据。为此,IBM研究人员在1996年提出了一-种更快速的、可伸缩的、适合处理较大规模数据的决策树分类算法SLIQ (SupervisedLearning In Quest)算法。它综合利用属性表、类表和类直方图来建树。属性表含有两个字段:属性值和样本号。类表也含有
4.CART训练算法
Scikit-Learn使用的是分类与回归树(Classification And Regression Tree,简称CART)算法来训练决策树(也叫作“生 长”树)。想法非常简单:首先,使用单个特征k和阈值tk(例如,花瓣长度≤2.45厘米)将训练集分成两个子集。k和阈值tk怎么选择?答案是产生出最纯子集(受其大小加权)的k和tk就是经算法搜索确定的(t,tk)。
一旦成功将训练集一分为二,它将使用相同的逻辑,继续分裂子集,然后是子集的子集,依次循环递进。直到抵达最大深度(由超参数max_depth控制下文有说明)。减小max_depth可使模型正则化,从而降低过度拟合的风险。),或是再也找不到能够降低不纯度的分裂,它才会停止。
计算复杂度
进行预测需要从根到叶遍历决策树。通常来说,决策树大致平衡,因此遍历决策树需要经历大约O(log2(m))个节点。(注:log2是以2为底的对数。等于log2(m)=log(m)/log(2)。)而每个节点只需要检查一个特征值,所以总体预测复杂度也只是O(log2(m)),与特征数量无关。如此,即便是处理大型数据集,预测也很快。但是,训练时在每一个节点,算法都需要在所有样本上比较所有特征(如果设置了max_features会少一些)。这导致训练的复杂度为O(n×m log(m))。对于小型训练集(几千个实例以内),Scikit_learn可以通过对数据预处理(设置presort=True)来加快训练,但是对于较大训练集而言,可能会减慢训练的速度。
正则化超参数
决策树极少对训练数据做出假设(比如线性模型就正好相反,它显然假设数据是线性的)。如果不加以限制,树的结构将跟随训练集变化,严密拟合,并且很可能过度拟合。这种模型通常被称为非参数模型,这不是说它不包含任何参数(事实上它通常有很多参数),而是指在训练之前没有确定参数的数量,导致模型结构自由而紧密地贴近数据。相应的参数模型,比如线性模型,则有预先设定好的一部分参数,因此其自由度受限,从而降低了过度拟合的风险(但是增加了拟合不足的风险)。可如下对其优化。
1. 限制枝叶
为避免过度拟合,需要在训练过程中降低决策树的自由度,这个过程被称为正则化。正则化超参数的选择取决于你所使用的模型,但是通常来说,至少可以限制决策树的最大深度。超参数max_depth控制(默认值为None,意味着无限制)。减小max_depth可使模型正则化,从而降低过度拟合的风
险。
参数
- min_samples_split(分裂前节点必须有的最小样本数)
- min_samples_leaf(叶节点必须有的最小样本数量)
- min_weight_fraction_leaf(跟min_samples_leaf一样,但表现为加权实例总数的占比)
- max_leaf_nodes(最大叶节点数量)
- max_features(分裂每个节点评估的最大特征数量)。增大超参数
- min_*或是减小max_*将使模型正则化。
2. 修枝剪叶
还可以先不加约束地训练模型,然后再对不必要的节点进行
剪枝(删除)。如果一个节点的子节点全部为叶节点,则该节点可被认为不必要,除非它所表示的纯度提升有重要的统计意义。标准统计测试,比如χ2测试,是用来估算“提升纯粹是出于偶然”(被称为虚假设)的概率。如果这个概率(称之为p值)高于一个给定阈值(通常是5%,由超参数控制),那么这个节点可被认为不必要,其子节点可被删除。直到所有不必要的节点都被删除,剪枝过程结束。
很明显左图无限制,而过度拟合;右图用min_samples_leaf进行限制,其泛化效果更佳。
回归
决策树也可以做回归分析, 与分类不同的是,回归预测的是一个值而不是一个类别。
例如,如果你想要对一个x1=0.6x_1=0.6x1=0.6的新实例进行预测,那么从根节点开始遍历,最后到达预测value=0.1106的叶节点。这个预测结果其实就是与这个叶节点关联的110个实例的平均目标值。在这110个实例上,预测产生的均方误差(MSE)等于0.0151。
与分类任务一样,决策树在处理回归任务时也很容易过度拟合。
问题
1.如果训练集有100万个实例,训练决策树(无约束)大致的深 度是多少?
答:一个包含m个叶节点的均衡二叉树的深度等于log2(m)(注:log2表示以2为底的log函数,log2(m)=log(m)/log(2)。)的四舍五入。通常来说,二元决策树训练到最后大体都是平衡的,如果不加以限制,最后平均每个叶节点一个实例。因此,如果训练集包含一百万个实例,那么决策树深度约等于log2(106)≈20层(实际上会更多一些因为决策树通常不可能完美平衡)。
2.如果决策树过度拟合训练集,减少max_depth是否为一个好主 意?
答:降低max_depth可能是一个好主意,因为这会限制模型,使其正则化。
3.如果决策树对训练集拟合不足,尝试缩放输入特征是否为一个 好主意?
答:决策树的优点之一就是它们不关心训练数据是否缩放或是集中,所以如果决策树对训练集拟合不足,缩放输入特征不过是浪费时间罢了。
4.如果在包含100万个实例的训练集上训练决策树需要一个小 时,那么在包含1000万个实例的训练集上训练决策树,大概需要多长 时间?
答:决策树的训练复杂度为O(n×mlog(m))。所以,如果将训 练集大小乘以10,训练时间将乘以K=(n×10m×log(10m))/ (n×m×log(m))=10×log(10m)/log(m)。如果m=106,那么 K≈11.7,所以训练1000万个实例大约需要11.7小时。
注
由于本人是初学者,对很多算法参数还不太了解,所以借鉴摘抄的很多,并将其融合,在此就不一一点名出处了,希望理解。我没有写多少代码,主要是感觉写上会使篇幅太大,也没有写多推理在公式,(关键自己才大一,绝大部分都看不懂)就言简意赅写一些基本知识。
另,本文主要参考于《机器学习实战:基于Scikit-Learn和TensorFlow》这本书,如有需求(还有很多关于Python和机器学习资料),可关注并私信我,必一一送达。
毕竟新手,有错误之处还望赐教,还望支持,不喜勿喷,并希望找到写志同道合的朋友一起学习。
决策树随笔-深度AI科普团队相关推荐
- 动手学pytorch之通俗易懂何为卷积-深度AI科普团队
文章目录 简介 为什么要用卷积 卷积神经网络的由来 什么是卷积 定义 解释 卷积运算 信号分析 离散卷积例子:丢骰子 图像处理卷积操作 简介 为什么要用卷积 卷积操作是机器视觉,乃至整个深度学习的核心 ...
- 图像分割总体介绍——深度AI科普团队
概览 初识图像分割 顾名思义,图像分割就是指将图像分割成多个部分.在这个过程中,图像的每个像素点都和目标的种类相关联.图像分割方法主要可分为两种类型:语义分割和实例分割.语义分割会使用相同的类标签标注 ...
- 从V1到V4,让你读懂YOLO原理——深度AI科普团队
文章目录 YOLO概述 模型时间轴 YOLOv1 原理 网络结构 损失函数 激活函数 YOLOv1的缺陷 YOLOv2 Better Batch Normalization(批归一化) High Re ...
- 从数学基础到贝叶斯理论到实践——深度AI科普团队
贝叶斯网络(Bayesian network)又被称为信念网络( Belief network),是一种通过有向无环图( Directed acyclic graph, DAG)表示一组随机变量及其条 ...
- pytorch实战案例-手写数字分类-卷积模型——深度AI科普团队
文章目录 数据准备 导入需要的模块 使用GPU训练 将数据转换为tensor 导入训练集和测试集 数据加载器 数据展示 创建模型 将模型复制到GPU 损失函数 定义训练和测试函数 开始训练 源码已经上 ...
- pytorch实战案例-手写数字分类-全链接模型——深度AI科普团队
文章目录 @[TOC] 数据准备 导入需要的模块 将数据转换为tensor 导入训练集和测试集 数据加载器 数据展示 创建模型 定义损失函数 定义优化函数 定义训练和测试函数 开始训练 源码已经上传: ...
- 呕心沥血干完K-Means聚类——深度AI科普团队
K-Means简介 K-Means 是一种非监督学习. K 代表的是 K 类,Means 代表的是中心,它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好. 主要思想 ...
- 小白学深度之LSTM长短期记忆神经网络——深度AI科普团队
前言 不知道RNN的一定要先看看RNN的原理 在RNN中我们说了RNN的不足,也就是对较长的时间,或者较长的string,很多时候前面的数据对后面的数据影响就很小甚至没影响了,这是我们就要加强前面的数 ...
- 聚类算法详解——深度AI科普团队
聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好. K-均值聚类算法 基本概念: 簇:假定有一些数据,现在将相 ...
最新文章
- http响应Last-Modified和ETag以及Apache和Nginx中的配置
- 【测试】SAP 委外加工收货BAPI Demo
- 全自动采集新闻站源码-单站自动采集新闻源码(seo标题伪原创)
- 记一个 DataBindings遇到的坑,当ComboBox同时绑定DataSource与DataBindings的时候,绑定的元素一定要同名...
- Python functool module
- 静态页面评论处理以及列表处理
- 15.导入网表及status介绍[原创]
- Cisco Packet Tracer Student思科命令
- 从辉煌走向消亡(下)——小型机之王DEC公司
- 均值滤波器类型_[数字图像处理]图像去噪初步(1)--均值滤波器
- 淘宝自动查券找券返利机器人搭建教程
- 淘宝店铺的装修是店铺的门面,如何进行淘宝店铺装修?需要注意的点有哪些?
- 卡刷supersu和magisk实现安卓手机获取root权限
- 关于密码测评,你必须了解的10个基本问题
- 推荐:21个演示展示强大的jQuery特效
- ThinkPHP 多语言模块RCE漏洞复现
- WML语言基础(WAP建站)一
- Markdown入门和解决MD文件上传博客后图片无法显示问题
- 洛谷 P1122 最大子树和 题解
- Java超市收银系统(连接数据库实现具体功能)(源码——即搬可用)
热门文章
- 鸿蒙系统深度解析,深度解析鸿蒙内核最重要的结构体
- 哪些手机支持android q,安卓Q首批升级名单公布,华为终于有一款机型支持原生...
- java list 交集_java两个List的交集,并集
- 存储控制器wwn号_AUTOSAR学习笔记之存储
- linux64bit安装mysql、jdk、nodejs、nginx笔记
- linux 内存查看_Linux终端查看最消耗CPU内存的进程
- 影响线型缩聚物分子量的因素_高分子化学试题
- vue动态生成下拉框_解决vue动态下拉菜单 有数据未反应的问题
- java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用
- 汇编:分段函数的值的计算