머신러닝

결정 트리 (Decision Tree)

jeongpil 2021. 3. 17. 21:47

*해당 포스팅은 파이썬 머신러닝 완벽 가이드(권철민 지음) 교재를 공부하며 작성한 글입니다.

 

 

안녕하세요! 오늘은 분류 알고리즘인 결정 트리에 대해서 알아보겠습니다.

 

1. 결정 트리란?

2. 결정 트리 모델의 특징

3. 결정 트리 파라미터

4. 결정 트리 시각화

 

1. 결정 트리란?

 

결정 트리는 머신러닝 알고리즘 중 직관적으로 이해하기 쉬운 분류 알고리즘입니다.

 

데이터에 있는 규칙을 학습을 통해 자동적으로 찾아내 트리 기반의 분류 규칙을 만드는 것입니다.

 

알고리즘의 성능을 크게 좌우하는 것은 데이터의 "어떤 기준"을 바탕으로 규칙을 만드는가 입니다.

 

 

결정 트리는 루트 노드, 규칙 노드, 리프 노드로 이루어져 있고 새로운 규칙 조건마다 서브 트리가 생성됩니다.

 

 

 

 

규칙이 너무 많으면 분류 방식이 매우 복잡해진다는 것이고 이는 과적합으로 이어지기 쉽습니다.

 

학습 데이터를 너무 완벽히 분류하게 되면서 학습 데이터에 과적합 될 수 있고 예측 성능이 저하될 수 있습니다.

 

트리의 깊이가 너무 깊으면 좋지 않습니다.

 

따라서, 가능한 한 적은 결정 노드로 높은 예측 정확도를 가지기 위해서는

 

규칙 노드를 통해 트리를 분할할 때 최대한 균일한 데이터 세트를 구성하게 분할해야 합니다.

 

 

 

그림에서 볼 때 균일도는 C>B>A 순으로 균일도가 높다고 할 수 있습니다. 

 

여러 데이터가 섞이지 않은 한 가지 데이터로만 이뤄져 있을수록 균일도가 높다고 할 수 있습니다.

 

이러한 데이터 세트에서 균일도는 데이터를 구분하는 데 있어서 필요한 정보의 양에 영향을 미칩니다.

 

 

C에서는 어느 것을 뽑아도 파란색 공이기 때문에 필요한 정보의 양이 적지만,

 

A에서는 어느 것을 뽑았을 때 파란색 공이라고 판단하기에는 더 많은 정보가 필요합니다.

 

정보의 균일도를 측정하는 대표적인 방법으로 엔트로피를 이용한 정보 이득지니 계수가 있습니다.

 

 

 

  • 정보 이득

 

정보 이득은 엔트로피라는 개념을 기반으로 합니다.

 

엔트로피는 얼마나 혼잡한지를 의미합니다.

 

즉 균일한 데이터가 아니면 엔트로피가 높은 것입니다.

 

결정 트리에서는 정보 이득 지수가 높은 속성을 기준으로 트리를 분할합니다.

 

정보 이득 지수를 구하는 방법은 다음과 같습니다.

 

 

정보 이득 지수 계산식
엔트로피 계산식

 

 

이해하기 쉽게 예시를 통해 알아보겠습니다.

 

 

 

 

(+) 는 잘 분류된 것, (-) 는 잘못 분류된 것을 뜻합니다.

 

즉, 그림에서 A1을 기준으로 분할됐을 때 True로 분리한 노드에 True가 21개, False가 5개 존재하는 것입니다.

 

A1 기준과 A2 기준의 정보 이득 지수를 계산한 것은 다음과 같습니다.

 

 

 

 

A1의 정보 이득 지수는 0.27, A2의 정보 이득 지수는  0.12로 계산됩니다.

 

즉, A1 기준으로 트리를 분할해야 트리를 잘 분할한 것입니다.

 

 

  • 지니 계수

 

