준비하는 대학생

[기계학습] 의사결정나무 (Decision Tree) 본문

Programming/Machine learning

[기계학습] 의사결정나무 (Decision Tree)

Bangii 2023. 6. 4. 16:44

의사결정 나무란?

의사결정 나무(Decision Tree)는 예측 모델 중 하나로, 독립 변수의 조건에 따라 종속 변수의 값을 예측하는 데 사용됩니다. 이 모델은 '나무'라는 이름처럼, 뿌리에서 시작해 각 분기점(node)에서 특정 기준에 따라 데이터를 나누고, 마지막에는 각각의 잎 노드(leaf node)로 데이터를 분류합니다. 의사결정 나무는 분류와 회귀 모두에 사용될 수 있으며, 간단하고 해석하기 쉬운 모델로 많이 사용됩니다.

작동 원리

의사결정 나무의 핵심 원리는 '불순도(impurity)'를 최소화하는 방향으로 데이터를 분할하는 것입니다. 불순도는 일반적으로 지니 계수(Gini Index), 엔트로피(Entropy), 정보 이득(Information Gain) 등을 사용해 측정합니다.

분류 기준

불순도

 불순도는 각 노드에서 클래스의 혼합 정도를 측정합니다. 불순도가 낮을수록 해당 노드는 한 클래스의 데이터로 잘 분류된 상태를 의미합니다.

  • 지니 계수(Gini Index)
     이는 데이터의 불순도를 측정하는 한 방법으로, 0에서 1 사이의 값을 가집니다. 0은 완벽하게 분류된 상태(하나의 클래스만 존재), 1은 모든 클래스가 동등하게 분포된 상태를 의미합니다. 지니 계수는 다음과 같이 계산합니다:여기서 p(i|t)는 특정 노드 t에서 클래스 i에 속하는 샘플의 비율을 나타냅니다. 각각의 범주 비율을 제곱합을 1에서 빼어 한 범주에 몰려있을 수록 작은 값이 나옵니다. 즉 낮을수록 잘 분류된 상태입니다.
  • 엔트로피(Entropy): 엔트로피도 불순도를 측정하는 방법 중 하나로, 정보의 불확실성을 측정합니다. 엔트로피가 높을수록 정보의 불확실성이 높아집니다. 엔트로피는 다음의 공식으로 계산합니다. 엔트로피는 클래스의 비율이 균등할수록 높은 값을 가집니다. 따라서 의사결정 나무는 엔트로피를 최소화하는 방향으로 분할합니다. Pi는 각 범주별 비율로 0~1 사이의 수를 갖고 있으므로 로그 함수는 음수가 나온다. 따라서 결과를 양수로 표현해주기 위해 수식에 -가 붙고, 낮을수록 잘 분류된 상태입니다.

정보 이득(Information Gain)

정보 이득은 불순도를 감소시키는 정도를 측정하는 지표로 부모노드와 자식노드의 불순도의 차이를 말합니다. 즉, 어떤 특성을 선택했을 때 얻는 정보의 양을 나타냅니다. 정보 이득이 큰 특성을 기준으로 데이터를 분할하게 됩니다.

정보이득 = 부모노드의 불순도 - 자식노드의 불순도들의 가중평균

연속형 변수인 경우

의사결정 나무는 독립변수가 연속형 변수일 때에도 분류할 수 있습니다. 이 경우 연속형 변수를 범주형 변수처럼 기준을 삼아 나눠 사용하면 됩니다. 아래의 기준점을 사용하여 범주를 나눌 수 있습니다.

  • 중위수
  • 사분위수
  • 순서대로 정렬하였을 때 클래스가 바뀌는 지점(이경우 바뀌는 지점의 평균 값을 기준으로 나눕니다.)
  • 모든 데이터를 각각 기준점으로 사용 (이 경우 모든 경우를 확인하므로 정확할 수 있으나 시간이 오래걸리고 과적합이 될 수 있습니다.)

위의 기준으로 나눈 뒤 각각의 정보이득을 구해 정보이득이 가장 큰 것을 기준으로 하여 분기해야합니다.

가지치기 (Pruning)

가지치기는 과대적합을 방지하기 위한 기법 중 하나입니다. 의사결정 나무는 깊이가 깊어질수록 훈련 데이터에 과도하게 적합되어 새로운 데이터에 대한 예측 성능이 떨어질 수 있습니다. 이를 방지하기 위해 트리의 최대 깊이를 제한하거나, 노드가 분할하기 위한 최소 샘플 수를 설정하는 등의 방법을 사용할 수 있습니다.

 

특성 중요도

