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

文章原创,最近更新: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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 第 3 章 决策树 [TOC] 本章内容 决策树简介 在数据集中度量一致性 使用递归构造决策树 使用 Matplo...
    凉秋_不见春暖阅读 1,651评论 1 3
  • 文/黄小妞 最近在读《曾国潘家书》,被曾国潘的教子之道深受感染。 他在多封写给孩子的信中提到:“勤苦节俭,早晨早起...
    黄小妞儿阅读 1,129评论 0 4
  • 刘小超 出了景洪市,车程30分钟;经过一段蜿蜒曲折的山路,便来到了猴山上的傣王宫。这里是傣族文化的发...
    燕牛牛阅读 527评论 0 0
  • 去了凸透镜他咯楼……起来了
    28ebb773035e阅读 179评论 0 0
  • 尽管这世界有种种快乐,但我总觉得如果缺少了"书香"之乐,精神家园将会怎样的黯淡? 文字是一朵朵蓓...
    字花阅读 272评论 0 0