决策树学习笔记整理

2023-11-04

本文目的

最近一段时间在Coursera上学习Data Analysis,里面有个assignment涉及到了决策树,所以参考了一些决策树方面的资料,现在将学习过程的笔记整理记录于此,作为备忘。

 

算法原理

决策树(Decision Tree)是一种简单但是广泛使用的分类器。通过训练数据构建决策树,可以高效的对未知的数据进行分类。决策数有两大优点:1)决策树模型可以读性好,具有描述性,有助于人工分析;2)效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。

 

如何预测

先看看下面的数据表格:

ID

拥有房产(是/否)

婚姻情况(单身,已婚,离婚)

年收入(单位:千元)

无法偿还债务(是/否)

1

单身

125

2

已婚

100

3

单身

70

4

已婚

120

5

离婚

95

6

已婚

60

7

离婚

220

8

单身

85

9

已婚

75

10

单身

90

上表根据历史数据,记录已有的用户是否可以偿还债务,以及相关的信息。通过该数据,构建的决策树如下:

image

比如新来一个用户:无房产,单身,年收入55K,那么根据上面的决策树,可以预测他无法偿还债务(蓝色虚线路径)。从上面的决策树,还可以知道是否拥有房产可以很大的决定用户是否可以偿还债务,对借贷业务具有指导意义。

 

基本步骤

决策树构建的基本步骤如下:

1. 开始,所有记录看作一个节点

2. 遍历每个变量的每一种分割方式,找到最好的分割点

3. 分割成两个节点N1和N2

4. 对N1和N2分别继续执行2-3步,直到每个节点足够“纯”为止

决策树的变量可以有两种:

1) 数字型(Numeric):变量类型是整数或浮点数,如前面例子中的“年收入”。用“>=”,“>”,“<”或“<=”作为分割条件(排序后,利用已有的分割情况,可以优化分割算法的时间复杂度)。

2) 名称型(Nominal):类似编程语言中的枚举类型,变量只能重有限的选项中选取,比如前面例子中的“婚姻情况”,只能是“单身”,“已婚”或“离婚”。使用“=”来分割。

如何评估分割点的好坏?如果一个分割点可以将当前的所有节点分为两类,使得每一类都很“纯”,也就是同一类的记录较多,那么就是一个好分割点。比如上面的例子,“拥有房产”,可以将记录分成了两类,“是”的节点全部都可以偿还债务,非常“纯”;“否”的节点,可以偿还贷款和无法偿还贷款的人都有,不是很“纯”,但是两个节点加起来的纯度之和与原始节点的纯度之差最大,所以按照这种方法分割。构建决策树采用贪心算法,只考虑当前纯度差最大的情况作为分割点。

 

 

量化纯度

前面讲到,决策树是根据“纯度”来构建的,如何量化纯度呢?这里介绍三种纯度计算方法。如果记录被分为n类,每一类的比例P(i)=第i类的数目/总数目。还是拿上面的例子,10个数据中可以偿还债务的记录比例为P(1) = 7/10 = 0.7,无法偿还的为P(2) = 3/10 = 0.3,N = 2。

Gini不纯度

image

熵(Entropy)

image

错误率

image

上面的三个公式均是值越大,表示越 “不纯”,越小表示越“纯”。三种公式只需要取一种即可,实践证明三种公司的选择对最终分类准确率的影响并不大,一般使用熵公式。

纯度差,也称为信息增益(Information Gain),公式如下:

image

其中,I代表不纯度(也就是上面三个公式的任意一种),K代表分割的节点数,一般K = 2。vj表示子节点中的记录数目。上面公式实际上就是当前节点的不纯度减去子节点不纯度的加权平均数,权重由子节点记录数与当前节点记录数的比例决定。

 

停止条件

