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

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

作者: 努力奋斗的durian | 来源:发表于2018-08-19 23:03 被阅读125次

    文章原创,最近更新: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
    

    相关文章

      网友评论

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

      本文链接:https://www.haomeiwen.com/subject/qowfiftx.html