这里简单的利用机器学习实战的案例,走一遍程序代码,理论没搞清楚,程序就更难理解了,真实心累a!中间一些代码没有贴。。。
#创建数据集
def creatDataSet():
dataSet=[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
labels=['no surfacing','flippers']
return dataSet,labels
#创建树的函数代码
def createTree(dataSet,labels):
classList=[example[-1] for example in dataSet]
#复制最后一列的标签列表‘yes’,‘no’
if classList.count(classList[0])==len(classList):
#list.count(CL[0]),对第一个元素标签计数,如果标签个数与列表长度相同,则标签只有一种,返回标签
return classList[0]
if len(dataSet[0])==1:
#列表的第0个元素长度为1,仅剩一个特征了但是也无法将数据按标签分开
return majorityCnt(classList)
#返回一个出现次数最多的类别标签
bestFeat=chooseBestFeatureToSplit(dataSet)
#选择一个最好的划分方式,并返回最佳特征的位置,第几个特征
bestFeatLabel=labels[bestFeat]
#获取最佳特征的标签
myTree={bestFeatLabel:{}}
#创建带有最佳特征标签的嵌套字典的树
del(labels[bestFeat])
#每划分一层,特征就减少一个,去除最佳特征的标签
featValues=[example[bestFeat] for example in dataSet]
#最佳特征的特征值
uniqueVals=set(featValues)
#set将列表划分为集合,删除重复的特征值(0,1)
for value in uniqueVals:
subLabels=labels[:]
#减少后的特征标签
myTree[bestFeatLabel][value]=createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
#splitDataSet再根据最佳特征划分数据集,考虑属于不同特征值的子数据集
return myTree
myTree=Tree.createTree(my,lab)
bestFeatLabel:
no surfacing
myTree:
{'no surfacing': {}}
featValues:
[1, 1, 1, 0, 0]
uniqueVals:
{0, 1}
subLabels:
['flippers']
myTree:
{'no surfacing': {0: 'no'}}
subLabels:
['flippers']
bestFeatLabel:
flippers
myTree:
{'flippers': {}}
featValues:
[1, 1, 0]
uniqueVals:
{0, 1}
subLabels:
[]
myTree:
{'flippers': {0: 'no'}}
subLabels:
[]
myTree:
{'flippers': {0: 'no', 1: 'yes'}}
myTree:
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
首先选择的第一个最佳特征是“0”,标签是"no surfacing",创建一个字典{‘no surfacing’: {}},获取其特征值[1, 1, 1, 0, 0],去重{0, 1},进入for循环,value=0,下一个子标签(也就是下一层)‘flippers’,但是这一层还没处理完别着急!将原数据集中value=0的数据集创建分支,可知 classList只有‘no‘,出现的次数与长度相等,所以就直接返回classList[0]了,现在的树是这样的{‘no surfacing’: {0: ‘no’}}。继续进行下一循环value=1,下一个子标签还是’flippers’(目前还在第一层),将原数据集中value=1的数据集创建分支,可知 classList有‘no’ ‘yes’,无法判别哪一类,由此进入下一层(寻找下一个最佳特征)!
最佳特征标签’flippers’(终于用上了!),创建树{‘flippers’: {}},获取特征值[1, 1, 0],去重{0, 1},进入for循环,此时已经没有多余的特征了,所以subLabels为空列表,value=0,数据列表元素只有只有一个,classList只’no‘,’0‘的个数和classList长度又相等了,所以直接返回标签,得到字典{‘flippers’: {0: ‘no’}},继续循环value=1,此时数据列表有两个,classList只有’yes‘,’1‘的个数和classList长度又相等了,所以直接返回标签,得到字典{‘flippers’: {0: ‘no’, 1: ‘yes’}},这是第二层!
最终树为:{‘no surfacing’: {0: ‘no’, 1: {‘flippers’: {0: ‘no’, 1: ‘yes’}}}}三个叶子节点’0‘,’0‘,’1‘,两个判断节点’no surfacing’,‘flippers’