决策树原理

决策树是一种多功能的机器学习算法,它可以实现分类和回归任务,甚至是多输出任务。它们功能强大,能够拟合 复杂的数据集。

  • -优点:简单直观,基本不需要预处理,不用会议华,处理缺失值,精度高、对异常值不敏感、无数据输入假定。可以处理离散或连续值,可以处理多维度输出的分类问题
  • 缺点:计算复杂度高、容易过拟合,泛化能力不好,可能因为样本的一点点改动导致树的结构剧烈改变,空间复杂度高。
  • 适用数据范围:数值型和标称型。
    创建分支的伪代码函数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科普团队相关推荐

  1. 动手学pytorch之通俗易懂何为卷积-深度AI科普团队

    文章目录 简介 为什么要用卷积 卷积神经网络的由来 什么是卷积 定义 解释 卷积运算 信号分析 离散卷积例子:丢骰子 图像处理卷积操作 简介 为什么要用卷积 卷积操作是机器视觉,乃至整个深度学习的核心 ...

  2. 图像分割总体介绍——深度AI科普团队

    概览 初识图像分割 顾名思义,图像分割就是指将图像分割成多个部分.在这个过程中,图像的每个像素点都和目标的种类相关联.图像分割方法主要可分为两种类型:语义分割和实例分割.语义分割会使用相同的类标签标注 ...

  3. 从V1到V4,让你读懂YOLO原理——深度AI科普团队

    文章目录 YOLO概述 模型时间轴 YOLOv1 原理 网络结构 损失函数 激活函数 YOLOv1的缺陷 YOLOv2 Better Batch Normalization(批归一化) High Re ...

  4. 从数学基础到贝叶斯理论到实践——深度AI科普团队

    贝叶斯网络(Bayesian network)又被称为信念网络( Belief network),是一种通过有向无环图( Directed acyclic graph, DAG)表示一组随机变量及其条 ...

  5. pytorch实战案例-手写数字分类-卷积模型——深度AI科普团队

    文章目录 数据准备 导入需要的模块 使用GPU训练 将数据转换为tensor 导入训练集和测试集 数据加载器 数据展示 创建模型 将模型复制到GPU 损失函数 定义训练和测试函数 开始训练 源码已经上 ...

  6. pytorch实战案例-手写数字分类-全链接模型——深度AI科普团队

    文章目录 @[TOC] 数据准备 导入需要的模块 将数据转换为tensor 导入训练集和测试集 数据加载器 数据展示 创建模型 定义损失函数 定义优化函数 定义训练和测试函数 开始训练 源码已经上传: ...

  7. 呕心沥血干完K-Means聚类——深度AI科普团队

    K-Means简介 K-Means 是一种非监督学习. K 代表的是 K 类,Means 代表的是中心,它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好. 主要思想 ...

  8. 小白学深度之LSTM长短期记忆神经网络——深度AI科普团队

    前言 不知道RNN的一定要先看看RNN的原理 在RNN中我们说了RNN的不足,也就是对较长的时间,或者较长的string,很多时候前面的数据对后面的数据影响就很小甚至没影响了,这是我们就要加强前面的数 ...

  9. 聚类算法详解——深度AI科普团队

    聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好. K-均值聚类算法 基本概念: 簇:假定有一些数据,现在将相 ...

最新文章

  1. http响应Last-Modified和ETag以及Apache和Nginx中的配置
  2. 【测试】SAP 委外加工收货BAPI Demo
  3. 全自动采集新闻站源码-单站自动采集新闻源码(seo标题伪原创)
  4. 记一个 DataBindings遇到的坑,当ComboBox同时绑定DataSource与DataBindings的时候,绑定的元素一定要同名...
  5. Python functool module
  6. 静态页面评论处理以及列表处理
  7. 15.导入网表及status介绍[原创]
  8. Cisco Packet Tracer Student思科命令
  9. 从辉煌走向消亡(下)——小型机之王DEC公司
  10. 均值滤波器类型_[数字图像处理]图像去噪初步(1)--均值滤波器
  11. 淘宝自动查券找券返利机器人搭建教程
  12. 淘宝店铺的装修是店铺的门面,如何进行淘宝店铺装修?需要注意的点有哪些?
  13. 卡刷supersu和magisk实现安卓手机获取root权限
  14. 关于密码测评,你必须了解的10个基本问题
  15. 推荐:21个演示展示强大的jQuery特效
  16. ThinkPHP 多语言模块RCE漏洞复现
  17. WML语言基础(WAP建站)一
  18. Markdown入门和解决MD文件上传博客后图片无法显示问题
  19. 洛谷 P1122 最大子树和 题解
  20. Java超市收银系统(连接数据库实现具体功能)(源码——即搬可用)

热门文章

  1. 鸿蒙系统深度解析,深度解析鸿蒙内核最重要的结构体
  2. 哪些手机支持android q,安卓Q首批升级名单公布,华为终于有一款机型支持原生...
  3. java list 交集_java两个List的交集,并集
  4. 存储控制器wwn号_AUTOSAR学习笔记之存储
  5. linux64bit安装mysql、jdk、nodejs、nginx笔记
  6. linux 内存查看_Linux终端查看最消耗CPU内存的进程
  7. 影响线型缩聚物分子量的因素_高分子化学试题
  8. vue动态生成下拉框_解决vue动态下拉菜单 有数据未反应的问题
  9. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用
  10. 汇编:分段函数的值的计算