Machine Learning in Action ch.3.2 Tree (2) & 3.3 Tree
이제 전에 얻은 단말 노드의 갯수와 단계의 갯수로 트리 전체를 플롯할 수 있다.
def getTreeDepth(myTree):
maxDepth = 0
firstStr = myTree.keys()
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, va="center", ha="center", rotation=30)
def plotTree(myTree, parentPt, nodeTxt):#if the first key tells you what feat was split on
numLeafs = getNumLeafs(myTree) #this determines the x width of this tree
depth = getTreeDepth(myTree)
firstStr = myTree.keys()[0] #the text label for this node should be this
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: #it's a leaf node print the leaf node
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
위 함수들에서는 만들어질 트리에 대한 준비물들을 모두 만들어 플롯한다. 예를 들어 트리의 넓이와 깊이, 단말노드의 갯수 등이 있다.
import trees,treePlotter
fr = open("C:/Users/llewyn/Desktop/MLiA_SourceCode/machinelearninginaction/Ch03/lenses.txt")
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age','prescript','astigmatic','tearRate']
lensesTree = trees.createTree(lenses,lensesLabels)
treePlotter.createPlot(lensesTree)
위의 함수를 돌리면 위와 같은 figure가 나오는데 흠... 책과 다르다...
버젼이 달라서 틀린 거 고치다 보니 결과물도 다르게 나왔다..
책에서는 너무도 일치해도 과적합이라는 문제가 발생한단다. 과적합 문제를 줄이기 위해 트리를 가지치기해야한단다. 여기서는 다루지 않고 9장에서 따로 할 것이다.
지금 우리가 짠 알고리즘을 ID3 알고리즘은데 9장에서는 더 심층적인 CART 라는 의사결정 트리 알고리즘을 살펴볼 것이다.
트리는 다른 특별한 데이터 구조들보다 파이썬 사전에서 더쉽게 표현된다.
책에서는 pickle 이라는 모듈을 사용했다. 하지만 나는 그냥 뛰어넘었지만 유투브에서도
pickle을 굉장히 많이 사용하더라.
분류 알고리즘에는 다른 의사결정 트리 생성 알고리즘도 있다. C4.5 와 CART 가 가장 인기가 좋다. CART는 9장에서 회귀를 사용할 때 다루게 될 것이다.
이때까지 분류 항목에는 kNN과 ID3 알고리즘이 있다는 것을 배웠다.
다음 장에는 주어진 분류 항목에 속하는 데이터 사례에 확률을 적용하는 나이브 베이즈에 대해 공부할 것이다.
def getTreeDepth(myTree):
maxDepth = 0
firstStr = myTree.keys()
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, va="center", ha="center", rotation=30)
def plotTree(myTree, parentPt, nodeTxt):#if the first key tells you what feat was split on
numLeafs = getNumLeafs(myTree) #this determines the x width of this tree
depth = getTreeDepth(myTree)
firstStr = myTree.keys()[0] #the text label for this node should be this
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: #it's a leaf node print the leaf node
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
위 함수들에서는 만들어질 트리에 대한 준비물들을 모두 만들어 플롯한다. 예를 들어 트리의 넓이와 깊이, 단말노드의 갯수 등이 있다.
3.3 예제 : 콘택트렌즈 유형 예측하기
import trees,treePlotter
fr = open("C:/Users/llewyn/Desktop/MLiA_SourceCode/machinelearninginaction/Ch03/lenses.txt")
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age','prescript','astigmatic','tearRate']
lensesTree = trees.createTree(lenses,lensesLabels)
treePlotter.createPlot(lensesTree)
위의 함수를 돌리면 위와 같은 figure가 나오는데 흠... 책과 다르다...
버젼이 달라서 틀린 거 고치다 보니 결과물도 다르게 나왔다..
책에서는 너무도 일치해도 과적합이라는 문제가 발생한단다. 과적합 문제를 줄이기 위해 트리를 가지치기해야한단다. 여기서는 다루지 않고 9장에서 따로 할 것이다.
지금 우리가 짠 알고리즘을 ID3 알고리즘은데 9장에서는 더 심층적인 CART 라는 의사결정 트리 알고리즘을 살펴볼 것이다.
트리는 다른 특별한 데이터 구조들보다 파이썬 사전에서 더쉽게 표현된다.
책에서는 pickle 이라는 모듈을 사용했다. 하지만 나는 그냥 뛰어넘었지만 유투브에서도
pickle을 굉장히 많이 사용하더라.
분류 알고리즘에는 다른 의사결정 트리 생성 알고리즘도 있다. C4.5 와 CART 가 가장 인기가 좋다. CART는 9장에서 회귀를 사용할 때 다루게 될 것이다.
이때까지 분류 항목에는 kNN과 ID3 알고리즘이 있다는 것을 배웠다.
다음 장에는 주어진 분류 항목에 속하는 데이터 사례에 확률을 적용하는 나이브 베이즈에 대해 공부할 것이다.
댓글
댓글 쓰기