결정 트리(Decision Tree) 설명 및 분류기 구현

    결정 트리 혹은 의사결정 나무(Decision Tree) 분류기는 무언가를 설명할 때, 매우 유용한 퍼포먼스를 보여주는 모델이다. 최근에는 설명 가능한 인공지능(Explainable AI, XAI)이라는 것이 이슈이며, 몇몇 국회의원은 IT 기업들의 알고리즘을 공개해야 된다는 이야기까지 나오기도 하였다.

     

     

     

    또다른 관점으로는 새로운 서비스의 창출이다. 예를 들어, 설명을 할 수 있을 정도의 모델이라면 리포트(Report)를 보여준다던지, 설명 값을 토대로 다른 서비스를 만들 수도 있을 것이다. 결정 트리는 바로 이러한 방식에 특화된 알고리즘이며, 설명이 가능한 것을 제외하고 나쁘지 않을까 생각할 순 있지만, 아직도 많이 사용될 정도로 성능 또한 뒤쳐지지 않는다.

     

    결정 트리의 구성도

    결정 트리의 예시

     

    일단 결정 트리인 이유는 위의 예시와 같이 "할 일이 있는가?" 라는 항목의 뿌리(Root)부터 시작하여, 최하위 노드까지 진행이 되면서 생겨나는 모양이 나무같이 보여서 트리인 것이며, 그림과 같이 매우 직관적이며 쉽게 납득이 되는 모델이다. 스무고개놀이를 아는 사람이라면, 결정 트리를 이해하는것이 어렵지 않을 것이다.

     

    구성 설명
    Root Node 최상위 노드, "할 일이 있는가?"의 부분으로 시작하는 노드
     Parent Node 주어진 마디의 상위 마디
    Child Node 하나의 마디로부터 부리되어 나간 2개 이상의 마디들
    Internal Node Branch로 가기 위해 결정을 해주는 Decision node, 부모와 자식이 모두 있는 노드
    Leaf Node 분류에서 Class에 해당하는 node
    Branch Internal node에서 다른 node로 가는 길, 엣지(Edge)라고도 한다
    Depth 뿌리마디부터 끝마디까지의 중간마디들의 수

     

    트리를 만들기 위해서는 내부적으로 정보 이득(Information Gain, IG)가 최대가 되는 특성으로 데이터를 나누게 되는데 반복 과정을 통해서 리프 노드(Leaf node)가 순수해(더이상 분리가 진행되지 않는 경우)질 때까지 분할 작업을 반복하게 된다.

     

     

    결정트리 알고리즘

    결정 트리가 여러 변형버전들이 존재하지만 기본 절차에 있어서는 공통점을 가지고 있다. 바로 목표변수 측면에서 부모 노드보다 더 순수도가 높은 자식노드들이 되도록, 데이터를 반복적으로 더 작은 집단으로 나눈다는 것이다.

     

    좋은 분할과 나쁜 분할

     

    순수도(Purity)

    결정 트리는 어떤 입력 필드가 가장 좋은 분기를 만들 수 있는지 알아야 하며, 가장 좋은 분기는 레코드들을 몇 개의 집단으로 나누었을 때, 각 집단에 하나의 클래스가 월등히 많도록 하게 만든다.

     

    그리고 이를 기준으로 삼는 것은 순수도를 척도로 사용하는 것이다. 좋은 분할은 비슷한 숫자의 자식노드들을 생성하고 최소한 매우 적은 레코드가 포함된 노드를 만들지 않는다.

    범주형 변수의 순수도 척도

    • 지니(Gini), 모집단 다양성(population diversity)이라고도 부른다
    • 엔트로피(Entropy), 정보 이익(information gain)이라고도 부른다
    • 정보 이익 비율(information gain ratio)
    • 카이제곱 검정(chi-square test)

    수치형 변수의 순수도 척도

    • 분산의 감소(reduction in variance)
    • F검정

     

    텍스트 설명(Export_Text) 출력

    from sklearn.datasets import load_iris
    from sklearn.tree import export_text
    from sklearn import tree
    
    iris = load_iris()
    X, y = iris.data, iris.target
    
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(X, y)
    
    r = export_text(clf, feature_names=iris['feature_names'])

    sklearn 패키지에는 텍스트로 결정 트리를 설명하는 기능도 제공한다.

     

    Iris 데이터의 Export Text 화면

     

    Export Test 이외에도 노드 모양을 그래픽으로 출력하는 방법도 존재한다.

     

     

    노드 그래픽 출력

    from sklearn.datasets import load_iris
    from sklearn.tree import plot_tree
    from sklearn import tree
    import matplotlib.pyplot as plt
    
    iris = load_iris()
    X, y = iris.data, iris.target
    
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(X, y)
    
    plt.figure()
    plot_tree(clf, filled=True)
    plt.title("Iris - Decision Tree Model")
    plt.show()

     

    Export_text를 쓰지 말고, plot_tree와 pyplot 라이브러리를 활용하면 결정 트리를 Visualization 할 수 있게 된다.

     

    Iris 데이터의 결정트리 모양

     

     

    참고자료

    경영을 위한 데이터 마이닝 - 김종우, 김선태 공역

    https://scikit-learn.org/stable/modules/tree.html

     

    연관포스팅

    지니계수(Gini), 모집단 다양성

    댓글

    Designed by JB FACTORY