当拆分完全分类时,计算ID3算法中属性的熵

时间:2016-09-29 20:39:31

标签: python machine-learning decision-tree

我最近一直在阅读关于ID3算法的文章,并且它说要选择用于分割的最佳属性应该导致最大的信息增益,这可以借助于熵来计算。

我编写了一个简单的python程序来计算熵。如下所示:

def _E(p, n):
    x = (p/(p+n))
    y = (n/(p+n))
    return(-1* (x*math.log2(x)) -1* (y*math.log2(y)))

但是假设我们有一个由10个元素组成的表,如下所示:

x = [1,0,1,0,0,0,0,0,0,0]

y = [1,1,1,0,1,0,1,0,1,0]

其中x是属性,y是类。这里P(0)= 0.8,P(1)= 0.2。熵如下:

熵(x)= 0.8 * _E(5,3)+ 0.2 * _E(2,0)

然而,第二个分裂P(1)被完全分类,这导致数学错误,因为log2(0)是负无穷大。在这种情况下如何计算熵?

2 个答案:

答案 0 :(得分:2)

熵是杂质的量度。因此,如果节点是纯的,则意味着熵为零。

查看this -

def information_gain(data, column, cut_point):
    """
    For calculating the goodness of a split. The difference of the entropy of parent and 
    the weighted entropy of children.
    :params:attribute_index, labels of the node t as `labels` and cut point as `cut_point`
    :returns: The net entropy of partition 
    """
    subset1, subset2 = divide_data(data, column, cut_point) 
    lensub1, lensub2 = len(subset1), len(subset2)  
    #if the node is pure return 0 entropy
    if len(subset1) == 0 or len(subset2) == 0:
        return (0, subset1, subset2)     
    weighted_ent = (len(subset1)*entropy(subset1) + len(subset2)*entropy(subset2)) / len(data)  
    return ((entropy(data) - weighted_ent), subset1, subset2)

答案 1 :(得分:1)

分裂的熵测量与该分裂中的类别标签相关的不确定性。在二元分类问题(classes = {0,1})中,第1类(在您的文本中为x)的概率范围为0到1.当x = 0.5时,熵最大(值为1)。这两个类都是同样可能的。当其中一个类不存在时,熵最小,即x = 0或x = 1。这里,关于类没有不确定性,因此熵是0。



熵图(y轴)与x(x轴):

Graph of entropy (y-axis) vs x (x-axis)



以下计算显示了当x = 0时(x = 1的情况类似),如何以数学方式处理熵计算:

enter image description here


在您的程序中,您可以将x = 0和x = 1视为特殊情况,并返回0.对于x的其他值,可以直接使用上述等式。