특성 중요도(feature importance)는 각 특성이 얼마나 중요한 역할을 하는지를 측정하는 지표입니다. 이는 해당 특성에 의한 분할이 불순도를 얼마나 감소시키는지에 따라 결정됩니다. 특성 중요도의 합은 항상 1이며, 각 특성의 중요도는 0과 1 사이의 값을 가집니다.

  1. 먼저 특성(feature)를 선택시 중요한 역할 지표로써 특성 순서대로 나타냅니다.
  2. 분리 기준이 되는 모든 특성노드에서 (전체 샘플의 비율 * 해당 노드에서의 정보이득)을 구합니다.
  3. 구한 값들 을 분리특성별 비율로 특성 중요도를 구할 수 있습니다.

회귀 문제

의사결정 나무는 분류뿐만 아니라 회귀 문제에도 사용할 수 있습니다. 이 경우에는 각 노드에서 SDR을 감소하는 방향으로 분기한 뒤 타겟 변수의 평균값을 예측 값으로 사용합니다. 특성이 많은 다차원 비선형 회귀문제에 잘 작동하여 빅데이터 분석에도 많이 사용됩니다. 

Python(scikit-learn) 예제 코드

의사결정 나무를 학습시키는 Python 코드를 작성해 봅시다. scikit-learn의 DecisionTreeClassifier를 사용할 것입니다.
scikit-learn에서는 CART 알고리즘을 사용하는데 이경우는 이진트리로만 분기합니다. 
아래 코드는 iris 데이터 세트를 의사결정 나무로 분류하는 예제입니다. 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import 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=42)

clf = DecisionTreeClassifier(criterion='gini', max_depth=None, random_state=42)
clf.fit(X_train, y_train)

print("Test 정확도: {:.3f}".format(clf.score(X_test, y_test)))
print("Train 정확도: {:.3f}".format(clf.score(X_train, y_train)))
Test 정확도: 1.000
Train 정확도: 1.000
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(25,10))
plot_tree(clf, filled=True, fontsize = 14)
plt.show()

DecisionTreeClassifier 매개변수

  • criterion : 'gini' 또는 'entropy'. 기본값은 'gini'. 이 매개변수는 불순도를 측정하는 기준을 결정합니다. 'gini'는 지니 불순도를, 'entropy'는 엔트로피를 의미합니다.
  • splitter : 'best' 또는 'random'. 기본값은 'best'. 'best'는 가장 좋은 분할을 찾고, 'random'은 무작위로 분할합니다
  • max_depth : 트리의 최대 깊이를 결정합니다. 이 매개변수를 통해 과적합을 방지할 수 있습니다. None으로 설정하면, 모든 잎이 순수해질 때까지 트리가 성장합니다.
  • min_samples_split : 노드를 분할하기 위해 필요한 최소 샘플 수를 결정합니다. 숫자로 지정할 수도 있고, 전체 샘플 수에 대한 비율로 지정할 수도 있습니다.
  • min_samples_leaf : 리프 노드에 있어야 하는 최소 샘플 수를 결정합니다. 숫자로 지정할 수도 있고, 전체 샘플 수에 대한 비율로 지정할 수도 있습니다.
  • min_weight_fraction_leaf : 가중치가 부여된 전체 샘플 수에 대한 비율로, 리프 노드에 있어야 하는 최소 샘플 수를 결정합니다.
  • max_features : 각 노드에서 분할에 사용할 특성의 최대 수를 결정합니다.
  • random_state : 내부적으로 사용되는 난수 생성기의 시드입니다. 이 값을 고정하면, 같은 조건에서 같은 결과를 얻을 수 있습니다.
  • max_leaf_nodes : 리프 노드의 최대 수를 결정합니다. None일 경우 제한이 없습니다.
  • min_impurity_decrease : 이 값보다 불순도 감소가 큰 분할만 고려됩니다.
  • class_weight : 클래스 가중치를 지정합니다. 주로 불균형 데이터셋에 사용됩니다.


장단점

장점:

  • 이해하기 쉽고 해석하기 쉬움
  • 데이터의 스케일링이나 정규화가 필요 없음
  • 범주형 변수와 연속형 변수 모두 처리 가능

단점:

  • 과적합 경향이 있음 (가지치기를 통해 완화 가능)
  • 결정 경계가 데이터 축에 수직이어서 복잡한 패턴을 잘 못 잡음
  • 데이터의 작은 변화에도 모델의 구조가 크게 바뀔 수 있음

 

결론

의사결정 나무는 머신러닝에서 가장 널리 사용되는 알고리즘 중 하나입니다. 그 간결함과 직관성 때문에 많이 사용되며, 다양한 문제에 적용할 수 있습니다. 그러나 과적합과 데이터의 민감성 등의 단점도 있으므로, 이를 주의하며 사용해야 합니다.

Comments