构造决策树,面对一个数据集,首先找到具有决定性作用的特征,对每个特征进行评估,然后根据特征划分数据集。
如果分支下的数据属于同一类型,即停止,不属于同一类型,重复划分数据子集。
采用量化的方法判断如何划分数据
在划分数据集之前之后信息发生的变化称为信息增益,获得信息增益最高的特征就是最好的选择。
from math import log#math模块中的对数函数
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}#计算数据集中数据的个数,这里是5个
for featVec in dataSet:#通过循环,featVec=[1,1,'yes']
currentLabel = featVec[-1]#取出这一行的最后一个数,yes or no
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1#yes为2 no为3
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob,2)
return shannonEnt#计算香农熵
def createDataSet():
dataSet = [[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]
labels = ['no surfacing','flippers']
return dataSet,labels
主要是计算鱼类和非鱼类的香农熵
>>> import trees
>>> from imp import reload
>>> reload(trees)
<module 'trees' from 'E:/Python\\trees.py'>
>>> myDat,labels=trees.createDataSet()
>>> myDat
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> trees.calcShannonEnt(myDat)
0.9709505944546686
>>> myDat[0][-1]='maybe'
>>> myDat
[[1, 1, 'maybe'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> trees.calcShannonEnt(myDat)
1.3709505944546687
>>>