一、前言
本节我们将使用决策树构建分类器,并将其应用到隐形眼镜类型预测的实际问题中,最后研究分类分类器的存储问题。
二、使用决策树执行分类
'''
函数说明:构造使用决策树的分类函数
参数:inputTree -- 输入的决策树
featLabels -- 数据集属性
testVec -- 需要预测类别的节点
返回值:预测节点的类别
'''
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
dataSet,labels = createDataSet()
# print(classify(mytree,labels,[1,1]))
预测结果为:
现在我们已经根据决策树构造出了分类器,但每次使用分类器时,必须重新构造决策树,因此,我们考虑将决策树分类器存储起来。
三、决策树的存储
'''
函数说明:决策树分类器的存储
参数:inputTree -- 决策树
filename -- 文件名
返回值:无
'''
#决策树的存储
#写
def storeTree(inputTree,filename):
import pickle
fw = open(filename,'wb') #b代表二进制形式,因为pickl要求二进制形式
pickle.dump(inputTree,fw)
fw.close()
#读
def grabTree(filename):
import pickle
fr = open(filename,'rb') #以二进制形式存,故以二进制形式取
return pickle.load(fr)
# storeTree(mytree,'classifierStorage.txt')
# print(grabTree('classifierStorage.txt'))
决策树的存储:
决策树的读取:
四、决策树实战之隐形眼镜类型预测
本节我们将根据一个例子讲解决策树如何预测患者应该佩戴的隐形眼镜类型。
首先我们先加载数据集 lenses.txt
# 加载隐形眼镜数据集,并将其序列化,最后生成决策树
fr = open('D:/py_work/data/chapter3-tree/lenses.txt')
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
# 年龄、症状、是否散光、眼泪数量四个属性
lensesLabels = ['age','prescript','astigmatic','tearRate','type']
# 根据隐形眼镜的数据集和属性标签构造决策树
lensesTree = createTree(lenses,lensesLabels)
print(lensesTree)
执行结果:
五、结语
决策树分类器就像带有终止块的流程图,终止块就代表分类结果。对于待处理数据,我们首先需要测量集合中数据的不一致性,即熵;然后再根据每个属性对数据集进行划分并计算划分后的数据集的熵,得到使得数据集信息增益最大的划分属性;根据步骤二得到决策树字典;最后使用 matlibplot 的注解功能,将决策树字典转换为容易理解的树形图。