决策树的构建过程是一个递归的过程,所以需要确定停止条件,否则过程将不会结束。一种最直观的方式是当每个子节点只有一种类型的记录时停止,但是这样往往会使得树的节点过多,导致过拟合问题(Overfitting)。另一种可行的方法是当前节点中的记录数低于一个最小的阀值,那么就停止分割,将max(P(i))对应的分类作为当前叶节点的分类。

 

过渡拟合

采用上面算法生成的决策树在事件中往往会导致过滤拟合。也就是该决策树对训练数据可以得到很低的错误率,但是运用到测试数据上却得到非常高的错误率。过渡拟合的原因有以下几点:

  • 噪音数据:训练数据中存在噪音数据,决策树的某些节点有噪音数据作为分割标准,导致决策树无法代表真实数据。
  • 缺少代表性数据:训练数据没有包含所有具有代表性的数据,导致某一类数据无法很好的匹配,这一点可以通过观察混淆矩阵(Confusion Matrix)分析得出。
  • 多重比较(Mulitple Comparition):举个列子,股票分析师预测股票涨或跌。假设分析师都是靠随机猜测,也就是他们正确的概率是0.5。每一个人预测10次,那么预测正确的次数在8次或8次以上的概率为 image,只有5%左右,比较低。但是如果50个分析师,每个人预测10次,选择至少一个人得到8次或以上的人作为代表,那么概率为 image,概率十分大,随着分析师人数的增加,概率无限接近1。但是,选出来的分析师其实是打酱油的,他对未来的预测不能做任何保证。上面这个例子就是多重比较。这一情况和决策树选取分割点类似,需要在每个变量的每一个值中选取一个作为分割的代表,所以选出一个噪音分割标准的概率是很大的。

 

优化方案1:修剪枝叶

决策树过渡拟合往往是因为太过“茂盛”,也就是节点过多,所以需要裁剪(Prune Tree)枝叶。裁剪枝叶的策略对决策树正确率的影响很大。主要有两种裁剪策略。

前置裁剪 在构建决策树的过程时,提前停止。那么,会将切分节点的条件设置的很苛刻,导致决策树很短小。结果就是决策树无法达到最优。实践证明这中策略无法得到较好的结果。

后置裁剪 决策树构建好后,然后才开始裁剪。采用两种方法:1)用单一叶节点代替整个子树,叶节点的分类采用子树中最主要的分类;2)将一个字数完全替代另外一颗子树。后置裁剪有个问题就是计算效率,有些节点计算后就被裁剪了,导致有点浪费。

 

 

优化方案2:K-Fold Cross Validation

首先计算出整体的决策树T,叶节点个数记作N,设i属于[1,N]。对每个i,使用K-Fold Validataion方法计算决策树,并裁剪到i个节点,计算错误率,最后求出平均错误率。这样可以用具有最小错误率对应的i作为最终决策树的大小,对原始决策树进行裁剪,得到最优决策树。

 

优化方案3:Random Forest

Random Forest是用训练数据随机的计算出许多决策树,形成了一个森林。然后用这个森林对未知数据进行预测,选取投票最多的分类。实践证明,此算法的错误率得到了经一步的降低。这种方法背后的原理可以用“三个臭皮匠定一个诸葛亮”这句谚语来概括。一颗树预测正确的概率可能不高,但是集体预测正确的概率却很高。

 

 

准确率估计

决策树T构建好后,需要估计预测准确率。直观说明,比如N条测试数据,X预测正确的记录数,那么可以估计acc = X/N为T的准确率。但是,这样不是很科学。因为我们是通过样本估计的准确率,很有可能存在偏差。所以,比较科学的方法是估计一个准确率的区间,这里就要用到统计学中的置信区间(Confidence Interval)。

