定义
决策树是一种常见的机器学习算法,它的思想十分朴素,类似于我们平时利用选择做决策的过程。

上,决策的形式以树的形式进行示意和编码,就形成了决策树。

结构
显然,决策树在逻辑上以树的形式存在,包含根节点、内部结点和叶节点。

  • 根节点:包含数据集中的所有数据的集合
  • 内部节点:每个内部节点为一个判断条件,并且包含数据集中满足从根节点到该节点所有条件的数据的集合。根据内部结点的判断条件测试结果,内部节点对应的数据的集合别分到两个或多个子节点中。
  • 叶节点:叶节点为最终的类别,被包含在该叶节点的数据属于该类别。

简而言之,决策树是一个利用树的模型进行决策的多分类模型,简单有效,易于理解。

伪代码
决策树算法的伪代码(参照了python语法)如下图所示:

# D = {(x1,y1)、(x2,y2)......(xm,yn)} 是数据集
# A = {a1、a2、a3.} 是划分节点的属性集
# 节点node有两个主要属性:content代表该节点需要分类的训练集,type代表叶节点的决策类型
def generateTree(D,A):newNode = 空 #生成新的节点# 如果当前数据集都为一个种类,则设为一个叶节点并返回if D 中数据皆属于类别 C:newNode.content = DnewNode.type = Creturn  # 如果已经没有属性了或者数据集在剩余属性中表现相同(属性无法区分)if A = 空集 or D中数据在A中取值相同:newNode.content = DnewNode.type = D中最多的类return#从A中选取最优的属性aa=selectBestPorperty(A)#为a的每一个取值生成一个节点,递归进行处理for a的每一个取值 res[i]:生成新的分支节点 node[i]D[i] = D中取值为res[i]的数据node[i].content = D[i]if node[i].content == null:node[i].type = D中最多的类else:generateTree(D[i],A - {a})return

划分选择
可以看到,在伪代码中,大部分步骤都是简单而明确的,而最重要的步骤在于从A中选取最优的属性a,可以说,属性选择的质量,决定了决策树的预测准确度。这很容易理解,例如我们看一个学生聪明与否可以看他的成绩,但是如果依靠他的身高预测他是否聪明,显然得不到好的结果。

一般的原则是,希望通过不断划分节点,使得一个分支节点包含的数据尽可能的属于同一个类别,即“纯度“越来越高。

这里列出三种常用的准则。

信息增益准则
我们先对一个节点的纯度进行定义,我们将其称之为信息熵:


Ent(D)=−∑k=1|γ|pklog(pk)
Ent(D)=−∑k=1|γ|pklog(pk)
其中pkpk代表当前节点D的数据中第k类样本所占的比例。

观察该信息熵的定义,有以下几个特点:

由于pkpk都属于[0,1],Ent(D)必定为正值,值越大说明纯度越低
Ent(D)在k=1,p1p1=1时取值最小值0,在k=|γ|k=|γ| pk=1|γ|pk=1|γ|时取值最大值log|γ|2log2|γ|
信息熵是一个节点的固有性质,和该节点选取什么属性进行下一步的划分无关
在定义了信息熵之后,对信息增益进行定义,假设选取属性a有V个取值,{a1a2…aV}{a1a2…aV},按照决策树的规则,D将被划分为V个不同的节点数据集,DvDv代表其中第v个节点:


Gain(D,a)=Ent(D)−∑v=1V|Dv||D|Ent(Dv)
Gain(D,a)=Ent(D)−∑v=1V|Dv||D|Ent(Dv)
观察该式,有以下几点说明:

第一线Ent(D)是确定的,和选取的属性a无关,我们可以将之看为定值
|Dv||D||Dv||D|表示分支节点所占的比例大小,显然数据集越大的分支节点权重越高
分支节点整体纯度越大,则后一项越小,信息增益Gain变得越大,所以我们的目标是如何最大化信息增益
由此,我们得到了一种选择划分属性的方法,计算以每个属性进行划分子节点得到的信息增益,选择其中最大的作为选择的属性。

信息增益率准则
信息增益原则对于每个分支节点,都会乘以其权重,也就是说,由于权重之和为1,所以分支节点分的越多,即每个节点数据越小,纯度可能越高。这样会导致信息熵准则偏爱那些取值数目较多的属性。

为了解决该问题,这里引入了信息增益率,定义如下:


Gainratio(D,a)=Gain(D,a)IV(a)
Gainratio(D,a)=Gain(D,a)IV(a)

IV(a)=∑v=1V|Dv||D|log|Dv||D|2
IV(a)=∑v=1V|Dv||D|log2|Dv||D|
相当于引入了修正项IV(a),它是对于属性a的固有值。

