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实现决策树算法的流程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!