原标题:从ID3到C5.0的故事:算法详解及实践应用

在前面,我们分别概述性地介绍了决策树的基本知识:

1.算法概述

ID3(Iterative Dichotomiser3)算法可以说决策树算法中最著名的代表,它在1979年,由澳大利亚的计算机科学家,罗斯.昆兰(J.R.Quinlan)所发表出来。ID3算法在发表后,就引起了整个工业界的大量关注,并且其他科学家也根据ID3相继提出了ID4,ID5等等的相关算法。

考虑到ID4等名称已经被占用,昆兰只好在1993年的ID3算法的更新上,使用了C4.5(Classifier 4.5)这个名称,而后根据C4.5进一步推出了商业化的版本C5.0。C5.0作为商业化版本,主要在计算速度和运行内存上进行改进,但由于商业化版本并没进一步提供具体算法细节,因此后续主要介绍ID3及C4.5算法。

在前面决策树概述中,我们说到,我们可以通过集合的“纯度”来进行划分条件的选择。而ID3算法则使用了信息熵这一度量指标来衡量集合的纯度。熵(Entropy)这个概念最早出现在热力学中,是由德国物理学家及数学家鲁道夫·尤利乌斯·埃马努埃尔·克劳修斯所提出,它的物理意思表示该体系的混乱程度,简单地说,如果该体系下的分子运动杂乱程度增加,该体系的熵也随着增加。在熵这个概念普及之后,在1948年,信息论之父克劳德·艾尔伍德·香农提出了信息熵的概念。类比下来,我们可以认为信息熵这一度量是用来描述信息的“混乱”程度或者说信息的不确定度。

关于信息熵的通俗理解可以查看如下文章:

回到ID3算法中,不妨假设我们的样本集合D中含m类样本,其中每一类样本的比例分别为p(k)(k=1,2,…,m),则集合D的信息熵我们定义为:

计算时,定义有

Ent(D)越大,集合D的不纯程度越高,Ent(D)越小,集合D的纯度越高。因此也有一些文献中提到信息熵用以衡量样本集合的“不纯”纯度。另外不难证明,当存在某p(k)=1时,Ent(D),取得最小值,纯度达到最高;另外可以证明,当存在n种情况都是等可能发生的情况下,即:

信息的不确定度越大,Ent(D)达到最大。

显然,对于父节点,我们需要选择一个最佳划分条件,使得利用这个划分条件划分后的子集纯度更高,即划分后的信息熵达到最小。假如我们选择了变量C对集合D进行划分为n个子集,每个子集的信息熵为:

而所有子集的信息熵则可以表示为:

其中,N是父节点样本数量,n是该测试条件的分组数量(如学历可以分为:初中,高中,本科,硕士及以上,则n=4),N(Di)则是每个分组子集的样本数量。Ent(D|C)也就是集合D在已知随机变量C条件下的条件熵。

为了验证测试条件C的效果,则需要比较父结点与子女结点间的纯度差异,这种差异越大,说明该测试条件越好,而信息增益Gain则是这种差异的判断标准:

接下来,我们回到决策树算法概述中谈到的例子,看电影问题。

浩彬老撕重新收集了样本数据进行举例说明决策树的生成,该数据包含了12个样本,除了ID字段外,我们希望通过这个人决策当天是否属于周末以及工作完成情况来判断当天他是否外出看电影。

根据公式,可以计算得到根节点的信息熵为:

接下来我们分别计算利用属性集中不同划分条件进行划分后的信息增益,以“今天是否周末”这个变量为例,进行划分后分成子集D1(看电影,看电影,看电影,看电影,看电影,不看电影)及子集D2(不看电影,不看电影,不看电影,不看电影),因此对应子集D1的正例比例p(11)=5/6,反例比例p(12)=1/6。对应子集D1的正例比例P(21)=0,反例比例P(22)=1。所以对于“今天是否周末”这个划分条件划分后的每个子集的信息熵为:

因此我们可以计算得到对应的信息增益为:

同样,我们可以计算得到划分条件为“今天心情如何?”时对应的信息增益为:

可以看到,选择“今天心情如何”这一划分条件,我们获得更高的信息增益。但值得注意的是,利用信息增益的公式,多路划分的熵将倾向于更小。这是因为二分类的划分实际上就是把多路划分的一些属性合并,这必然会提高子集“不纯”,因此这就会导致划分类别较多的输入变量更加容易被选为划分条件。

留意到电影决策数据中有“ID”这一字段,假如我们使用这一字段作为输入选择划分条件的话,我们发现我们的分类纯度可以达到最高(因为每个子集仅有一个样本)!但显然,这样的划分条件对于我们进行预测是毫无作用的。因此为了避免利用公式陷于过多划分的“陷阱”,C4.5算法采用增益率来评估划分:

其中,Ent(C)用于修正由于多划分带来的偏差,这就可以看成选择划分属性带来的“代价”。回到例子中,我们可以计算得到:

可以看到,当我们对划分条件的信息增益加上了“代价”的考虑,类别较多的划分条件信息增益率减少了,因此C4.5算法选择了“今天是否周末”这一划分条件而不是“今天心情如何”。

2. 应用实践

在本例当中,我们使用某银行信贷数据进行客户违约分析。该数据集包含了850条记录,其中目标变量是违约情况(1代表是,0代表否),其他变量包括ID,年龄,学历水平居住时间,任职年限,家庭收入(千美元),信用卡债务(千美元),其他债务(千美元)以及总债务与收入比(%)。

