Machine Learning in Action ch.3.2 Tree
3.2 매스플롯라이브러리 주석으로 파이썬에서 트리 플롯하기
3.2.1 매스플롯라이브러리 주석
매스플롯라이브러리에는 애너테이션이라는 훌륭한 도구를 포함하고 있다. 이 애너테이션은 그려진 플롯 내에 있는 데이터 점들을 설명할 수 있도록 주석을 추가하는 도구이다.우리는 주석을 이용하여 트리를 플롯하는 데 사용할 것이다. 우리는 텍스트 상자에 색을 칠할 수도 있고 우리가 좋아하는 형태로 변경할 수도 있다.
텍스트 주석을 가진 트리 노드를 플롯하는 함수를 만들어보자.
decisionNode = dict(boxstyle="sawtooth", fc="0.8")
leafNode = dict(boxstyle="round4", fc="0.8")
arrow_args = dict(arrowstyle="<- p="">
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(inTree):
fig = plt.figure(1, facecolor='white')
fig.clf()
axprops = dict(xticks=[], yticks=[])
createPlot.ax1 = plt.subplot(111, frameon=False, **axprops) #no ticks
#createPlot.ax1 = plt.subplot(111, frameon=False) #ticks for demo puropses
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()
복잡해 보여도 그냥 노드들 형태 만들고 플롯 꾸미는 것들 위주이다.
3.2.2 주석 트리 구축하기
우선 트리를 플롯하기 위한 방법이 필요하다. X,Y 좌효가 있다. 이제 모든 노드를 어디에 배치해야 할 것인가? 일단 , 단말 노드다 얼마나 있는지를 알아야 X축 방향에서 적당한 크기로 화살표를 그릴 수 있게 될 것이며, 단계가 얼마나 있는지 알아야 Y 축 방향에서 적당한 크기로 화살표를 그릴 수 있게 될 것이다.
그래서 단말노드의 갯수를 알아내는 함수와 단계의 갯수를 알아내는 함수를 만들어야한다.
def getNumLeafs(myTree):
numLeafs = 0
firstStr = myTree.keys()[0]
secondDict = myTree[firstStr]
for key in secondDict.keys():
if type(secondDict[key]).__name__=='dict': #노드가 딕셔너리인지 아닌지 검사
numLeafs += getNumLeafs(secondDict[key])
else: numLeafs +=1
return numLeafs
def getTreeDepth(myTree):
maxDepth = 0
firstStr = myTree.keys()[0]
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
댓글
댓글 쓰기