지니 계수는 불평등 지수를 나타낼 때 사용하는 계수이고 0이 가장 평등하고 1이 가장 불평등합니다.

 

지니 계수가 낮을수록 데이터 균일도가 높다고 해석하고 지니 계수가 낮은 속성을 기준으로 트리를 분할합니다.

 

지니 계수를 계산하는 방법은 다음과 같습니다.

 

 

 

 

지니 계수도 예시를 통해 이해해보겠습니다.

 

A라는 기준과 B라는 기준으로 데이터를 나누고 지니 계수를 구해보겠습니다.

 

 

 

 

기준 A로 데이터를 나눴을 때 지니 계수는 0.497이고, 기준 B로 데이터를 나눴을 때 지니 계수는 0.28입니다.

 

지니 계수가 낮을수록 좋은 기준이기 때문에 이 데이터는 B를 기준으로 나누는 것이 좋습니다.

 

육안으로 확인해도 기준 B가 좋아 보입니다.

 

2. 결정 트리 모델의 특징

 

 

  • 장점

 

알고리즘이 쉽고 직관적이다.

 

정보의 균일도만 신경 쓰면 되기 때문에 피처의 스케일링이나 정규화 등의 사전 가공 영향도가 크지 않다.

 

 

  • 단점

 

과적합이 일어날 가능성이 높아 알고리즘 성능이 떨어질 수 있다.

 

과적합을 극복하기 위해 트리의 크기를 사전에 제한하는 튜닝이 필요하다.

 

3. 결정 트리 파라미터

 

- DecisionTreeClassifier : 분류를 위한 클래스

 

- DecisionTreeRegressor : 회귀를 위한 클래스

 

DecisionTreeClassifier와 DecisionTreeRegressor는 동일한 파라미터를 사용합니다.

 

이런 파라미터들을 적절한 값으로 설정하면 과적합을 제어할 수 있습니다.

 

4. 결정 트리 시각화

 

Graphviz 패키지를 통해 결정 트리 알고리즘이 어떠한 규칙을 가지고 트리를 생성하는지 시각적으로 볼 수 있습니다.

 

사이킷런에서는 Graphviz 패키지와 쉽게 인터페이스 할 수 있도록 export_graphviz() API를 제공합니다.

 

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings("ignore")

dt_clf=DecisionTreeClassifier()
iris=load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)

dt_clf.fit(X_train,y_train) # 학습

 

from sklearn.tree import export_graphviz
import graphviz

export_graphviz(dt_clf, out_file="tree.dot", class_names=iris.target_names,
               feature_names=iris.feature_names, impurity=True, filled=True)

with open("tree.dot") as t:
    dot_graph=t.read()
    
graphviz.Source(dot_graph)

 

 

 

 

이렇게 트리 구조를 시각화할 수 있습니다.

 

중요한 몇 개의 피처가 명확한 규칙 트리를 만드는 데 크게 기여하여 모델을 좀 더 간결하고 이상치에 강한 모델을 만들 수 있기 때문에

 

어떠한 피처를 기준으로 하는지가 중요합니다.

 

피처의 중요도는 DecisionTreeClassifier 객체의 feature_importances_ 속성으로 확인할 수 있습니다.

 

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

for name, value in zip(iris.feature_names, dt_clf.feature_importances_):
    print('{0}: {1:.3f}'.format(name,value))
    
sns.barplot(x=dt_clf.feature_importances_, y=iris.feature_names)

 

 

위의 트리를 살펴보면 petal length를 기준으로 5번, petal width를 기준으로 3번, sepal width를 기준으로 1번으로 나눠진 것을 확인할 수 있고

 

피처의 중요도도 petal length가 가장 높게 나온 것을 확인할 수 있습니다.

 

 

 

이렇게 결정 트리에 대해 알아보았고 이후에는 결정 트리를 기본 알고리즘으로 사용하는 

 

앙상블에 대해 알아보겠습니다.