测试:使用已有决策树执行分类
构造决策树之后,将用于实际数据的分类。执行数据分类时需要使用决策树以及用于构造决策树的标签向量。代码如下:
'''
该函数的inputTree是已经生成的决策树,是字典集,featLabels是要测试的数据特征的列表,
testVec是与featLabels的特征列表中对应的特征值,注意位置需要对应。
输入形式如:classify(myTree,['no surfacing','flippers'],[1,0])
'''
def classify(inputTree,featLabels,testVec):
firstStr = list(inputTree.keys())[0]
#得到决策树根节点对应的值分支字典
secondDict = inputTree[firstStr]
#获取根节点对应特征名在特征列表中的索引值
featIndex = featLabels.index(firstStr)
#遍历特征值字典的键
for key in secondDict.keys():
if testVec[featIndex] == key:
#如果键对应的特征值是字典则递归下一层
if type(secondDict[key]).__name__ == 'dict':
classLabel = classify(secondDict[key],featLabels,testVec)
else:
classLabel = secondDict[key]
return classLabel
注释较为详细,不多介绍,值得注意的是需要获取根节点的特征在特征列表中的位置,然后在遍历过程中需要判断标签值列表中的项是否和特征的值是否相同,相同则继续判断是否继续递归。最后返回叶子节点的值。另外需要注意后两个列表参数的值对应关系。
决策树的存储
构造决策树很耗时,如果使用已经创建好的决策树多次解决分类问题则会节省很多时间。为此使用了pickle模块来进行存储。序列化对象可以在磁盘上保存对象,并在需要时读出来。任何对象都可以执行序列化操作,字典对象也不例外,关于该模块的具体信息参考pickle。
#使用pickle模块存储决策树
def storeTree(inputTree,filename):
import pickle
fw = open(filename,'wb')
pickle.dump(inputTree,fw)
fw.close()
def grapTree(filename):
import pickle
fr = open(filename,'rb')
return pickle.load(fr)
filename是要保存和读取的文件名,在调用函数时进行指定。此外注意读写方式均为二进制方式读写,否则无法写进。
使用决策树预测隐形眼镜模型
隐形眼镜数据集包含了很多患者眼部状况的观察条件以及医生的推荐眼镜类型。
#使用决策树预测隐形眼镜类型
def predictEyes(filename):
import treePlotter
fr = open(filename)
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age','prescript','astigmatic','tearRate']
lensesTree = createTree(lenses,lensesLabels)
print(lensesTree)
treePlotter.createPlot(lensesTree)
fr.close()
得到的结果如下: