Python3.0 实现决策树算法的流程
决策树的一般流程
检测数据集中的每个子项是否属于同一个分类
ifsoreturn类标签 Else
寻找划分数据集的最好特征
划分数据集
创建分支节点
frommathimportlog importoperator #生成样本数据集 defcreateDataSet(): dataSet=[[1,1,'yes'], [1,1,'yes'], [1,0,'no'], [0,1,'no'], [0,1,'no']] labels=['nosurfacing','flipper'] returndataSet,labels #计算香农熵香农大神必须要膜拜啊,信息界的根目录人物啊 #nosurfacing指的是不浮出水面能否生存1标识是0指的是否 #flipper指的是是否有脚 #yesno指的是否是鱼类 defcalcShannonEnt(dataSet): numEntries=len(dataSet)#用上面的createDataSetdataSet这个值就是5 #定义标签字典 labelCounts={} #为所有可能的分类创建字典 forfeatVecindataSet: currentLabel=featVec[-1]#这个-1指的是去取最后一个维度对应数据dataSet这里取的是yes和no ifcurrentLabelnotinlabelCounts.keys(): #如果当前分类标签不在标签字典中 labelCounts[currentLabel]=0 #其他情况分类标签分类加1 labelCounts[currentLabel]+=1 #定义香农熵以2为底数求对数 shannonEnt=0.0 forkeyinlabelCounts: #计算yes或者No出现的概率 pro=float(labelCounts[key])/numEntries #计算香农熵 shannonEnt-=pro*log(pro,2) returnshannonEnt #dataSet是待划分的数据集,划分数据集的特征axis特征的返回值value #最后是创建了一个新的列表对象 defsplitDataSet(dataSet,axis,value): #创建新list对象 retDataSet=[] forfeatVecindataSet: iffeatVec[axis]==value: reducedFeatVec=featVec[:axis] reducedFeatVec.extend(featVec[axis+1:]) retDataSet.append(reducedFeatVec) returnretDataSet #选择最好的特征值进行数据集划分 defchooseBestFeatureToSplit(dataSet): #len(dataSet[0])是计算这一行有多少列,即有多少个特征值 numFeatures=len(dataSet[0])-1#-1是最后一个特征值就不要记录在内了,算baseEntrop的时候已经算了最后一个特征值yesno baseEntropy=calcShannonEnt(dataSet) bestInfoGain=0.0 bestFeature=-1 foriinrange(numFeatures): #创建唯一的分类标签列表也就是说提取dataSet每一行第i个值就提取dat featList=[example[i]forexampleindataSet] #取出有几种特征值 uniqueVals=set(featList) newEntropy=0.0 forvalueinuniqueVals: #创建特征值的子数据集 subDataSet=splitDataSet(dataSet,i,value) #计算该特征值数据对总数在数据对总数出现的概率 pro=len(subDataSet)/float(len(dataSet)) #计算分割出来的子集香农熵 newEntropy+=pro*calcShannonEnt(subDataSet) #计算信息增益得到最好的特征值这个理论是这样的g(D,A)=H(D)-H(D/A) infoGain=baseEntropy-newEntropy #取出最大的信息增益,此时特征值最大 if(infoGain>bestInfoGain): bestInfoGain=infoGain bestFeature=i returnbestFeature ''' #构建决策树是根据特征值的消耗来计算的,如果后面的特征值已经全部用完了 但是还没有分出结果,这个时候就需要使用多数表决方式计算节点分类 最后返回最大的分类 ''' defmajorityCnt(classList): #分类的字典 classCount={} forvoteinrange(classList): #如果不在分类字典中 ifvotenotinclassCount.keys():classCount[vote]=0 classCount[vote]+=1 #根据出现的次数大到小排序 sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) returnsortedClassCount[0][0] #创建决策树 defcreateTree(dataSet,labels): #获取数据样本每组最后一组的特征值这里是yes,no classList=[example[-1]forexampleindataSet] #如果说这个classList全部都是yes或者全部是no那肯定子返回yes或者no if(classList.count(classList[0])==len(classList)): returnclassList[0] #如果遍历完所有的特征返回出现次数最多的 #是用消耗特征值的方式进行构造决策树的,每次会消掉一个特征值 iflen(dataSet[0])==1: returnmajorityCnt(classList) #选择最好的特征值 bestFeat=chooseBestFeatureToSplit(dataSet) bestFeatLabel=labels[bestFeat] myTree={bestFeatLabel:{}} #删除labels中的一特征值 del(labels[bestFeat]) #找到特征值那一列 featValues=[example[bestFeat]forexampleindataSet] uniqueVals=set(featValues) forvalueinuniqueVals: #labels列表的赋值 subLabels=labels[:] myTree[bestFeatLabel][value]=createTree(splitDataSet(dataSet,bestFeat,value),subLabels) returnmyTree dataSet,lables=createDataSet() shannonEnt=calcShannonEnt(dataSet) my=createTree(dataSet,lables) print(my)
总结
以上所述是小编给大家介绍的Python3.0实现决策树算法的流程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!