分类与回归树(CART)- 机器学习ML

2023-11-11

参考:

1.《统计学习方法》李航

2.https://www.cnblogs.com/en-heng/p/5035945.html

3.http://blog.csdn.net/baimafujinji/article/details/53269040

4.https://baike.baidu.com/item/%E5%9F%BA%E5%B0%BC%E7%B3%BB%E6%95%B0/88365?fr=aladdin



转载:

在2006年12月召开的 IEEE 数据挖掘国际会议上(ICDM, International Conference on Data Mining),与会的各位专家选出了当时的十大数据挖掘算法( top 10 data mining algorithms ),可以参见文献【1】。本博客已经介绍过的位列十大算法之中的算法包括:

决策树模型是一类算法的集合,在数据挖掘十大算法中,具体的决策树算法占有两席位置,即C4.5和CART算法。本文主要介绍分类回归树(CART,Classification And Regression Tree)也属于一种决策树,希望你在阅读本文之前已经了解前文已经介绍过之内容:

欢迎关注白马负金羁的博客 http://blog.csdn.net/baimafujinji,为保证公式、图表得以正确显示,强烈建议你从该地址上查看原版博文。本博客主要关注方向包括:数字图像处理、算法设计与分析、数据结构、机器学习、数据挖掘、统计分析方法、自然语言处理。


CART生成

CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。

CART算法由以下两步组成:

  1. 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
  2. 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。

CART决策树的生成就是递归地构建二叉决策树的过程。CART决策树既可以用于分类也可以用于回归。本文我们仅讨论用于分类的CART。对分类树而言,CART用Gini系数最小化准则来进行特征选择,生成二叉树。 CART生成算法如下:

输入:训练数据集 D ,停止计算的条件: 
输出:CART决策树。

根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:

  1. 设结点的训练数据集为 D ,计算现有特征对该数据集的Gini系数。此时,对每一个特征 A ,对其可能取的每个值 a ,根据样本点对 A=a 的测试为“是”或 “否”将 D 分割成 D1 D2 两部分,计算 A=a 时的Gini系数。
  2. 在所有可能的特征 A 以及它们所有可能的切分点 a 中,选择Gini系数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
  3. 对两个子结点递归地调用步骤l~2,直至满足停止条件。
  4. 生成CART决策树。

算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的Gini系数小于预定阈值(样本基本属于同一类),或者没有更多特征。


一个具体的例子

下面来看一个具体的例子。我们使用《数据挖掘十大算法之决策树详解(1)》中图4-6所示的数据集来作为示例,为了便于后面的叙述,我们将其再列出如下: 


 

首先对数据集非类标号属性{是否有房,婚姻状况,年收入}分别计算它们的Gini系数增益,取Gini系数增益值最大的属性作为决策树的根节点属性。根节点的Gini系数 

Gini()=1(310)2(710)2=0.42

当根据是否有房来进行划分时,Gini系数增益计算过程为 


 

Gini()=1(03)2(33)2=0Gini()=1(37)2(47)2=0.4898

Δ{}=0.42710×0.4898310×0=0.077

若按婚姻状况属性来划分,属性婚姻状况有三个可能的取值{married,single,divorced},分别计算划分后的

  • {married} | {single,divorced}
  • {single} | {married,divorced}
  • {divorced} | {single,married}

的Gini系数增益。 
当分组为{married} | {single,divorced}时, Sl 表示婚姻状况取值为married的分组, Sr 表示婚姻状况取值为single或者divorced的分组 

Δ{}=0.42410×0610×[1(36)2(36)2]=0.12

当分组为{single} | {married,divorced}时, 
Δ{}=0.42410×0.5610×[1(16)2(56)2]=0.053

当分组为{divorced} | {single,married}时, 
Δ{}=0.42210×0.5810×[1(28)2(68)2]=0.02

对比计算结果,根据婚姻状况属性来划分根节点时取Gini系数增益最大的分组作为划分结果,也就是{married} | {single,divorced}。