需要注意的是,信息增益率原则可能对取值数目较少的属性更加偏爱,为了解决这个问题,可以先找出信息增益在平均值以上的属性,在从中选择信息增益率最高的。

基尼指数准则
在CART决策树中,使用基尼指数来选择属性,首先定义数据集D的基尼值:


Gini(D)=∑k=1|γ|∑k1!=kpkpk1=1−∑k=1|γ|p2k
Gini(D)=∑k=1|γ|∑k1!=kpkpk1=1−∑k=1|γ|pk2
形象的说,基尼值代表了从D中随机选择两个样本,其类别不一致的概率。

有了基尼值后,可以在此基础上定义基尼指数:


Giniindex(D,a)=∑v=1V|Dv||D|Gini(Dv)
Giniindex(D,a)=∑v=1V|Dv||D|Gini(Dv)
其中DvDv的含义和之前相同,可以看出基尼指数越小,说明纯度越高,我们可以通过选择基尼指数小的属性来划分子节点。

剪枝
剪枝是应该决策树过拟合的一种重要方法,主要分为以下两种:

预剪枝:该策略就是在对一个节点进行划分前进行估计,如果不能提升决策树泛化精度,就停止划分,将当前节点设置为叶节点。那么怎么测量泛化精度,就是留出一部分训练数据当做测试集,每次划分前比较划分前后的测试集预测精度。
优点:降低了过拟合风险,降低了训练所需的时间。
缺点:预剪枝是一种贪心操作,可能有些划分暂时无法提升精度,但是后续划分可以提升精度。故产生了欠拟合的风险。
后剪枝:该策略是首先正常建立一个决策树,然后对整个决策树进行剪枝。按照决策树的广度优先搜索的反序,依次对内部节点进行剪枝,如果将某以内部节点为根的子树换成一个叶节点,可以提高泛化性能,就进行剪枝。
优先:降低过拟合风险,降低欠拟合风险,决策树效果提升比预剪枝强
缺点:时间开销大得多
特殊值处理
连续值处理
在之前进行选择属性的时候,我们仅仅讨论了属性值为离散值的情况,例如身高分为“极高、高、较高、中等、较矮”五个选项,但是如果数据集中身高为连续值,例如140-210cm,我们该如何处理呢?

这里可以采用二分的思想,将连续值化为离散值。由于我们的数据集是有限的,即使是连续值,属性a在数据集中也只出现了有限个确定的值,记为(a1,a2,a3…an)(a1,a2,a3…an),且a1<a2<a3…<ana1<a2<a3…<an。

取n个值的中点,令


t1=a1+a22,t2=a2+a32…tn−1=an−1+an2
t1=a1+a22,t2=a2+a32…tn−1=an−1+an2
我们得到了n-1个中点,(t1,t2…tn−1)(t1,t2…tn−1),任取一个值titi可以将数据集D分为两个,D+D+表示D中大于titi的数据,D−D−表示D中小于titi的数据集合,这样,我们便可以同离散值一样进行处理了。

接下来的问题是,选取哪一个t呢?显然在信息增益准则下,应该选择使得信息增益最大的t:


Gain(D,a)=maxtGain(D,a,t)=maxtEnt(D)−∑λ∈{+,−}|Dλ||D|Ent(Dλt)
Gain(D,a)=maxtGain(D,a,t)=maxtEnt(D)−∑λ∈{+,−}|Dλ||D|Ent(Dtλ)
经过稍加改造的信息增益公式就可以选择最好的t来进行划分。

缺失值处理
缺失值处理较为复杂,设计到较多的公式,在这里给出链接,读者可以参考阅读

缺失值处理详解

其主要思想是

在选择属性时,仅使用不缺失该属性的数据来计算信息增益,最后乘以一个代表缺失数据比例的比例系数
在对某个属性进行划分子节点时,对于不缺失该属性的数据正常划分,对于缺失该属性的数据,按不同的权重划分进行每个子节点
多变量决策树
实际上大部分机器学习的分类算法,都是将一个具有n个属性的数据,看成一个在n维空间的一个点,分类的过程就是在n维空间或者更高维度空间中找到超平面,将这些点进行划分。

而普通的决策树算法有一个特点,由于它每个节点的划分条件都是单独的,明确的,所以决策树的决策边界是平行于空间的坐标轴的。如下图所示:

这对其拟合特性有一定的影响,当数据比较复杂时,需要较多的属性才能得到较好的划分,而多变量决策树就可以解决该问题。

在多变量决策树的学习过程中,不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器。 如下图所示:

建议阅读西瓜书 很详细!

