文章原创,最近更新:2018-08-19
本章节的主要内容是:
重点介绍项目案例1:判定鱼类和非鱼类测试算法:测试和存储分类器的代码
。
1.决策树项目案例介绍:
项目案例1:
判定鱼类和非鱼类
项目概述:
- 根据以下 2 个特征,将动物分成两类:鱼类和非鱼类。
- 特征: 1. 不浮出水面是否可以生存 2. 是否有脚蹼
开发流程:
- 收集数据:可以使用任何方法
- 准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化
- 分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期
- 训练算法:构造树的数据结构
- 测试算法:使用决策树执行分类
- 使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义
数据集介绍
2.测试算法:使用决策树执行分类代码
依靠训练数据构造了决策树之后,我们可以将它用于实际数据的分类。在执行数据分类时,需要决策树以及用于决策树的标签向量。然后,程序比较测试数据与决策树上的数值,递归执行该过程直到进入叶子结点;最后将测试数据定义为叶子结点所属的类型。
使用决策树分类的函数:
def classify(inputTree, featLabels, testVec):
# 因为并不知道按特征分类的先后顺序,所以要写一个分类器
"""classify(给输入的节点,进行分类)
Args:
inputTree 是输入的决策树对象
featLabels Feature是我们要预测的特征值的label,如:['throat','mustache']
testVec 是要预测的特征值向量,如[0,0]
Returns:
classLabel 分类的结果值,需要映射label才能知道名称
"""
# 存储决策树第一个节点
firstStr=list(inputTree.keys())[0]
"""
myTree={'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
labels=['no surfacing', 'flippers']
print(firstStr)的结果为:
'no surfacing'
"""
# 将第一个节点的值存到secondDict字典中
secondDict = inputTree[firstStr]
"""
print(secondDict)的结果为:
{0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}
"""
# 判断根节点名称获取根节点在label中的先后顺序,这样就知道输入的testVec怎么开始对照树来做分类
featIndex = featLabels.index(firstStr)
"""
print(featIndex)的结果为:
0
"""
for key in secondDict.keys():
"""
print(secondDict.keys())的结果为:
dict_keys([0, 1])
"""
if testVec[featIndex]==key:
# 判断分枝是否结束:判断secondDict[key]是否是dict类型,如果是就递归,不是就输出当前键值为结果
if type(secondDict[key]).__name__ == 'dict':
classLabel = classify(secondDict[key], featLabels, testVec)
else:
classLabel = secondDict[key]
return classLabel
测试代码以及结果如下:
import trees
myDat, labels = trees.createDataSet()
myTree = trees.createTree(myDat, labels[:])
Out[35]: trees.classify(myTree, labels, [1, 0])
'no'
Out[36]: trees.classify(myTree, labels, [1, 1])
'yes'
3.使用算法:决策树的存储
可以使用Python模块pickle序列化对象,参见下面的程序。序列化对象可以在磁盘上保存对象,并在需要的时候读取出来。
def storeTree(inputTree,filename):
import pickle
# wb二进制写模式
fw = open(filename,"wb")
pickle.dump(inputTree,fw)
fw.close()
def grabTree(filename):
import pickle
# rb二进制文件读取
fr=open(filename,"rb")
return pickle.load(fr)
测试代码及其结果如下:
import trees
myDat, labels = trees.createDataSet()
myTree = trees.createTree(myDat, labels[:])
storeTree(myTree,'classifierStorage.txt')
grabTree('classifierStorage.txt')
Out[51]: {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
4.相关知识点
知识点1:dict.keys()
具体语法如下:
dict.keys()
- 参数:NA。
- 返回值:返回一个字典所有的键。
具体案例如下:
dict = {'Name': 'Zara', 'Age': 7}
dict.keys()
Out[20]: dict_keys(['Name', 'Age'])
知识点2:_name_
_name_:表示模块,类等的名字;
知识点3:pickle
学习参考链接:pickle 保存数据
pickle 保存
pickle 是一个 python 中, 压缩/保存/提取 文件的模块. 最一般的使用方式非常简单. 比如下面就是压缩并保存一个字典的方式. 字典和列表都是能被保存的.
import pickle
a_dict = {'da': 111, 2: [23,1,4], '23': {1:2,'d':'sad'}}
# pickle a variable to a file
file = open('pickle_example.pickle', 'wb')
pickle.dump(a_dict, file)
file.close()
wb 是以写的形式打开 ‘pickle_example.pickle’ 这个文件, 然后 pickle.dump 你要保存的东西去这个打开的 file. 最后关闭 file 你就会发现你的文件目录里多了一个 ‘pickle_example.pickle’ 文件, 这就是那个字典了.
pickle 提取
提取的时候相对简单点, 同样我们以读的形式打开那个文件, 然后 load 进一个 python 的变量.
# reload a file to a variable
with open('pickle_example.pickle', 'rb') as file:
a_dict1 =pickle.load(file)
print(a_dict1)
知识点4:list.index(obj)
学习参考链接:list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
index()方法语法:
list.index(obj)
- 参数:obj -- 查找的对象。
- 返回值:该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。
具体小案例如下:
aList = [123, 'xyz', 'zara', 'abc']
aList.index('xyz')
Out[53]: 1
aList.index(123)
Out[54]: 0
网友评论