1、信息增益
划分数据集的大原则是:将无序的数据变得更加有序。在划分数据集前后信息发生的变化称为信息增益,获得信息增益最高的特征就是最好的选择。集合信息的度量方式称为香农熵或者简称为熵。
我们采用Python计算信息熵,创建名为trees.py的文件,此代码的功能是计算给定数据集的熵(D)。
from math import log
def calcShannonEnt(dataSet): #定义计算香农熵的函数
numEntries = len(dataSet) #计算数据集实例的总数
labelCounts = {} #创建一个字典,它的键值为最后一列的数值,即可能的分类
for featVec in dataSet:
currentLabel = featVec[-1] #获取分类
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] +=1 #将分类添加至values中并计算每个分类的个数
shannonEnt = 0.0
for key in labelCounts: #计算香农熵
prob = float(labelCounts[key])/numEntries
shannonEnt -=prob * log(prob,2)
return shannonEnt
以上程序的第一步①引入log函数用于计算
第二步定义计算熵的函数calcShannonEnt,其可对list数据集进行自动计算。
第三步我们首先计算实例总数D,通过len(dataSet)可以获取,注意len()函数能用于list而不能用于数组
第四步我们统计分类数k和每个分类的实例个数Ck,通过建立字典labelCounts,存储类别(key)和数目(values)。我们取最后一列的数据为label,通过for循环获取每一个list子集的类别数,然后通过dictionary[keys]来存储数目,如有此类别则加1,如没有则建立此类别,默认value为0.
第五步我们计算ShannonEnt。首先定义ShannonEnt为0,然后对每一个分类数计算熵,再相加得到最终的熵。