决策树构建之ID3算法

来源:互联网 发布:消防工程师软件 编辑:程序博客网 时间:2024/06/04 20:12

        决策树是一种可以对数据集进行分类的树,它要求数据集中每个属性的可能取值都是离散的。决策树中包含3种结点:

       根结点,它没有入边,只有零条或多条出边。

        内部结点,它有一条入边和两条或多条出边。

        叶结点,有一条入边,但没有出边。

        在决策树中,每个叶结点都包含一个类标号。换句话说,每个叶节点都是已经被分好的类。根结点和内部结点表示在一个属性上的测试,每一条出边都代表该测试的一个输出。对于给定的一个类标号未知的元组X,由根结点开始对元组X的每一条属性进行测试,形成一条从根结点到叶结点的路径,该叶结点所包含的类标号就是元组X的类标号。

        常用的决策树算法有ID3,C4.5和CART等,本文主要介绍ID3(IterativeDichotomiser 3,迭代二分器3代)。C4.5是ID3算法的后继,它们在属性选择度量上有所不同,CART则是只产生二叉决策树。它们在训练元组学习决策树时都是采用分治法,自顶向下递归的构造决策树。决策树的递归构造算法描述如下:

1.     创建一个结点N并选择一个属性A放在其中,属性A每个可能的取值都有一个分支。

2.     将数据集根据A的可能取值分成许多子集,每一个分支对应一个子集。

3.     对于结点N的每一个子结点重复上述步骤,直到分支对应的子集中的所有记录都属于同一类或所有属性都已被放入结点中。

        接下来,我们便要考虑如何选择放入结点中的属性A。对于同一个数据集来说,选择不同的划分属性,得到的树的形状与深度也是不一样的。本文主要介绍ID3算法使用的信息增益度量方法。

        信息增益的衡量标准就是看属性能够给分类系统带来多少信息,带来的信息越多,该属性越重要,在决策树中就应该先被选择。信息增益基于香农提出的“熵“的概念。熵被定义为离散随机事件的发生概率。较高的熵代表较高的不确定性,反之较低的熵代表较低的不确定性。

        对数据集D中元组进行分类所需要的期望信息,也即数据集D的熵为:

 

        其中pi中任意元组属于类Ci的概率,计算方法为属于类Ci的元组数除以D中元组总数。 表示对整个数据集中每个元组进行准确分类(即每个分区的类标号都相同)所需要的平均信息。假设现在我们按照某个属性A对数据集D进行划分,属性A的可能取值有{a1,a2,...av}且是离散的,属性A可将数据集D划分为{D1,D2,...,Dv}。那么在用属性A对数据集D进行划分后,我们对D中元组进行分类所需要的期望信息就变为:

        其中|Dj|/|D|是数据集中属性A=aj的元组占元组总数的比例。 也可以理解为在使用了属性A所提供的信息对决策树进行划分后,我们对数据集D准确分类还需要的平均信息。Info(D)与Info_A(D)的差值就是属性A为数据集D的分类所提供的信息,也就是属性A的信息增益。显然的,信息增益的计算公式由下式给出:

        下面,我们以上述数据集为例,计算每个属性的信息增益。该数据集有4个属性,分别是Outlook、Temperature、Humidity和Windy,最后一列表示前四个属性已知的情况下是否去打球。例如,第一个元组表示天气晴朗、气温较热、湿度较高且无风的情况下不去打球。首先,我们计算整个数据集的熵 。可以看出,14条记录中有9条记录去打球,5条记录没去打球,所以D的熵为:

        接下来,考虑第一个属性Outlook,它有三个可能的取值:Sunny、Overcast和Rainy。其中Sunny包含5条记录,有2次去打球,3次不去打球;Overcast包含4条记录,有4次去打球,0次不去打球;Rainy包含5条记录,有3次去打球,2次不去打球。所以,属性Outlook的熵计算如下:

        其中:

        所以:

        可得属性Outlook的信息增益为:

        类似的,可以计算其他属性的信息增益,此处省略计算过程,直接给出计算结果:

        根据前文所述,我们选择信息增益最大的属性即Outlook作为根结点,然后再对每个节点计算余下三个属性的信息增益,递归建树即可。此处直接给出利用Weka生成的决策树:

 

   

        考虑类标号未知的元组X(Outlook = sunny, Temperature = hot, Humidity = normal, Windy = FALSE),由上图决策树可知,在Outlook = sunny且Humidity = high的情况下,会选择不去打球。


        以上就是我对ID3算法的理解,若有错误,欢迎指正。

0 0