DL之决策树(Decision tree)相关推荐

  1. Machine Learning | (7) Scikit-learn的分类器算法-决策树(Decision Tree)

    Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...

  2. 算法杂货铺——分类算法之决策树(Decision tree)

    算法杂货铺--分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 88978 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别 ...

  3. 数据分类:决策树Decision Tree

    背景 决策树(decision tree)是一种基本的分类和回归(后面补充一个回归的例子?)方法,它呈现的是一种树形结构,可以认为是if-then规则的集合.其其主要优点是模型具有很好的可读性,且分类 ...

  4. 决策树分类python代码_分类算法-决策树 Decision Tree

    决策树(Decision Tree)是一个非参数的监督式学习方法,决策树又称为判定树,是运用于分类的一种树结构,其中的每个内部节点代表对某一属性的一次测试,每条边代表一个测试结果,叶节点代表某个类或类 ...

  5. 决策树Decision Tree+ID3+C4.5算法实战

    决策树Decision Tree 决策树的三种算法: 举个栗子: 熵entropy的概念: 信息熵越大,不确定性越大.信息熵越小,不确定性越小. 其实就是排列组合之中的概率,概率相乘得到其中一个组合, ...

  6. 机器学习算法实践:决策树 (Decision Tree)(转载)

    前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决 ...

  7. 第六章.决策树(Decision Tree)—CART算法

    第六章.决策树(Decision Tree) 6.2 CART算法 CART决策树的生成就是递归地构建二叉决策树的过程.CART用基尼(Gini)系数最小化准则来进行特征选择,生成二叉树. 1.Gin ...

  8. 分类Classification:决策树Decision Tree

    目录 分类的定义 决策树Decision Tree 混乱衡量指标Gini index 决策树的特点 分类的定义 分类:建立一个学习函数(分类模型)将每个属性集合(x1,x2,...xn)对应到一组已定 ...

  9. Python数据挖掘入门与实践 第三章 用决策树预测获胜球队(一)pandas的数据预处理与决策树(Decision tree)

    作为一个NBA球迷,看到这一章还是挺激动的. 不过内容有点难,研究了半天... 要是赌球的,用这章的预测+凯利公式,是不是就能提升赢钱概率了? 数据预处理 回归书本内容,既然要分析,首先需要有数据: ...

  10. 决策树Decision Tree 和随机森林RandomForest基本概念(一)

    文章目录 一.决策树介绍 1.1 什么是决策树 1.2 决策树种类 1.3 决策树学习过程 1.4 Entropy(熵) 1.5 information gain(信息增益) 1.6 信息论 1.8 ...

最新文章

  1. $_FILES上传错误类型
  2. 99.99%准确率!AI数据训练工具No.1来自中国
  3. LaTeX单栏和双栏设置
  4. Linux之文件查找命令
  5. Maven项目缺少Maven Dependencies解决方法总结
  6. Percona Server 5.6 Master-Slave Replication测试
  7. ES6新特性_ES6对象添加Symbol类型属性---JavaScript_ECMAScript_ES6-ES11新特性工作笔记016
  8. ubuntu12.04 64位系统配置jdk1.6和jdk-6u20-linux-i586.bin下载地址
  9. ubuntu 20.04命令行模式_Ubuntu18.04LTS升级到20.04LTS
  10. 科幻小说《霜与火》 by 雷·布雷德伯里
  11. 什么是搜索引擎???搜索引擎的介绍
  12. 2020-08-05
  13. 【附源码】计算机毕业设计java医院人事及科室病区管理设计与实现
  14. soul被下架,社交圈的一股清流也变了味?
  15. WMS系统(一)成品出库
  16. 好久没在线了,恩进修(偷懒)中,hahaha~整理一下
  17. GPS时钟的详细说明
  18. Android动态加载APK插件类
  19. 2022抖音温暖中国年 集年味分7亿玩法攻略
  20. 华为陈黎芳:已在全球获得50多个5G商业合同

热门文章

  1. Window ChromeDriver(简单4步完成)
  2. python多进程队列性能测试
  3. pytorch优化器,学习率衰减学习笔记
  4. 55 安装Celery
  5. linux文件夹加密访问,技术|Linux系统上用encfs创建和管理加密文件夹
  6. linux的阻塞waitqueue,Linux阻塞控制 wait_event与wait_event_interruptible函数详解
  7. centos7.7安装mysql8.0_centos7.7 安装 mysql8.0.20
  8. vmware占用c盘空间_W7 64位装系统,硬盘全部都格式化和分区了,系统装上后C盘占了40G,这是怎么回事?...
  9. 树莓派python3.7_[Linux] 树莓派编译python3.7.4
  10. mapinfo在线地图插件_表格中如何可视化地址数据?用 SeaTable 的地图插件很方便...