相关数据文件可通过如下链接下载:

链接: https://pan.baidu.com/s/1b1LOcQ 密码: 6fms

模型流如下所示:

1.数据读取:

我们使用【Statistics文件】节点读取数据,并且接入【类型】节点进行对变量的设定,具体设置如下:

(1)把“违约情况”这一字段的角色设为“目标”;

(2)把“ID”这一字段的角色设为“无”;

(3)其他字段设为输入;

2.前期数据处理:

设定好类型节点后,留意到本数据中有部分样本记录存在缺失值,因此在分析前我们需要对该部分的记录进行处理,在本例中,我们选择把缺失数据进行过滤。因此在设定类型节点后,我们加入【选择】节点,输入:@NULL(违约情况)丢弃空值。

3.划分训练集与测试集:

接下来连上【分区】节点,具体设置如下,我们选择70%的样本作为训练集,30%的样本作为测试集:

4.构建模型:

在准备好以上的工作后,接下来我们可以开始建立模型了。选中【C5.0】节点,并将其添加到流。

5.得到结果:

根据选项设置后运行模型,运行得出结果。点开金黄色的【模型块】查看模型结果。首先看到的是【模型】选项卡,左边显示模型的规则结果,右边则是显示预测变量重要性。

为了更全面查看模型结果,我们可以选择【查看器】选项卡,在该选项卡下,我们可以根据需要选择决策树的不同展现方式。

6.结果评估:

最后,为了准确得到模型预测结果评估,我们在模型节点后添加‘分析’节点(在输出选型卡下),其中勾选‘重合矩阵(用于字符型目标字段)’,点击运行。

通过分析结果,我们可以看到C5.0在训练集及在测试集上的预测准确率,训练集的准确率高达89.61%,而测试集虽然略有下降,但还是达到77.99%。

责任编辑:

id3算法c语言实现,从ID3到C5.0的故事:算法详解及实践应用相关推荐

  1. NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python)

    NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python) NEAT算法详解 NEAT算法概述 NEAT编码方案 结构突变 ...

  2. 编程题50 习题6-8 单词首字母大写【浙大版《C语言程序设计(第4版)》题目集 详解教程】

    编程题50 习题6-8 单词首字母大写[浙大版<C语言程序设计(第4版)>题目集 详解教程] 原题链接:习题6-8 单词首字母大写 (pintia.cn) 参考答案 #include< ...

  3. 决策树之ID3、C4.5、C5.0等五大算法及python实现

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- C5.0决策树之ID3.C4.5.C5.0算法 ...

  4. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc

    图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...

  5. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言)

    图的邻接表实现迪杰斯特拉算法(C语言). 迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题. 图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是 ...

  6. 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  7. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  8. c语言排序常用问题,【更新中】【排序详解】解决排序问题(以C语言为例)

    [更新中][排序详解]解决排序问题(以C语言为例) [更新中][排序详解]解决排序问题(以C语言为例) 文章目录 排序的相关概念 简单排序 一.插入排序: (一)插入排序基本思想 (二)插入排序基本操 ...

  9. sort在c语言中的作用,c语言中sort的用法详解.docx

    c语言中sort的用法详解.docx C语言中SORT的用法详解C语言的学习很多是比较复杂的,那么C语言中SORT的用法的用法你知道吗下面学习啦小编就跟你们详细介绍下C语言中SORT的用法的用法,希望 ...

最新文章

  1. HTML中将px转换为em的语法,在JavaScript中转换EM为PX(并获得默认字体大小)
  2. 彼之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践
  3. android学习之-简单对话框
  4. 免安装版的MySQL的安装与配置
  5. 继穿越火线后的又一传奇:Final Approach
  6. XML文件操作(C#)
  7. vscode ---- 插件
  8. 遇到了火狐扩展全部丢失的问题
  9. MongoDB 之 你得知道MongoDB是个什么鬼 MongoDB - 1
  10. 2020 Kyligence 面经
  11. 文库网站开发,文库网站定制,仿百度在线文档网站建设
  12. 深入浅出统计学——笔记(一)1~3章
  13. linux 无线网卡驱动 centrino 6200 agn,下载:Intel无线网卡驱动14.2官方正式版
  14. 【工业互联网】郭朝晖:工业互联网平台背景下的工业大数据与智能制造
  15. 疯狂java  进行回顾
  16. 【burpsuite安全练兵场-服务端8】文件上传漏洞-7个实验(全)
  17. 经管之家账号被封,显示IP地址不在允许范围内
  18. js直接调用系统打印机进行打印
  19. 利用VBA将excel中链接转换为图片形式存放在指定的单元格中
  20. VS使用C++开发桌面程序

热门文章

  1. 2020双十一实时大屏_双十一成交额历年对比 2020双十一成交额实时数据更新 - 商业资讯...
  2. Unity zSpace开发记录
  3. 智慧交通day03-车道线检测实现04:车道线提取原理+代码实现+效果图
  4. Winclone Pro for Mac(Windows分区备份还原工具)
  5. c++语言判断回文字符串,判断一个字符串是否回文
  6. Go圣经-学习笔记目录
  7. Android动态设置纯色图标的颜色
  8. android 按键映射文件,《android 的按键映射表》.doc
  9. Docker 安装Jenkins + Python + Allure + JDK
  10. buddy system - Linux内存管理(6)