ID3算法就是这样的一个算法,他能够找出我们上面提到的最有用的参考属性。ID3算法是由J.Ross.Quinlan在1975年提出的一种基于信息论的分类预测算法,该算法的核心是“信息熵”。下面是对信息熵的一种通俗的理解:信息熵其实就是描绘了一组数据的有序程度,一组数据越是有序信息熵也就越底,一种极端的情况是一组数据中只有一个非0值,其他都是0,那么熵就是0。另外一种情况是,如果一组数据越是无序信息熵也就越高,极端情况是这组数据是均匀随机分布的,那么它的熵就最大,因为我们无法辨别那种情况发生的概率较大。

假如一组数据由{d1,d2,...,dn}构成,其和是sum,那么求信息熵的公式是

id3算法python实现 id3算法_id3算法python实现

   分类预测算法属于有指导学习,方法是通过训练数据,按照参考属性对目标属性的依赖程度对参考属性分级别处理,这种分级别处理体现在创建决策树,目的是通过生成的判别树,产生规则,用来判断以后的数据。以如下数据为例:

id3算法python实现 id3算法_算法_02

共14条记录,目标属性是,是否买电脑,共有两个情况,yes或者no。参考属性有4种情况,分别是,age,income,student,credit_rating。属性age有3种取值情况,分别是,youth,middle_aged,senior,属性income有3种取值情况,分别是,high,medium,low,属性student有2种取值情况,分别是,no,yes,属性credit_rating有2种取值情况,分别是fair,excellent。我们先求参考属性的信息熵:

id3算法python实现 id3算法_分类_03

,式中的5表示5个no,9表示9个yes,14是总的记录数。接下来我们求各个参考属性在取各自的值对应目标属性的信息熵,以属性age为例,有3种取值情况,分别是youth,middle_aged,senior,先考虑youth,youth共出现5次,3次no,2次yes,于是信息熵:

id3算法python实现 id3算法_数据挖掘_04

类似得到middle_aged和senior的信息熵,分别是:0和0.971。整个属性age的信息熵应该是它们的加权平均值:

id3算法python实现 id3算法_数据挖掘_05

。下面引入信息增益(information gain)这个概念。


所以信息增益这个概念就是指目标熟悉从某一参考属性那里失去的信息熵,在上式中,Gain(age)越大,说明H_age(D)越小(假定H(D)目标属性的信息熵不变),我们把Gain(age),Gain(income),Gain(student),Gain(credit_rating)中最大(其实也就是参考属性最小)的属性放到决策树的最上层,我们为什么把信息熵最小的属性放到决策树最上层呢?因为信息熵越小说明数据越有序嘛(仔细看看信息熵的公式,该公式其实就代表了这个意思)比如H_age(D_middleage)=0就代表middle_age对应的目标属性buys_computer要么全是yes要么全是no,不然不可能等于0。Gain(age)最大,说明按照age来把顾客分类,得到的buys_computer状态比较“有序”。我们把age放在决策树最上层

(如果不好理解,可以用极限的方法,即假如在age属性上,当为youth时全部是on,当为middle时也全部是no,当为senior时全不是yes,那么Hage(D)=0)。

id3算法python实现 id3算法_数据挖掘_06

,类似可以求出Gain(income)=0.029,Gain(stduent)=0.151,Gain(credit_rating)=0.048。最大值为Gain(age),所以首先按照参考属性age,将数据分为3类,如下:

id3算法python实现 id3算法_算法_07

然后分别按照上面的方法递归的分类。递归终止的条件是,1,当分到某类时,目标属性全是一个值,如这里当年龄取middle_aged时,目标属性全是yes。2,当分到某类时,某个值的比例达到了给定的阈值,如这里当年龄取youth时,有60%的是no,当然实际的阈值远远大于60%。