결정 트리(Decision Tree) 설명 및 분류기 구현
- 인공지능 및 데이터과학/머신러닝 및 딥러닝
- 2022. 1. 17.
결정 트리 혹은 의사결정 나무(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 패키지에는 텍스트로 결정 트리를 설명하는 기능도 제공한다.
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 할 수 있게 된다.
참고자료
경영을 위한 데이터 마이닝 - 김종우, 김선태 공역
https://scikit-learn.org/stable/modules/tree.html
연관포스팅
'인공지능 및 데이터과학 > 머신러닝 및 딥러닝' 카테고리의 다른 글
K-means clustering Python으로 구현하기 (0) | 2022.02.09 |
---|---|
KNN(k최근접) 알고리즘 설명 및 구현하기 (0) | 2022.01.31 |
[Python] 해밍 거리(Hamming distance) 이해 및 구현하기 (0) | 2022.01.13 |
자카드 유사도(Jaccard Similarity) 개념 이해 및 Python 구현 (0) | 2022.01.09 |
전이 학습(Transfer Learning) (1) | 2021.12.06 |