(转载请注明出处:http://blog.csdn.net/buptgshengod)
1.背景
接着上一节说,没看到请先看一下上一节关于数据集的划分数据集划分。现在我们得到了每个特征值得信息熵增益,我们按照信息熵增益的从大到校的顺序,安排排列为二叉树的节点。数据集和二叉树的图见下。
(二叉树的图是用python的matplotlib库画出来的)
数据集:
决策树:
2.代码实现部分
因为上一节,我们通过
chooseBestFeatureToSplit函数已经可以确定当前数据集中的信息熵最大的那个特征值。我们将最大的那个作为决策树的父节点,这样递归下去就可以了。
主要函数:详见注释
def createTree(dataSet,labels): #把所有目标指数放在这个list里 classList = [example[-1] for example in dataSet] #下面两个if是递归停止条件,分别是list中都是相同的指标或者指标就剩一个。 if classList.count(classList[0]) == len(classList): return classList[0] if len(dataSet[0]) == 1: return majorityCnt(classList) #获得信息熵增益最大的特征值 bestFeat = chooseBestFeatureToSplit(dataSet) bestFeatLabel = labels[bestFeat] #将决策树存在字典中 myTree = {bestFeatLabel:{}} #labels删除当前使用完的特征值的label del(labels[bestFeat]) featValues = [example[bestFeat] for example in dataSet] uniqueVals = set(featValues) #递归输出决策树 for value in uniqueVals: subLabels = labels[:] #copy all of labels, so trees don't mess up existing labels myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) return myTree
打印出来的决策树: {'throat': {0: {'mustache': {0: 'women', 1: 'man'}}, 1: 'man'}}
下面就是如何是用建立好的决策树。我们建立函数
inputTree:是输入的决策树对象 featLabels:是我们要预测的特征值得label,如:['throat','mustache'] testVec:是要预测的特征值向量,如[0,0] def classify(inputTree,featLabels,testVec): #存储决策树第一个节点 firstStr = inputTree.keys()[0] #将第一个节点的值存到secondDict字典中 secondDict = inputTree[firstStr] #建立索引,知道对应到第几种特征值 featIndex = featLabels.index(firstStr) key = testVec[featIndex] valueOfFeat = secondDict[key] #对比,判断当前的键值是否是一个dict类型,如果是就递归,不是就输出当前键值为结果 if isinstance(valueOfFeat, dict): classLabel = classify(valueOfFeat, featLabels, testVec) else: classLabel = valueOfFeat return classLabel
测验:当我们输入 classify(mtree,[ 'throat' , 'mustache' ],[ 0 , 0 ])时,显示结果是women,表明没有喉结和胡子是女人。