设T的准确率p是一个客观存在的值,X的概率分布为X ~ B(N,p),即X遵循概率为p,次数为N的二项分布(Binomial Distribution),期望E(X) = N*p,方差Var(X) = N*p*(1-p)。由于当N很大时,二项分布可以近似有正太分布(Normal Distribution)计算,一般N会很大,所以X ~ N(np,n*p*(1-p))。可以算出,acc = X/N的期望E(acc) = E(X/N) = E(X)/N = p,方差Var(acc) = Var(X/N) = Var(X) / N2 = p*(1-p) / N,所以acc ~ N(p,p*(1-p)/N)。这样,就可以通过正太分布的置信区间的计算方式计算执行区间了。

正太分布的置信区间求解如下:

1) 将acc标准化,即image

2) 选择置信水平α= 95%,或其他值,这取决于你需要对这个区间有多自信。一般来说,α越大,区间越大。

3) 求出 α/2和1-α/2对应的标准正太分布的统计量 imageimage (均为常量)。然后解下面关于p的不等式。acc可以有样本估计得出。即可以得到关于p的执行区间

image

 

参考资料

[1] 《数据挖掘导论》Chapter 4 Classification:Basic Concepts, Decision Trees, and Model Evaluation,Pang-Ning Tan & Micheal Steinbach & Vipin Kumar著

[2] Data Analyis, Lectures in Week 6,7 at Coursera

[3] 《集体智慧编程》Chapter 7 Modeling with Decision Tree,Toby Segaran著

[4] 《Head First Statistics》 Chapter 12 置信区间的构造, Dawn Griffiths 著

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

决策树学习笔记整理 的相关文章

  • Mysql 数据库

    数据库基础 1 什么是数据库 用来存储数据 数据库可在硬盘及内存中存储数据 数据库与文件存储数据的区别 数据库本质也是通过文件来存储数据 数据库的概念就是系统的管理存储数据的文件 数据库介绍 本质就是存储数据的C S架构的socket套接字
  • 算法--将数组分成和相等的多个子数组,求子数组的最大个数

    作者 陈太汉 一个整数数组 长度为n 将其分为m份 使各份的和相等 求m的最大值 比如 3 2 4 3 6 可以分成 3 2 4 3 6 m 1 3 6 2 4 3 m 2 3 3 2 4 6 m 3 所以m的最大值为3 算法 原理的思想是
  • 将二叉树转为有序的双向链表

    一 题目要求 输入一棵二叉排序树 现在要将该二叉排序树转换成一个有序的双向链表 而且在转换的过程中 不能创建任何新的结点 只能调整树中的结点指针的指向来实现 include
  • 直线检测方法—LSD论文翻译

    附原文链接 LSD a Line Segment Detector 摘 要 LSD是一个线段检测器 能够在线性时间内得到亚像素级精度的检测结果 它无需调试参数就可以适用于任何数字图像上 并且能够自我控制错误数量的检测 平均来说 一个图像中允
  • 一文弄懂循环链表、双向链表、静态链表

    循环链表 双向链表 静态链表 三遍定律 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 1 循环链表 将单链表中终端结点的指针端由空指针改
  • findBug 错误修改指南

    FindBugs错误修改指南 1 EC UNRELATED TYPES Bug Call to equals comparing different types Pattern id EC UNRELATED TYPES type EC c
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • 逆波兰表达式求值(C语言实现)

    实验项目 从文本文件输入任意一个语法正确的 中缀 表达式 显示并保存该表达式 利用栈结构 把上述 中缀 表达式转换成后缀表达式 并显示栈的状态变化过程和所得到的后缀表达式 利用栈结构 对上述后缀表达式进行求值 并显示栈的状态变化过程和最终结
  • DDP入门

    DDP 即动态动态规划 可以用于解决一类带修改的DP问题 我们从一个比较简单的东西入手 最大子段和 带修改的最大子段和其实是常规问题了 经典的解决方法是用线段树维护从左 右开始的最大子段和和区间最大子段和 然后进行合并 现在我们换一种方法来
  • DNG格式解析

    Author Maddock Date 2015 04 22 转载请注明出处 http www cnblogs com adong7639 p 4446828 html DNG格式基本概念 DNG格式是在TIFF的基础上扩展出来的 要了解D
  • SDUT--OJ《数据结构与算法》实践能力专题训练6 图论

    A 数据结构实验之图论一 基于邻接矩阵的广度优先搜索遍历 Description 给定一个无向连通图 顶点编号从0到n 1 用广度优先搜索 BFS 遍历 输出从某个顶点出发的遍历序列 同一个结点的同层邻接点 节点编号小的优先遍历 Input
  • 链表面试题(一):反转链表的算法实现

    关于链表的考察 链表是面试里面经常涉及到的考点 因为链表的结构相比于Hashmap Hashtable Concurrenthashmap或者图等数据结构简单许多 对于后者更多面试的侧重点在于其底层实现 比如Hashmap中Entry
  • 算法问题实战策略

    算法问题实战策略 基本信息作者 韩 具宗万 译者 崔盛一出版社 人民邮电出版社ISBN 9787115384621上架时间 2015 2 4出版日期 2015 年3月开本 16开页码 738版次 1 1 内容简介 算法问题实战策略 本书收录
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • C++ AVL树(四种旋转,插入)

    C AVL树 四种旋转 插入 一 AVL树的概念及性质 二 我们要实现的大致框架 1 AVL树的节点定义 2 AVL树的大致框架 三 插入 1 插入逻辑跟BST相同的那一部分 2 修改平衡因子
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static
  • 从源码角度来谈谈 HashMap

    HashMap的知识点可以说在面试中经常被问到 是Java中比较常见的一种数据结构 所以这一篇就通过源码来深入理解下HashMap 1 HashMap的底层是如何实现的 基于JDK8 1 1 HashMap的类结构和成员 HashMap继承

