机器学习实战

3-6节 决策树|测试和存储分类器|机器学习实战-学习笔记

2018-08-19  本文已影响125人  努力奋斗的durian

文章原创,最近更新:2018-08-19

本章节的主要内容是:
重点介绍项目案例1:判定鱼类和非鱼类测试算法:测试和存储分类器的代码

1.决策树项目案例介绍:

项目案例1:

判定鱼类和非鱼类

项目概述:
开发流程:
数据集介绍

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()

具体案例如下:

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)

具体小案例如下:

aList = [123, 'xyz', 'zara', 'abc']

aList.index('xyz')
Out[53]: 1

aList.index(123)
Out[54]: 0
上一篇 下一篇

猜你喜欢

热点阅读