最后考虑年收入属性,我们发现它是一个连续的数值类型。我们在前面的文章里已经专门介绍过如何应对这种类型的数据划分了。对此还不是很清楚的朋友可以参考之前的文章,这里不再赘述。

对于年收入属性为数值型属性,首先需要对数据按升序排序,然后从小到大依次用相邻值的中间值作为分隔将样本划分为两组。例如当面对年收入为60和70这两个值时,我们算得其中间值为65。倘若以中间值65作为分割点。 Sl 作为年收入小于65的样本, Sr 表示年收入大于等于65的样本,于是则得Gini系数增益为 

Δ()=0.42110×0910×[1(69)2(39)2]=0.02

其他值的计算同理可得,我们不再逐一给出计算过程,仅列出结果如下(最终我们取其中使得增益最大化的那个二分准则来作为构建二叉树的准则): 


 

注意,这与我们之前在 《数据挖掘十大算法之决策树详解(1)》 中得到的结果是一致的。最大化增益等价于最小化子女结点的不纯性度量(Gini系数)的加权平均值,之前的表里我们列出的是Gini系数的加权平均值,现在的表里给出的是Gini系数增益。现在我们希望最大化Gini系数的增益。根据计算知道,三个属性划分根节点的增益最大的有两个:年收入属性和婚姻状况,他们的增益都为0.12。此时,选取首先出现的属性作为第一次划分。

接下来,采用同样的方法,分别计算剩下属性,其中根节点的Gini系数为(此时是否拖欠贷款的各有3个records) 

Gini()=1(36)2(36)2=0.5

与前面的计算过程类似,对于是否有房属性,可得 
Δ{}=0.546×[1(34)2(14)2]26×0=0.25

对于年收入属性则有:


 

最后我们构建的CART如下图所示:


 

最后我们总结一下,CART和C4.5的主要区别:

  • C4.5采用信息增益率来作为分支特征的选择标准,而CART则采用Gini系数;
  • C4.5不一定是二叉树,但CART一定是二叉树。

关于过拟合以及剪枝

决策树很容易发生过拟合,也就是由于对train数据集适应得太好,反而在test数据集上表现得不好。这个时候我们要么是通过阈值控制终止条件避免树形结构分支过细,要么就是通过对已经形成的决策树进行剪枝来避免过拟合。另外一个克服过拟合的手段就是基于Bootstrap的思想建立随机森林(Random Forest)。关于剪枝的内容可以参考文献【2】以了解更多,如果有机会我也可能在后续的文章里讨论它。


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

分类与回归树(CART)- 机器学习ML 的相关文章

