《机器学习实战》系列博客主要是实现并理解书中的代码,相当于读书笔记了。毕竟实战不能光看书。动手就能遇到许多奇奇怪怪的问题。博文比较粗糙,需结合书本。博主边查边学,水平有限,有问题的地方评论区请多指教。书中的代码和数据,网上有很多请自行下载。
3.3.1测试算法:使用决策树执行分类
3.1讲述了如何构造决策树,我们可以将它用于实际的数据分类。
使用决策树的分类函数
def classify (inputTree,featLabels,testVec):
firstStr = 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]
函数index
labels = ['a','b','c','d','e'];
featIndex = labels.index('e')
print featIndex
4
[Finished in 0.4s]
测试
>>> reload(trees)
<module 'trees' from 'trees.py'>
>>> trees.classify(myTree,labels,[1,1])
'yes'
>>> trees.classify(myTree,labels,[1,0])
'no'
>>>
3.3.2 使用算法:决策树的存储
使用python 模块pickle 序列化对象,序列化对象可以在磁盘上保存对象,在需要的时候读取出来。
def storeTree(inputTree,filename):
import pickle
fw = open(filename,'w')
pickle.dump(inputTree,fw)
def grabTree(filename):
import pickle
fr = open(filename)
return pickle.load(fr)
>>> import trees
>>> myDat ,labels = trees.createDataSet()
>>> myTree = trees.createTree(myDat, labels)
>>> myTree
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
>>> trees.storeTree(myTree , 'classifierStorage.txt')
>>> trees.grabTree('classifierStorage.txt')
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
>>>
3.3.3 示例:使用决策树预测隐形眼镜类型
>>> import treePlotter
>>> import trees
>>> fr = open('lenses.txt')
>>> lenses = [inst.strip().split('\t') for inst in fr.readlines()]
>>> lensesLabels = ['age','prescript','astigmatic','tearRate']
>>> lensesTree = trees.createTree(lenses,lensesLabels)
>>> lensesTree
{'tearRate': {'reduced': 'no lenses', 'normal': {'astigmatic': {'yes': {'prescript': {'hyper': {'age': {'pre': 'no lenses', 'presbyopic': 'no lenses', 'young': 'hard'}}, 'myope': 'hard'}}, 'no': {'age': {'pre': 'soft', 'presbyopic': {'prescript': {'hyper': 'soft', 'myope': 'no lenses'}}, 'young': 'soft'}}}}}}
>>> treePlotter.createPlot(lensesTree)
lenses = [inst.strip().split(‘\t’) for inst in fr.readlines()]
解析tab 键分隔的数据行