决策树的理解可以类比最近较火的综艺游戏,游戏规则如下:裁判确定一个关键词,选手可以向裁判提问15个问题,而裁判仅能回答是与不是,最终选手获得关键词。
通常采用递归的方式构造决策树,主要流程如下:
1.递归停止条件1:选取特征使得数据的特征相同时标签也与之严格一致,例如特征=【能飞,不能飞】,标签=【是猪1,非猪0】,能飞特征对应的一定是非猪;
2.但满足标签1的还有其他特征,在上次特征划分后的数据上在此判断递归停止条件1,例如特征2=【能潜水,不能潜水】,在不能飞的特征下,选择特征2继续划分;
3.依次类推,直至递归终止条件2:所有特征使用完全
编程实现如下:
def createTree(dataSet,labels):
# 训练数据:dataSet
# 标签数据:labels
classList = [example[-1] for example in dataSet]
if classList.count(classList[0]) == len(classList): # 中止条件2:所有特征均使用
return classList[0]
if len(dataSet[0]) == 1:
return majorityCnt(classList)
bestFeat = chooseBestFeatureToSplit(dataSet) # 选取当前待分数据的最优分类特征函数
bestFeatLabel = labels[bestFeat]
myTree = {bestFeatLabel:{}}
del(labels[bestFeat]) # 每次划分后去除无分支的树节点数据
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
for value in uniqueVals:
subLabels = labels[:]
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
return myTree
采用决策树来执行分类任务,代码如下:
def classify(inputTree,featLabels,testVec):
# inputTree:输入树数据
# featLabels:特征
# testVec:测试数据特征值向量
firstStr = list(inputTree.keys())[0]
secondDict = inputTree[firstStr]
featIndex = featLabels.index(firstStr)
key = testVec[featIndex]
valueOfFeat = secondDict[key]
if isinstance(valueOfFeat, dict):
classLabel = classify(valueOfFeat, featLabels, testVec) # 递归沿树分类
else: classLabel = valueOfFeat
return classLabel
应用举例:
问题描述--医生根据患者是否老年,是否高度近视,是否眼部过敏等一系列特征判断患者适合佩戴软材质眼镜、硬材质眼镜以及不建议佩戴眼镜
样本数据--患者对应上述各特征的值
样本标签--软材质1,硬材质2,不建议佩戴3
eg,【患者1】 (老年)1,(高度近视)0,(眼部过敏)0,……,(不建议佩戴)3
新给出患者的特征,预测适合怎样的隐形眼镜佩戴