李航统计学习方法决策树id3例5.3
2018-01-19 14:30
399 查看
贴图:
这篇大部分参考机器学习实战上面的代码 只有部分函数有改动 因为。。。大改的地方总是调不出答案。。。。啊啊啊
上代码:
from math import log
def loadDataSet():
dataSet = [['青年', '否', '否', '一般', '否'],
['青年', '否', '否', '好', '否'],
['青年', '是', '否', '好', '是'],
['青年', '是', '是', '一般', '是'],
['青年', '否', '否', '一般', '否'],
['中年', '否', '否', '一般', '否'],
['中年', '否', '否', '好', '否'],
['中年', '是', '是', '好', '是'],
['中年', '否', '是', '非常好', '是'],
['中年', '否', '是', '非常好', '是'],
['老年', '否', '是', '非常好', '是'],
['老年', '否', '是', '好', '是'],
['老年', '是', '否', '好', '是'],
['老年', '是', '否', '非常好', '是'],
['老年', '否', '否', '一般', '否']]
label = ['年龄', '有工作', '有自己的房子', '信贷情况']
return dataSet, label
def shannoEnt(dataSet):
labelCount={}
numOfData=len(dataSet)
for data in dataSet:
classify=data[-1]
if classify not in labelCount.keys():
labelCount[classify]=1
else:labelCount[classify]+=1
H=0.0
for value in labelCount.values():
pi=value/numOfData
H-=pi*log(pi,2)
return H
def chooseBestFeatureSplit(dataSet):
HD=shannoEnt(dataSet)
bestGain=0.0
bestFeature=-1
for i in range(len(dataSet[0])-1):
feat=[data[i] for data in dataSet]
prob=0.0
for value in set(feat):
subData=splitData(dataSet,i,value)
prob+=(len(subData)/len(dataSet))*shannoEnt(subData)
Gain=HD-prob
if Gain>bestGain:
bestGain=Gain
bestFeature=i
# print('最优特征是:',label[bestFeature])
return bestFeature
def splitData(dataSet,axis,value):
retDataSet=[]
for data in dataSet:
if data[axis]==value:
reducedData=data[:axis]
reducedData.extend(data[axis+1:])
retDataSet.append(reducedData)
return retDataSet
def majorityCnt(classList):
classCount=dict([(i,classList.count(i)) for i in classList])
return max(classCount,key=lambda x:classCount[x])
def createTree(dataSet,labels):
classList=[example[-1] for example in dataSet]
if len(set(classList))==1:
return classList[0]
if len(dataSet[0])==0:
return majorityCnt(classList)
bestFeat=chooseBestFeatureSplit(dataSet)
bestFeatLabel=labels[bestFeat]
#创建树:
myTree={bestFeatLabel:{}}
del (labels[bestFeat])
featValues=[example[bestFeat] for example in dataSet]
# print(set(featValues))
for value in set(featValues):
subLabels=labels[:]
subDataSet=splitData(dataSet,bestFeat,value)
myTree[bestFeatLabel][value]=createTree(subDataSet,subLabels)
return myTree
dataSet,label=loadDataSet()
print(createTree(dataSet,label))
这篇大部分参考机器学习实战上面的代码 只有部分函数有改动 因为。。。大改的地方总是调不出答案。。。。啊啊啊
上代码:
from math import log
def loadDataSet():
dataSet = [['青年', '否', '否', '一般', '否'],
['青年', '否', '否', '好', '否'],
['青年', '是', '否', '好', '是'],
['青年', '是', '是', '一般', '是'],
['青年', '否', '否', '一般', '否'],
['中年', '否', '否', '一般', '否'],
['中年', '否', '否', '好', '否'],
['中年', '是', '是', '好', '是'],
['中年', '否', '是', '非常好', '是'],
['中年', '否', '是', '非常好', '是'],
['老年', '否', '是', '非常好', '是'],
['老年', '否', '是', '好', '是'],
['老年', '是', '否', '好', '是'],
['老年', '是', '否', '非常好', '是'],
['老年', '否', '否', '一般', '否']]
label = ['年龄', '有工作', '有自己的房子', '信贷情况']
return dataSet, label
def shannoEnt(dataSet):
labelCount={}
numOfData=len(dataSet)
for data in dataSet:
classify=data[-1]
if classify not in labelCount.keys():
labelCount[classify]=1
else:labelCount[classify]+=1
H=0.0
for value in labelCount.values():
pi=value/numOfData
H-=pi*log(pi,2)
return H
def chooseBestFeatureSplit(dataSet):
HD=shannoEnt(dataSet)
bestGain=0.0
bestFeature=-1
for i in range(len(dataSet[0])-1):
feat=[data[i] for data in dataSet]
prob=0.0
for value in set(feat):
subData=splitData(dataSet,i,value)
prob+=(len(subData)/len(dataSet))*shannoEnt(subData)
Gain=HD-prob
if Gain>bestGain:
bestGain=Gain
bestFeature=i
# print('最优特征是:',label[bestFeature])
return bestFeature
def splitData(dataSet,axis,value):
retDataSet=[]
for data in dataSet:
if data[axis]==value:
reducedData=data[:axis]
reducedData.extend(data[axis+1:])
retDataSet.append(reducedData)
return retDataSet
def majorityCnt(classList):
classCount=dict([(i,classList.count(i)) for i in classList])
return max(classCount,key=lambda x:classCount[x])
def createTree(dataSet,labels):
classList=[example[-1] for example in dataSet]
if len(set(classList))==1:
return classList[0]
if len(dataSet[0])==0:
return majorityCnt(classList)
bestFeat=chooseBestFeatureSplit(dataSet)
bestFeatLabel=labels[bestFeat]
#创建树:
myTree={bestFeatLabel:{}}
del (labels[bestFeat])
featValues=[example[bestFeat] for example in dataSet]
# print(set(featValues))
for value in set(featValues):
subLabels=labels[:]
subDataSet=splitData(dataSet,bestFeat,value)
myTree[bestFeatLabel][value]=createTree(subDataSet,subLabels)
return myTree
dataSet,label=loadDataSet()
print(createTree(dataSet,label))
相关文章推荐
- 统计学习方法 李航---第5章 决策树
- 统计学习方法-李航(第5章 决策树笔记)
- 李航 统计学习方法 例5.4 使用CART算法生成分类决策树
- 《统计学习方法,李航》:5、决策树
- 统计学习方法 李航---第5章 决策树
- 李航统计学习方法决策树的特征选择例5.2python代码
- 李航 统计学习方法 第五章 决策树 课后 习题 答案
- 李航 统计学习 例5.3 利用ID3算法建立决策树
- 统计学习方法第五章决策树的ID3算法代码实践 例5.3
- 机器学习系列笔记1:《统计学习》李航博士 第一章 统计学习方法概论
- 统计学习方法李航---第一章
- 《统计学习方法,李航》:10、隐马尔科夫模型
- 统计学习方法 李航---第1章 统计学习方法概论
- 统计学习方法-李航(第8章 提升方法笔记)
- 李航统计学习方法-改进的迭代尺度算法(IIS)总结
- <统计学习方法>4 决策树(Decision Tree)
- 统计学习方法 李航---第1章 统计学习方法概论
- 李航—统计学习方法第二章课后答案
- 《统计学习方法,李航》:7、支持向量机support vector machine(1)
- 李航 统计学习方法 朴素贝叶斯估计 例4.1以及例4.2 整合版