11.决策树的划分基础:信息熵

划分数据集是决策树算法的关键。划分的方法也多种多样,有ID3,C4.5,CART等。

ID3:基于信息熵来选择最佳的测试属性,其选择了当前样本集中具有最大信息增益值的属性作为测试属性;

C4.5:相对ID3 来说避免了采用信息增益度量存在的一个缺点 , 而C4.5 采用了信息增益比率来选择分支的准则;

CART:与 C4.5 算法类似,只是属性选择的指标采用的是基尼系数;

无论哪种方式,都是与信息熵强关联的,因此,我们先来看下什么是信息熵。

划分数据的大原则是将无序的数据变得更加有序。我们在划分数据集前后,信息发生的变化称为信息增益。我们只要计算出信息增益,通过对比每个特征值划分数据集获得的信息增益,就能找出最好的方式,即获得信息增益最高的特征。

集合信息的度量方式叫做香农熵或者简称为熵。为什么叫做熵呢?因为谁也不知道这玩意儿代表什么意思,所以它是最合适的名字。香农是二十世纪最聪明的人之一,我一方面是在读大学的时候见到了信息的定义的时候知道了香农,另一方面应该是在读《图灵传》的时候。这个概念挺匪夷所思的,熵定义为信息的期望值,信息的定义公式是,如果待分类的事务可能划分在多个分类之中,则符号Xi的信息定义为:


那我们来看下,如果集合只有1个元素,信息量为多少呢?当1个元素时,概率是100%,经计算,信息量为0。这就代表,当一件事情为确信的时候,信息定义是0。

如果一件事的概率有两种可能,每种可能是50%,如何计算呢?

log2(0.5)=-1,再取符号就是1,即每一项的信息定义为1。

我们对整个集合的信息量进行评估,就需要将每一项的信息量加到一起,即:


这个式子比之前面的,多了一个概率相乘,那么如刚才说的场景,即0.5*1+0.5*1=1。二分的场景,信息总量从0增加到了1。

想象一个极端的场景,即集合有无数多的可能,这个时候假设p(x)=1/(2^x)(这个时候,如果每个可能性都是差不多的,那实际n=2^x),x为一个接近无穷大的数,那么log2(p(x))就为-x,x*2^x/(2^x)=x,则得出当可能性足够多的时候,熵会大到一个接近无穷大的数(我们不去考虑无穷大的场景,因为这个场景下也许啥事都能发生,我的数学基础还不足以去考虑无穷的场景)。

因此,熵越大,代表的就是无序(即可能性太多),而反之则是有序。生命产生及维持的过程,就是一个局部区域的熵减过程,人要做到专注,进入心流状态,也是个减熵的过程。冥想也是……好吧,扯远了。

我们规划决策树,目的就是要从无序走向有序,并且找到能让熵减最大化的特征。在这里,可能会有点理解上的问题,因为我们刚才在讨论信息增益,但实际上这个增益,是用:

划分前的信息熵- 划分后的信息熵

划分前会更无序,所以这个值更大一些,而划分后会变的有序,从而这个值变的小一些。而这两者的差,其实越大就代表划分后的熵减越大。这个一定要注意。虽然我认为确实如此,但是还是动手检测了一下(用《机器学习实战》第三章的数据集和代码),打印截图如下:


数据集的定义为:

def createDataSet():

    dataSet = [[1, 1, 'yes'],

               [1, 1, 'yes'],

               [1, 0, 'no'],

               [0, 1, 'no'],

               [0, 1, 'no']]

    labels = ['no surfacing', 'flippers']

    #change to discrete values

    return dataSet, labels


如上代码太简单,就不解释了。

可见,在第一轮划分中,最初的香农熵为0.97,而两种不同的划分(以特征1和特征2;是否属于鱼类属于标签就不作为特征)后计算出的香农熵分别为0.42和0.17,都比原先的要小。而越小,信息增益就越大,所以一定要搞清楚这个关系。

下一篇,我们就来看看信息熵以及选出能够带来最大信息增益的特征的代码实现。

你可能感兴趣的:(11.决策树的划分基础:信息熵)