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


댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리