ID3决策树是以信息增益作为决策标准的一种贪心决策树算法
# - * -编码:utf - 8 - * 从numpy进口* 导入数学 进口复制 进口cPickle泡菜 类ID3DTree(对象): def __init__(自我):#构造方法 自我。树={}#生成的树 自我。数据集=[]#数据集 自我。标签=[]#标签集 #数据导入函数 def loadDataSet(自我、路径、标签): recordList=[] fp=开放(路径,rb) #读取文件内容 内容=fp.read () fp.close () rowList=content.splitlines() #按行转换为一维表 recordList=[row.split (“\ t”)行rowList如果row.strip()] #带()函数删除空格,标签等 自我。数据集=recordList 自我。标签=标签 #执行决策树函数 def火车(自我): 标签=copy.deepcopy (self.labels) 自我。树=self.buildTree(自我。数据集、标签) #构件决策树:穿件决策树主程序 def buildTree(自我,数据集,标记): cateList=[数据在数据集的数据[1]]#抽取源数据集中的决策标签列 #程序终止条件1:如果班级名册只有一种决策标签,停止划分,返回这个决策标签 如果cateList.count (cateList [0])==len (cateList): 返回cateList [0] #程序终止条件2:如果数据集的第一个决策标签只有一个,返回这个标签 如果len(数据集[0])==1: 返回self.maxCate (cateList) #核心部分 bestFeat=self.getBestFeat(集)#返回数据集的最优特征轴 bestFeatLabel=标记(bestFeat) 树={bestFeatLabel: {}} 德尔(标记[bestFeat]) #抽取最优特征轴的列向量 uniqueVals=组([[bestFeat]数据在数据集)#去重 在uniqueVals值:#决策树递归生长 subLables=打[:]#将删除后的特征类别集建立子类别集 #按最优特征列和值分隔数据集 splitDataset=自我。splitDataSet(数据集、bestFeat价值) 子树=自我。buildTree (splitDataset subLables) #构建子树 树(bestFeatLabel][价值]=子树 回归树 #计算出现次数最多的类别标签 def maxCate(自我,cateList): 项=dict类型(((cateList.count(我),我)我在cateList)) 返回项目(max (items.keys ())) #计算最优特征 def getBestFeat(自我,数据集): #计算特征向量维,其中最后一列用于类别标签 numFeatures=len(数据集[0])——1 #特征向量维数=行向量维数1 baseEntropy=self.computeEntropy(集)#基础熵 bestInfoGain=0.0 #初始化最优的信息增益 bestFeature=1 #初始化最优的特征轴 #外循环:遍历数据集各列,计算最优特征轴 #我为数据集列索引:取值范围0 ~ (numFeatures-1) 因为我在xrange (numFeatures): uniqueVals=组([[我]数据在数据集)#去重 newEntropy=0.0 uniqueVals价值: subDataSet=自我。splitDataSet(数据集,我,值) 概率=len (subDataSet)/浮动(len(数据集) newEntropy +=概率* self.computeEntropy (subDataSet) infoGain=baseEntropy - newEntropy 如果(infoGain比;bestInfoGain): #信息增益大于0 bestInfoGain=infoGain #用当前信息增益值替代之前的最优增益值 bestFeature=我#重置最优特征为当前列 返回bestFeature #计算信息熵 # @staticmethod def computeEntropy(自我,数据集): dataLen=浮动(len(数据集) cateList=[数据在数据集的数据[1]]#从数据集中得到类别标签 #得到类别为关键,出现次数值的字典 项目=dict(((我,cateList.count(我)我在cateList)) infoEntropy=0.0 关键项目:#香农熵:=- p * log2 (p)——infoEntropy=概率*日志(问题2) 概率=(物品(例子))/dataLen浮动 infoEntropy -=概率*数学。日志(问题2) 返回infoEntropy #划分数据集:分割数据集;删除特征轴所在的数据列,返回剩余的数据集 #数据集:数据集;轴:特征轴;价值:特征轴的取值 def splitDataSet(自我、数据集、轴、价值): rtnList=[] featVec的数据集: 如果featVec(轴)==值: rFeatVec=featVec(轴):#列表操作:提取0 ~(1轴)的元素 rFeatVec。扩展(featVec[轴+ 1:]) rtnList.append (rFeatVec) 返回rtnList #存取树到文件 def storetree(自我、inputTree文件名): 弗兰克-威廉姆斯=open (filename ' w ') 泡菜。转储(inputTree,弗雷德里克) fw.close () #从文件抓取树 def grabTree(自我,文件名): fr=开放(文件名) 返回pickle.load (fr)python实现ID3决策树算法