决策树-ID3算法和C4.5算法

  决策树是一种有监督(现有样本已知分类结果)的机器学习方法。它通过对已有样本的学习生成一颗决策树(可看成if-then规则集合),从而能对新样本作出相应分类。本文重点阐述如何选择特征建立决策树,并给出理解算法的具体实例。
  
  


  
  

一、什么是决策树

  
决策树:通过对已知样本的学习,一步一步将特征进行分类,从而将整个特征空间进行划分,进而区分出不同类别的算法。我们在逻辑判断中用到的思想if, else if ,else, then,其实就是决策树的思想。只是用哪个条件特征先做if,哪个条件后做if得到的结果会比较好呢?1970年,一名叫昆兰的大牛采用了信息论中的熵来度量最优特征选择。昆兰把这个算法称为ID3算法。该算法一出,它的简洁和高效就引起了轰动。
  
接下来我们详细介绍ID3算法。

  
  

二、ID3算法详解

  

1 什么是熵

  
熵度量了事物的不确定性,越不确定的事物,熵越大。随机变量X的熵公式如下:
  
在这里插入图片描述

  
其中n表示随机变量X的n种不同离散取值,pi表示X取值为i的概率,log表示以2为底或以e为底的对数。
  
假设随机变量X表示掷一枚硬币的结果,它有两种可能的取值,正面或反面,各占1/2,这时随机变量X的熵为:
  
在这里插入图片描述

  
假设随机变量X表示掷一枚骰子的结果,它有六种可能的取值,{1,2,3,4,5,6},各占1/6,这时随机变量X的熵为:
  
在这里插入图片描述

  
掷一枚骰子的不确定性比掷一枚硬币的不确定性大,熵值也大。了解了熵的概念,下面我们详细介绍ID3算法。
  
  

2 ID3算法

  
在决策树的每一个节点,我们都要选择最优的特征进行分裂。那么怎么定义在该次分裂中该特征是最优选择?ID3算法采用信息增益来衡量变量是不是最优的。我们Gain(D,a)来表示信息增益,具体公式如下:
  
在这里插入图片描述
  

其中D表示当前样本集合,a表示某个特征,Ent(D)表示信息熵,|D|表示样本集合中样本数量,表示特征a中v类样本数量,表示v类样本信息熵。若当前样本集合D中总共有K类,其中第k类的样本所占比例为pk,则D的信息熵公式如下:
  
在这里插入图片描述
  

为了更清晰地理解信息增益公式,以及决策树如何选择特征,我们看一个构造的简单例子:
  
在这里插入图片描述
  
正例(放贷)占11/17,反例占6/17,根节点的信息熵为:
  
在这里插入图片描述
  

计算当前特征集合{学历,是否有房子,信贷表现}中每个特征的信息增益,选择信息增益最大的特征进行分裂。
  
学历有4个可能取值:{初中及以下,高中,大学,研究生及以上}
  
D1(学历=初中及以下)={1,2,3,4},正例2/4,反例2/4。
  
D2(学历=高中)={5,6,7,8,9,10},正例4/6,反例2/6。
  
D3(学历=大学)={11,12,13,14},正例3/4,反例1/4。
  
D4(学历=研究生及以上)={15,16,17},正例2/3,反例1/3。
  
4个分支节点的信息熵为:
  
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  
则学历的信息增益为:
  
在这里插入图片描述
在这里插入图片描述

  
同理,可以算出其它两个特征的信息增益。
  
在这里插入图片描述
在这里插入图片描述
  
我们发现
在这里插入图片描述

  
所以根节点我们选择的划分特征为“信贷表现”。
  
在这里插入图片描述

  
从而可以得到三个子节点。对于这三个节点,可以递归地使用信息增益寻找最优划分特征,进行进一步的分裂,从而建立最终的决策树。
  
在该文章的实例中,信贷表现良好和非常好的样本最终都放贷了。说明这两个子节点中的样本非常纯。现实数据可能远比实例中的数据复杂,不是信贷表现良好就一定会放贷。有些信贷表现好,也可能是养的信贷数据,还要从别的维度去佐证这个客户有能力且有意愿还贷,才会最终给这个客户放贷。
  
接下来对第一个分支结点:D1(信贷表现=较差)={2,4,7,10,11,17},计算当前特征集合{学历,是否有房子}中每个特征的信息增益,选择信息增益最大的特征进行分裂。
  
当前结点正例(放贷)占1/6,反例占5/6,当前节点的信息熵为:
  
在这里插入图片描述

  
学历有4个可能取值:{初中及以下,高中,大学,研究生及以上}
  
D11(学历=初中及以下)={2,4},正例0/2,反例2/2。
  
D12(学历=高中)={7,10},正例0/2,反例2/2。
  
D13(学历=大学)={11},正例1/1,反例0/1。
  
D14(学历=研究生及以上)={17},正例0/1,反例1/1。
  
4个分支节点的信息熵为:
  
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  
那么当前分支节点特征学历的信息熵为:
  
在这里插入图片描述

同理可以求出特征是否有房子的信息熵为:
  
在这里插入图片描述

  
可以发现
  
在这里插入图片描述

  
于是我们选择学历作为当前划分特征,得到最终的决策树如下:
  