随机推荐

  • HTML5 详细介绍 及应用实例

    HTML5 概况 什么是 HTML5 HTML 5有两大特点 首先 强化了 Web 网页的表现性能 其次 追加了本地数据库等 Web 应用的功能 HTML 5是近十年来Web开发标准最巨大的飞跃 和以前的版本不同 HTML 5并非仅仅用来表
  • [MySQL]事务ACID详解

    专栏简介 MySql数据库从入门到进阶 题目来源 leetcode 牛客 剑指offer 创作目标 记录学习MySql学习历程 希望在提升自己的同时 帮助他人 与大家一起共同进步 互相成长 学历代表过去 能力代表现在 学习能力代表未来 目录
  • 版本管理工具——SVN

    SVN的下载和安装 1 1SVN服务器端的安装和配置 1 2SVN客户端的安装和配置 SVN的基本操作 SVN的常见问题 3 1解决文件提交冲突 一 SVN服务器端的安装和配置 1 VisualSVN下载 http www visualsv
  • 国内及Github优秀开发人员列表

    自从入了Android软件开发的行道 解决问题和学习过程中免不了会参考别人的思路 浏览博文和门户网站成了最大的入口 下面这些列表取名为 国内及Github优秀开发人员列表 就是浏览后的成果 虽然下述列表出自Android软件开发 文章定为不
  • python科研项目_通过科研人员论文项目等数据,训练识别导师/学生的分类器

    student and teacher classifier 通过科研人员论文项目等数据 训练识别导师 学生的分类器 代码包括特征选择基础 网格搜索确定特征选择方法参数 不平衡数据的处理 oversampling和undersampling
  • -day18面向对象进阶

    day18 面向对象进阶 课程目标 掌握面向对象进阶相关知识点 能更加自如的使用面向对象来进行编程 今日概要 成员 变量 实例变量 类变量 方法 绑定方法 类方法 静态方法 属性 成员修饰符 公有 私有 对象嵌套 特殊成员 对比 问题 洗衣
  • mysql group by 中文_MySQL GROUP BY 语句

    MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组 在分组的列上我们可以使用 COUNT SUM AVG 等函数 GROUP BY 语法 SELECT column name function col
  • 单片机学习 1-LED灯的点亮(全操作)

    LED灯 P0 P1 P2 P3结构图 除了P0端口需要自己外接上拉电阻 否则只能输入输出低电平 其它自带上拉电阻 因此都可以实现高低电平的输入输出 LED灯介绍 LED灯本质是发光二极管 单片机输入电流控制在3mA 20mA之间 可串联电
  • ubuntu pycharm 无法输入中文

    很多人反馈是和ubuntu20 04有关 但是其实应该是和pycharm20 2 3有关 只需要替换掉版本里面的jbr即可 1 下载jbr https confluence jetbrains com pages viewpage acti
  • 数组-第三大的数

    题意 给定一个非空数组 返回此数组中第三大的数 如果不存在 则返回数组中最大的数 要求算法时间复杂度必须是O n 示例 1 输入 3 2 1 输出 1 解释 第三大的数是 1 示例 2 输入 1 2 输出 2 解释 第三大的数不存在 所以返
  • 笔记本电脑运行特别慢怎么解决

    其实不管是笔记本电脑还是台式电脑 用久了肯定多多少少都会有点卡顿的情况出现 很多人的笔记本就是用久了就有这种情况 面对这种情况 如果大家想快速的解决问题 就一起学学今天的关于笔记本电脑运行特别慢怎么解决的内容吧 工具 原料 系统版本 win
  • 操作系统fork()进程

    1 fork 是创建进程函数 2 c程序一开始 就会产生 一个进程 当这个进程执行到fork 的时候 会创建一个子进程 3 此时父进程和子进程是共存的 它们俩会一起向下执行c程序的代码 4 需要注意 子进程创建成功后 fork是返回两个值
  • C语言—星空&下雪特效(Easyx)

    目录 实现效果如图 01 星空 静态 02 下雪 动态 实现效果如图 01 星空 静态 include
  • [C++11]std::promise

    一 std promise介绍 std promise 是C 11并发编程中常用的一个类 常配合std future使用 其作用是在一个线程t1中保存一个类型typename T的值 可供相绑定的std future对象在另一线程t2中获取
  • vue click.stop 阻止点击事件继续传播(阻止事件冒泡)

    场景 H5 移动端 弹窗表单 背景是遮罩 点击表单外遮罩时关闭弹窗 点击表单则不关闭弹窗 click stop 阻止点击事件继续传播
  • 进阶指针【指针的进阶使用方法】

    进阶指针目录 前言 字符指针 指向字符 指向字符串常量 指向同一个字符串常量的字符指针 指针数组 指针数组的定义和使用 数组指针 数组指针的定义 数组指针的使用 函数指针 函数指针的定义 函数指针的使用 函数指针数组 函数指针数组的定义 函
  • Opencv-Python学习(五)

    一 傅里叶变换 傅里叶变换的详细过程及推导可以看一个大佬写的 我这里就不介绍了 链接 傅里叶分析之掐死教程 完整版 更新于2014 06 06 知乎 我这里就介绍一下傅里叶变换的一些概念和opencv中如何实现傅里叶变换 低频 变化缓慢的灰
  • Microsoft Skype产品线梳理

    目录 前言 1 Skype应用程序 2 Skype for Business 3 Skype电话 4 Skype号码 5 Skype连接 总结
  • FPGA:三种基本门电路设计(与门、或门、非门)

    FPGA的设计跟数电是紧密相连的 而我们学习数电时候 学习的第一个内容就是数字逻辑基础 这里面就包含了我们今天要讲解的三种基本的门电路 这里 我们依次讲解过来 1 与门 定义 有两个或多个输入 但只有一个输出 只有在所有输入都是高但电平时才
  • 决策树学习笔记整理

    本文目的 最近一段时间在Coursera上学习Data Analysis 里面有个assignment涉及到了决策树 所以参考了一些决策树方面的资料 现在将学习过程的笔记整理记录于此 作为备忘 算法原理 决策树 Decision Tree