python实现ID3决策树算法

  

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决策树算法