머 신 러 닝 입문 - 의사 결정 트 리 (1)
15882 단어 기계 학습 입문
정보 엔트로피
그래서 방금 언급 한 세 가지 결정 트 리 알고리즘 이 선택 한 구분 준칙 은 ID3 – 정보 이득, C 4.5 – 이득 율, CART – 지 니 지수 와 관련 된 결정 트 리 는 보통 가지치기 처리, 연속 값 처리, 결여 값 처리, 다 변수 결정 트 리 등 문제 와 관련 되 는데 이 문 제 는 결정 트 리 (2) (3) 에 놓 일 것 이다.학습 분석 을 가 져 옵 니 다. 오늘 의 실전 의 중점 은 ID3 입 니 다. 관련 소스 코드 와 테스트 샘플 이 github 에서 github 링크 주소 입 니 다.
계산 정보 엔트로피
def calcShannonEnt(dataSet):
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
설명: dataset 는 다음 과 같은 특징 을 가 진 데이터 입 니 다.
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
특정한 특징 값 을 선택 하여 데이터 세트 를 구분 하 다.
#axis ,value
def splitDataSet(dataSet,axis,value):
retDataSet=[]
for featVec in dataSet:
if featVec[axis]==value:
reducedFeatVec=featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
가장 좋 은 구분 속성 선택
def chooseBestFeatureToSplit(dataSet):
#the number of feature attributes that the current data packet contains
numFeatures=len(dataSet[0])-1
# entropy
baseEntropy=calcShannonEnt(dataSet)
bestInfoGain=0.0
bestFeature=-1
for i in range(numFeatures):
featList = [example[i] for example in dataSet]
uniqueVals=set(featList)
newEntropy=0.0
for value in uniqueVals:
subDataset=splitDataSet(dataSet,i,value)
prob=len(subDataset)/float(len(dataSet))
newEntropy+=prob*calcShannonEnt(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.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
재 귀 구조 결정 트 리 (사전 형식 으로 표시)
def createTree(dataSet,labels):
classList=[example[-1] for example in dataSet]
#
if classList.count(classList[0]) == len(classList):
return classList[0]
#
if len(dataSet[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)
for value in uniqueVals:
subLabels=labels[:]
mytree[bestFeatLabel][value]=createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
return mytree
단순 한 사전 형식 이 직관 적 이지 못 하 다 고 생각한다 면, matplotlib 를 통 해 그 릴 수도 있다.
# coding=utf-8
from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt
from math import log
import operator
decisionNode=dict(boxstyle="sawtooth",fc="0.8")
leafNode=dict(boxstyle="round4",fc="0.8")
arrow_args=dict(arrowstyle=")
def plotNode(nodeTxt, centerPt, parentPt, nodeType):
createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords='axes fraction',
xytext=centerPt, textcoords='axes fraction',
va="center", ha="center", bbox=nodeType, arrowprops=arrow_args )
# def createPlot():
# fig = plt.figure(1, facecolor='white')
# fig.clf()
# createPlot.ax1 = plt.subplot(111, frameon=False) #ticks for demo puropses
# plotNode(' ', (0.5, 0.1), (0.1, 0.5), decisionNode)
# plotNode(' ', (0.8, 0.1), (0.3, 0.8), leafNode)
# plt.show()
def createPlot(inTree):
fig=plt.figure(1,facecolor='white')
fig.clf()
axprops=dict(xticks=[],yticks=[])
createPlot.ax1=plt.subplot(111,frameon=False,**axprops)
plotTree.totalW=float(getNumLeafs(inTree))
plotTree.totalD=float(getTreeDepth(inTree))
plotTree.xOff=-0.5/plotTree.totalW
plotTree.yOff=1.0
plotTree(inTree,(0.5,1.0),'')
plt.show()
def getNumLeafs(myTree):
numleafs=0
firstStr=next(iter(myTree))
sencondDict=myTree[firstStr]
for key in sencondDict.keys():
if type(sencondDict[key]).__name__=='dict':
numleafs+=getNumLeafs(sencondDict[key])
else:
numleafs+=1
return numleafs
def getTreeDepth(myTree):
maxDepth=0
firstStr=next(iter(myTree))
secondDict=myTree[firstStr]
for key in secondDict.keys():
if type(secondDict[key]).__name__=='dict':
thisDepth=1+getTreeDepth(secondDict[key])
else:
thisDepth=1
if thisDepth>maxDepth:
maxDepth=thisDepth
return maxDepth
def plotMidText(cntrPt,parentPt,txtString):
xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0]
yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1]
createPlot.ax1.text(xMid,yMid,txtString)
def plotTree(myTree,parentPt,nodeTxt):
numLeafs=getNumLeafs(myTree)
depth=getTreeDepth(myTree)
firstStr=next(iter(myTree))
cntrPt=(plotTree.xOff+(1.0+float(numLeafs))/2.0/plotTree.totalW,plotTree.yOff)
plotMidText(cntrPt,parentPt,nodeTxt)
plotNode(firstStr,cntrPt,parentPt,decisionNode)
secondDict=myTree[firstStr]
plotTree.yOff=plotTree.yOff-1.0/plotTree.totalD
for key in secondDict.keys():
if type(secondDict[key]).__name__=='dict':
plotTree(secondDict[key],cntrPt,str(key))
else:
plotTree.xOff=plotTree.xOff+1.0/plotTree.totalW
plotNode(secondDict[key],(plotTree.xOff,plotTree.yOff),cntrPt,leafNode)
plotMidText((plotTree.xOff,plotTree.yOff),cntrPt,str(key))
plotTree.yOff=plotTree.yOff+1.0/plotTree.totalD
어떻게 의사 결정 트 리 를 통 해 분류 합 니까?
#
def classify(inputTree,featlabels,testVec):
firstStr=next(iter(inputTree))
secondDict=inputTree[firstStr]
featIndex=featlabels.index(firstStr)
for key in secondDict.keys():
if testVec[featIndex]==key:
if type(secondDict[key]).__name__=='dict':
classLabel=classify(secondDict[key],featlabels,testVec)
else:
classLabel=secondDict[key]
return classLabel
설명 하 다.
featlabels :['no surfacing','flippers']
testVec : [0,1]
txt 의 데이터 세트 에 따 른 실전 분류
def lensesClassify():
fr=open('lenses.txt','r')
lenses=[inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']
lensesTree=createTree(lenses,lensesLabels)
tp.createPlot(lensesTree)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Azure Custom Vision Service를 사용하여 분류 모델 만들기(간단)Azure 서비스에는 Custom Vision Service라는 것이 있습니다. 이 서비스는 기계 학습의 지식이 없어도 마음대로 다양한 해주므로 간단하게 사용할 수 있습니다. 이번은 기계 학습으로 사쿠라이 모모카와 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.