在这里插入图片描述

  
从上面的结果可以发现,对于信贷表现较差的客户,学历是初中及以下和高中的都拒绝了,学历是大学的放贷了,学历是研究生的拒绝了(为什么大学学历可以放贷,研究生学历却不行?)。
  
从这里可以看出,用信息增益准则虽然可以构建出一颗决策树,通过这颗树可以对新进来的样本进行最终的决策(放贷或拒绝)。但是这样的决策树存在一些问题。
  
  

3 ID3算法的缺点

  
从求解信息增益的公式中可以看出,信息增益准则对取值类别较多(分的类别越多,分到每一个子节点的样本数量越少,子节点是同一个类别的可能性越大)的特征有所偏好。假设实例数据集中的编号也是一个候选划分特征,那么该特征的每一个类别中只有一个样本(非常纯)。
  
所有分支节点的信息熵都为0,该节点的信息增益就为根节点的信息熵,值为0.936,大于特征信贷表现的信息增益0.706。应该选择编号建立决策树?显然,这样生成的决策树不具备泛化能力。而且ID3算法没有考虑连续特征,比如长度是连续值,无法使用ID3算法。同样的,对于缺失值和过拟合也都没有考虑,只是寻找信息增益最大的特征进行划分。

那我们要如何改进这个算法?
  
  

二、C4.5算法详解

  
对于之前讲到的ID3算法,存在四个主要不足:一是信息增益准则对取值类别较多的特征有所偏好,二是不能处理连续特征,三是没有考虑缺失值处理,四是过拟合。昆兰在C4.5算法中改进了这四个问题。

  
  

1 第一个问题的改进办法

  
对于第一个问题,C4.5算法采用信息增益率,做为变量的最终筛选标准。通过引进一个和特征类别数目成正比的量作为分母,来消除这种偏好。信息增益率公式如下:
  
在这里插入图片描述
  
其中,Gain(D,a)就是ID3算法中的信息增益,IV(a)就是和特征类别数目成正比的量。IV(a)的具体公式如下:
  
在这里插入图片描述
  

在全量样本中,特征学历有4个可能取值:{初中及以下,高中,大学,研究生及以上},是否有房子有2个可能取值:{有,无},信贷表现有3个可能取值:{较差,良好,非常好}。
  
分别看下这3个特征对应的的IV(a)值:
  
IV(学历)=1.95 (n=4)
  
IV(是否有房子)=0.936 (n=2)
  
IV(信贷表现)=1.55 (n=3)
  
可以发现,特征中类别数越多,IV值越大,放在分母可以避免信息增益更偏好类别多特征的缺点。但是,除以这个分母后会不会使得算法更偏向于特征类别较少的变量?
  
答案是:会的。
  
所以C4.5算法没有直接选择信息增益率最大的特征进行划分,而是先挑出信息增益高于平均水平的特征,再从中选择信息增益率最好的特征,尽可能避免类别数目对划分特征选择的影响。

  
  

2 第二个问题的改进办法

  
对于第二个问题,不能处理连续特征。
  
C4.5的思想是将连续特征离散化。比如一个集合中有n个样本,m个特征,m个特征中有一个连续特征A。特征A有n个取值,从小到大排列为a1,a2,…,an。算出相邻两个样本的平均值作为划分点,一共有n-1个划分值。对于这n-1个点,分别计算以该点作为二元分类点时的信息增益,选择信息增益最大的点作为该连续特征的二元离散分裂点。
  
比如取到了信息增益最大的点为au,则小于au的值为类别1,大于au的值为类别2。从而实现了连续特征的离散化。对于第三个问题,不能处理缺失值问题。刘建平老师的博客中有详细的阐述,感兴趣的可以自行了解。对于第四个问题,C4.5引入了正则化系数进行初步剪枝,等到讲CART树剪枝时对比进行阐述。
  
虽然C4.5算法对ID3算法的几个主要问题进行了改进,但是仍然有优化的空间。比如C4.5算法只能用于分类,不能用于回归。C4.5使用了熵模型,里面有大量的对数运算,非常耗时。这些问题在CART树里进行了改进。接下来会重点整理CART树相关知识点,敬请期待。
  
  
参考文献:

周志华《机器学习》
https://www.cnblogs.com/pinard/p/6050306.html
https://zhuanlan.zhihu.com/p/126294494?utm_source=wechat_session&utm_medium=social&utm_oi=1090367802518536192&utm_content=first
https://zhuanlan.zhihu.com/p/85374168?utm_source=wechat_session&utm_medium=social&utm_oi=1090367802518536192&utm_content=first
https://zhuanlan.zhihu.com/p/85374168?utm_source=wechat_session&utm_medium=social&utm_oi=1090367802518536192&utm_content=firsthttps://zhuanlan.zhihu.com/p/26760551?utm_source=wechat_session&utm_medium=social&utm_oi=1090367802518536192&utm_content=first

你可能感兴趣:
用Python绘制皮卡丘
用Python绘制词云图
Python人脸识别—我的眼里只有你
Python画好看的星空图(唯美的背景)
用Python中的py2neo库操作neo4j,搭建关联图谱
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)

长按(扫一扫)识别上方二维码学习更多Python和建模知识,让你的学习和工作更出彩。

猜你喜欢

转载自blog.csdn.net/qq_32532663/article/details/108501110