Python3:《机器学习实战》之决策树算法(3)预测隐形眼镜类型
前言:
本博文先介绍在实际应用中如何存储分类器,然后在实际数据上使用决策树分类算法,验证它是否可以正确预测出患者应该使用的隐形眼镜类型。
测试和存储算法
测试算法:使用决策树执行分类
在执行数据分类时,需要使用决策树以及用于构造决策树的标签向量。然后,程序比较测试数据与决策树上的数值,递归执行该过程知道进入叶子结点;最后将测试数据定义为叶子节点所属的类型。
代码实现:
def classify(inputTree, featLabels, testVec):
"""
Function: 使用决策树的分类函数
Args: inputTree:树信息
featLabels:标签列表
testVec:测试数据
Returns: classLabel:分类标签
"""
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
输出结果:
>>> reload(trees)
<module 'trees' from 'E:\\机器学习实战\\mycode\\Ch03\\trees.py'>
>>> myDat, labels = trees.createDataSet()
>>> labels
['no surfacing', 'flippers']
>>> myTree = treePlotter.retrieveTree(0)
>>> myTree
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
>>> trees.classify(myTree, labels, [1,0])
'no'
>>> trees.classify(myTree, labels, [1,1])
'yes'
使用算法:决策树的存储
构造决策树是很耗时的任务,及时处理很小的数据集。如果使用创建好的决策树解决分类问题,则可以很快完成。因此,为了节省计算时间,我们使用Python模块pickle序列化对象,以便在硬盘上保存和读取字典。
代码实现::
def storeTree(inputTree, filename):
"""
Function: 存储决策树
Args: inputTree:树信息
filename:文件名称
Returns: 无
"""
import pickle
fw = open(filename, 'wb')
pickle.dump(inputTree, fw)
fw.close()
def grabTree(filename):
"""
Function: 读取决策树
Args: filename:文件名称
Returns: pickle.load(fr):树信息
"""
import pickle
fr = open(filename, 'rb')
return pickle.load(fr)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
输出结果:
>>> reload(trees)
>>> trees.storeTree(myTree, 'classifierStorage.txt')
>>> trees.grabTree('classifierStorage.txt')
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
通过上面的代码,我们可以将分类器存储在硬盘上,而不用每次对数据分类时重新学习一遍,这也是决策树的优点之一,而k-近邻算法却无法持久化分类器。
使用决策树预测隐形眼镜类型:
示例:使用决策树预测隐形眼镜类型:
- 收集数据:提供的文本文件。
- 准备数据:解析tab键分割的数据行。
- 分析数据:快速检查数据,确保正确地解析数据内容,使用createPlot()函数绘制最终的树形图。
- 训练算法:使用前面编写好的createTree()函数。
- 测试算法:编写测试函数验证决策树科一正确分类给定的数据实例。
- 使用算法:存储树的数据结构,以便下次使用时无需重新构造树。
隐形眼镜数据集是非常著名的数据集,它包含很多患者眼部状况的观察条件以及医生推荐的隐形眼镜类型,数据来源于UCI数据库,为了更容易显示数据,书中对数据做了简单的更改,即lenses.txt文件。
>>> fr = open('lenses.txt')
>>> lenses = [inst.strip().split('\t') for inst in fr.readlines()]
>>> lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']
>>> import trees
>>> lensesTree = trees.createTree(lenses, lensesLabels)
>>> lensesTree
{'tearRate': {'reduced': 'no lenses', 'normal': {'astigmatic': {'yes': {'prescript': {'myope': 'hard', 'hyper': {'age': {'pre': 'no lenses', 'young': 'hard', 'presbyopic': 'no lenses'}}}}, 'no': {'age': {'pre': 'soft', 'young': 'soft', 'presbyopic': {'prescript': {'myope': 'no lenses', 'hyper': 'soft'}}}}}}}}
>>> import treePlotter
>>> treePlotter.createPlot(lensesTree)
本渣渣将上述代码包装成函数,方便大家直接调用。
代码实现:
"""
Created on Aug 31, 2017
Test on the modules
@author: wordzzzz
"""
import trees
import treePlotter
def main():
"""
Function: 主函数
Args: 无
Returns: 无
"""
fr = open('lenses.txt')
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']
lensesTree = trees.createTree(lenses, lensesLabels)
print(lensesTree)
treePlotter.createPlot(lensesTree)
if __name__ == "__main__":
main()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
输出结果:
E:\机器学习实战\mycode\Ch03>python3 test.py
{'tearRate': {'reduced': 'no lenses', 'normal': {'astigmatic': {'no': {'age': {'presbyopic': {'prescript': {'myope': 'no lenses', 'hyper': 'soft'}}, 'young': 'soft', 'pre': 'soft'}}, 'yes': {'prescript': {'myope': 'hard', 'hyper': {'age': {'presbyopic': 'no lenses', 'young': 'hard', 'pre': 'no lenses'}}}}}}}}
隐形眼睛的例子表明决策树可能会产生过多的数据集划分,从而产生过度匹配数据集的问题。我们可以通过裁剪决策树,合并相邻的无法产生大量信息增益的叶节点,消除过度匹配问题。淡然还有很多决策树构造算法,最流行的是C4.5和CART。
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz