工具:PythonCharm 书中的代码是python2的,而我用的python3.5,结合实践过程,这里会标注实践时遇到的问题和针对python3的修改。
实践代码和训练测试数据可以参考这里
https://github.com/stonycat/ML-in-Action
(原书作者也提供了源码,但是存在一些问题,且在python3中有部分修改)
【决策树算法 ID3】
首先附上修改后的源代码:
注释:如果你使用的是python3.6 函数getNumLeafs报错: ‘list’ object has no attribute ‘keys’
请移步参考:https://github.com/stonycat/ML-in-Action-Code-and-Note/issues/1
#coding=utf-8
import operator
import matplotlib.pyplot as plt
#绘制属性图
decisionNode = dict(boxstyle="sawtooth", fc="0.8")
leafNode = dict(boxstyle="round4", fc="0.8")
arrow_args = dict(arrowstyle="<-")
#构造注解树 在python字典形式中如何存储树
def getNumLeafs(myTree):
numLeafs=0 #初始化结点数
# 下面三行为代码 python3 替换注释的两行代码
firstSides = list(myTree.keys())
firstStr = firstSides[0] # 找到输入的第一个元素,第一个关键词为划分数据集类别的标签
secondDict = myTree[firstStr]
#firstStr = list(myTree)
#secondDict=myTree[firstStr]
for key in secondDict.keys(): #测试数据是否为字典形式
if type(secondDict[key]).__name__=='dict': #type判断子结点是否为字典类型
numLeafs+=getNumLeafs(secondDict[key])
#若子节点也为字典,则也是判断结点,需要递归获取num
else: numLeafs+=