随机推荐

  • c++引用做函数返回值的理解

    1 以引用返回函数值 定义函数时需要在函数名前加 2 用引用返回一个函数值的最大好处是 在内存中不产生被返回值的副本 引用作为返回值 必须遵守以下规则 1 不能返回局部变量的引用 主要原因是局部变量会在函数返回后被销毁 因此被返回的引用就成
  • UnityVR--小程序6--主角管理

    之前在VR场景中的主角OVRPlayerController 没有加入生命力 初始位置等关于游戏的信息 在本文中 我们将给主角增加 1 生命值 生命值增加到一定分值后 允许进入下一关卡 另一场景 生命值将为0后 场景将重新别加载 游戏将重新
  • 一篇文章告诉你:ChatGPT新增「插件商店」怎么打开?怎么下载?怎么使用?(保姆级教程)

    关注公众号 人工智能学派 关于chatGPT的相关问题 各种疑难杂症 注册使用 提示语等都可以问我 上周六 即5月13日 OpenAI宣布将向所有ChatGPTPlus用户推出联网功能和插件功能 已经有人陆续能够体验到了 我的账号分别获得了
  • 在mysql中dml全称是_数据库DML,DDL,DCL分别是什么,有什么区别?

    一 DML data manipulation language 数据操纵语言 就是我们最经常用到的 SELECT UPDATE INSERT DELETE 主要用来对数据库的数据进行一些操作 SELECT 列名称 FROM 表名称 UPD
  • 关于C++ const 的全面总结

    C 中的const关键字的用法非常灵活 而使用const将大大改善程序的健壮性 本人根据各方面查到的资料进行总结如下 期望对朋友们有所帮助 Const 是C 中常用的类型修饰符 常类型是指使用类型修饰符const说明的类型 常类型的变量或对
  • docker安装mysql

    1 下载镜像文件 docker pull mysql 5 7 2 创建实例并启动 创建实例并启动 docker run p 3306 3306 name mysql v mydata mysql log var log mysql v my
  • 电脑进入pe时蓝屏_进PE蓝屏的几个原因

    上期小编讲解了windows找不到文件 详细教您windows找不到文件怎么解决 本次正特手机网小编给大家讲解一下进PE蓝屏的几个原因 一进PE就蓝屏 这种情况是不是经常遇到呢 这个究竟是什么原因造成的 经在几十台电脑中测试中 总结了以下几
  • go实现本地文件搜索引擎

    filelist go package main import flag fmt os path filepath strings var ostype windows 获取系统类型 var listfile string 获取文件列表 f
  • Java web 实现页面显示数据库表格

    运行错误显示 ERROR IllegalAccessException for stop method in class org apache tomcat maven plugin tomcat7 run ExtendedTomcat 目
  • 什么是死锁?如何避免和预防死锁。

    死锁指的是两个进程在执行过程中因争夺资源而造成的僵局 当进程处于死锁状态时 他们就不能继续执行 直到外部程序的干预或者自行放弃 预防和避免的措施 1 避免资源独占 尽量避免一个进程获取了某些资源后再次请求其他资源 而应该将所有资源一次性申请
  • linux debug技巧和工具

    linux debug技巧和工具 print 优点 简单 直接 灵活运用二分法思想 缺点 需要重新编译 运行 比较费时 gdb starting the program stop at specified locations stop on
  • Vue部署提高页面访问速度,nginx代理

    文章目录 1 概述 2 步骤 3 预估加载速度对比 vue ui 1 概述 在没有压缩本地js css的文件下 部署线上环境时 访问页面加载极慢 网上搜了一下 果然有相应的解决办法 特此记录一下 还可以用cdn的方式 后面再看 2 步骤 在
  • 【毕业设计】前后端分离——实现登录注册功能

    据说 看我文章时 关注 点赞 收藏 的 帅哥美女们 心情都会不自觉的好起来 前言 作者简介 大家好我是 user from future 意思是 来自未来的用户 寓意着未来的自己一定很棒 个人主页 点我直达 在这里肯定能找到你想要的 专栏介
  • hql连表查询(多表查询)

    hql连表查询的问题 总结了一下 与大家分享 package android com bzjm test import java util List import org hibernate HibernateException impor
  • geforce experience不能登录_火炬之光2居然也要登录NS了?

    完美世界旗下已经倒闭了的Runic Games表示 火炬之光2 和 迷城之光 会登录NS 那么既然Runic Games已经倒闭了 这条消息自然是完美世界自己发出来的 而负责移植 火炬之光2 的是著名的Switch游戏移植大户Panic B
  • File分隔符挺有意思的

    package Test5 import java io File author xlj public class RemoteFile public static void main String args throws Exceptio
  • jmu-python-随机生成密码(一行代码生成题目要求的字符列表)

    jmu python 随机生成密码 题目 答案 初始版 优化版 一行代码生成题目要求的字符列表 总结 题目 答案 初始版 import random x eval input n eval input m eval input str ab
  • python PyQt5 Qt Designer 学习笔记

    转化代码 pyuic5 o untitled py untitled ui cd 目录 main 文件 from PyQt5 QtWidgets import QApplication QMainWindow import sys from
  • 【问题解决】Failed to load module script: Expected a JavaScript module script but the server respond

    全部错误内容 xxx 86eb4fa7 js 1 Failed to load module script Expected a JavaScript module script but the server responded with
  • 分类与回归树(CART)- 机器学习ML

    参考 1 统计学习方法 李航 2 https www cnblogs com en heng p 5035945 html 3 http blog csdn net baimafujinji article details 53269040