昨天完成了信息熵的计算,今天继续完成决策树的学习
在决策树中,很重要的一点就是将数据分类成几块。
而分类需要考虑从物体特征的哪一点去分类,决定分类的特征称为特征值。
比如一个物体有6种属性,按6种属性可基础的拥有6种分类方法,但按照各分类方法实现的分类结果的好坏是不一样的。
信息熵就提供给我们一种很好地判断分类决策是否正确的判断依据。
即决策树的每一次分类,都希望能得到最规整的信息分类结果,即最小的信息熵。
实现代码如下,接昨天的代码:
def splitDataSet(dataSet, axis, value): #axis为选定的特征值,按照此特征值的区分进行分类,value为判断对应特征值的值
retDataSet = [] #创建了一个空列表用于保存筛选出的数据
for featVec in dataSet:#对每个对象进行循环
if featVec[axis] == value:#命中对象
reducedFeatVec = featVec[:axis]#提取特征值前的数据
reducedFeatVec.extend(featVec[axis+1:])#与特征值后的数据合并,与上句共同实现了剔除特征值
retDataSet.append(reducedFeatVec)#加入用于存放筛选出来的数值的空列表
return retDataSet
#至此完成对数据的划分
def chooseBestFeatureToSpit(dataSet):
numFeatures = len(dataSet[0]) - 1 #最后一个值为分类标签,故可取到n-1个特征值
baseEntropy = calcshannonEnt(dataSet)#计算基础信息熵
bestInfoGain = 0.0; bestFeature = -1
for i in range(numFeatures): #对每一个特征值进行循环
featList = [example[i] for example in dataSet] #提取该特征值取到的值
uniqueVals = set(featList) #去除重复值
newEntropy = 0.0 #规定初始的信息熵为0
for value in uniqueVals: #对特征值的每一个非重复值进行循环,得到分类结果,并计算信息熵
subDataSet = splitDataSet(dataSet, i, value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * calcshannonEnt(subDataSet) #计算信息熵:对不同划分类别的信息熵进行加权平局,权重为改组数据占总数据的比例
infoGain = baseEntropy - newEntropy #计算信息熵的变小情况,说明数据由混乱变为规整
if (infoGain > bestInfoGain): #提取最小的信息熵
bestInfoGain = infoGain
bestFeature = i
return bestFeature #返回最优特征值
#至此完成选择出最优的划分决策
决策树的一个分支的构成至此已经结束
接下来会学习整个树的构建过程。