机器学习笔记3-id3算法决策树程序解析,2024年最新把面试官鸽了
numEntries = len(dataSet)
labelCounts = {}
for featVec in dataSet:
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob*log(prob,2)
return shannonEnt
def splitDataSet(dataSet,axis,value):
‘’’
根据给定的数据集,划分数据集的特征,特征的返回值来划分数据集
‘’’
returnSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
returnSet.append(reducedFeatVec)
return returnSet
def createTestSet():
dataSet = [[1,1,‘yes’],
[1,1,‘yes’],
[1,0,‘no’ ],
[0,1,‘no’ ],
[0,1,‘no’ ]]
labels = [‘no surfacing’,‘flippers’]
return dataSet,labels
def chooseBestFeatureToSplit(dataSet):
‘’’
选择最好的划分特征,即最大的信息增益
‘’’
numFeatures = len(dataSet[0]) - 1
baseEntropy = calcShannoEnt(dataSet)
bestInfoGain = 0.0
bestFeature = -1
for i in range(numFeatures):
featList = [example[i] for example in dataSet]
#value去重
uniqueVals = set(featList)
newEntropy = 0.0
for value in uniqueVals:
subDataSet = splitDataSet(dataSet,i,value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * calcShannoEnt(subDataSet)
infoGain = baseEntropy - newEntropy
if infoGain > bestInfoGain:
bestInfoGain = infoGain
bestFeature = i
return bestFeature
def majorityCnt(classList):
‘’’
在一个列表中返回最多的值
‘’’
classCount = {}
for vote in classList:
if vote not in classCount.keys():
classCount[vote] = 0
classCount[vote] += 1
sortedClassCount = sorted(classCount.item(),key = operator.itemgetter(1),reverse = True)
return sortedClassCount[0][0]
def createTree(dataSet,labels):
‘’’
构建决策树
决策树递归过程:开始一直无法理解迭代过程中有一个if-return语句,如果直接满足条件不是直接会退出程序吗?
在网上找到一个非常好的答案帮我解决了这个问题,一句话就是return之前需要将程序运行完毕,例如如下函数
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
迭代过程如下:
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
在return之前,n * fact(n - 1)必须要计算完毕
本程序中的createTree(dataSet,labels)函数与之类似,在return之前,myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)必须计算完毕
设dataSet为create为:
[[1,1,‘yes’], lebels为[‘no surfacing’,‘flippers’]
[1,1,‘yes’],
[1,0,‘no’ ],
[0,1,‘no’ ],
[0,1,‘no’ ]]
第一次迭代有两个分支1:MyTree[‘no surfacing’][0] = createTree([[1,‘no’],[1,‘no’])
2:MyTree[‘no surfacing’][1] = createTree([[1,‘yes’],[1,‘yes’],[0,‘no’])
分支1进入一次迭代直接满足条件classList.count(classList[0]) == len(classList),直接等于’no’
分支2进入一次迭代后有两个分支2_1:MyTree[‘no surfacing’][1][‘flippers’][0] = createTree([[‘no’]])
2_1:MyTree[‘no surfacing’][1][‘flippers’][1] = createTree([[‘yes’],['yes]])
2_1,2_2满足第一条语,2_1返回’no’,2_2返回’yes’,最后计算结果
MyTree[‘no surfacing’][0] = ‘no’
MyTree[‘no surfacing’][1][‘flippers’][0] = ‘no’
MyTree[‘no surfacing’][1][‘flippers’][1] = ‘yes’
即{‘no surfacing’{0:‘no’,1:{‘flippers’:{0:‘no’,1:‘yes’}}}}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
1dc2430bb9ad39.png)
简历模板
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-GYA3cWnL-1712811988797)]