博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机器学习实战之决策树二
阅读量:4054 次
发布时间:2019-05-25

本文共 1816 字,大约阅读时间需要 6 分钟。

在上一篇博文中,我写了如何依靠训练数据构造决策树,这一节让我们来验证一下算法的实际效果,本节所有代码与上一篇博文代码均在chosetree.py文件中

测试算法:使用决策树进行分类

 

#首先声明下,这里的inputTree,就是上节中的mytree,mytree={'no sufacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

def classify(inputTree,featLabels,testVec):    firstStr = inputTree.keys()[0]    #获得树的根节点'no sufacing'    secondDict = inputTree[firstStr]  #获得key='no sufacing'的value,value={0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}    featIndex = featLabels.index(firstStr) #获得'no sufacing'在labels中的位置    for key in secondDict.keys():        if testVec[featIndex] == key: #判断需要验证的testVec是否等于secondDict的键值集            if type(secondDict[key]).__name__=='dict': #当value为字典时,在递归函数判断验证列表的第二个属性                classLabel = classify(secondDict[key],featLabels,testVec)            else:                classLabel = secondDict[key]    return classLabel

classify函数事实上是一个递归函数。测试函数最需要解决的一个问题是:如何判断特征在数据集中的位置,例如mytree中第一个用于划分数据集的特征是‘no sufacing'属性,但是在实际数据集中该属性存储在什么位置呢?函数前三行代码可以帮助我们解决这个问题,其中使用index方法查找位置是一个好方法。然后代码递归遍历整棵树,比较testVec变量中的值与树节点的值,如果到达叶子节点,则返回当前节点的分类标签。现在让我们来测试一下代码是否正确?

>>> import chosetree as ct>>> dataset,label = ct.createDataSet()>>> mytree = ct.createTree(dataset,label)>>> mytree{'no sufacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}>>> classlabel = ct.classify(mytree,label,[1,0])>>> classlabel'no'>>> ct.classify(mytree,label,[1,1])'yes'
现在我们已经创建了决策树的分类器,我们发现每次使用时都需要重新构造决策树,这会耗费很多的计算时间。为了节省时间我们最好能够在每次执行分类时调用已经构造好的决策树。为了解决这个问题,需要使用python模块的pickle序列化对象。

使用算法:决策树的存储

def storeTree(inputTree,filename):    import pickle    fw = open(filename,'w')    pickle.dump(inputTree,fw)    fw.close()def grabTree(filename):    import pickle    fr = open(filename)    return pickle.load(fr)
验证:

>>> ct.storeTree(mytree,'mytree.txt')>>> ct.grabTree('mytree.txt'){'no sufacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

转载地址:http://xwhci.baihongyu.com/

你可能感兴趣的文章
Reverse Linked List
查看>>
Android面试题整理【转载】
查看>>
【opencv学习笔记】010之图像非线性滤波原理与操作(中值滤波、双边滤波)
查看>>
【opencv学习笔记】011之基本形态学操作(膨胀与腐蚀)
查看>>
【CryptoZombies - 1 Solidity 教程】010 msg.sender
查看>>
【opencv学习笔记】012之形态学操作(开闭操作,形态学梯度,顶帽与黑帽)
查看>>
【CryptoZombies - 1 Solidity 教程】011 Require
查看>>
【CryptoZombies - 1 Solidity 教程】012 继承(Inheritance)和 引用 (import)
查看>>
【CryptoZombies - 1 Solidity 教程】013 永久存储变量(storage)和 临时存储变量(memory)
查看>>
【opencv学习笔记】013之形态学操作应用(trackbar应用)
查看>>
【CryptoZombies - 1 Solidity 教程】014 函数可见性
查看>>
【CryptoZombies - 1 Solidity 教程】015 接口interface
查看>>
【opencv学习笔记】014之上采样与降采样
查看>>
【opencv学习笔记】015之基本阈值操作
查看>>
【CryptoZombies - 1 Solidity 教程】016 函数多返回值&奖励实战
查看>>
【CryptoZombies - 2 Solidity 进阶】001 智能合约的不可篡改性与Ownable
查看>>
【积跬步以至千里】App Crashed - WriteMiniDump
查看>>
我努力是因为, 我想通过自己,带给这个世界点什么!
查看>>
数据结构基础笔记、基础知识总结、周周练汇总,通过代码,更快速掌握数据结构和算法知识!
查看>>
赛前必看!!NOIP竞赛及CSP认证初赛赛前辅导详细视频教程!!!
查看>>