[ML] Decision Tree (결정 트리)

조치연·2025년 3월 27일
1

ML

목록 보기
5/17
post-thumbnail

오늘은 결정 트리에 대해 공부해봤습니다.


🎄 Decision Tree(결정 트리)

결정 트리는 데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리(Tree) 기반의 분류 규칙을 만드는 알고리즘 입니다.

if/else 기반의 형식으로 만들어집니다.
따라서 데이터의 어떤 기준을 바탕으로 규칙을 만들어 가느냐가 성능에 영향을 미칩니다.

다음은 결정 트리의 구조를 간단하게 나타낸 것입니다.

새로운 규칙마다 규칙 노드 기반의 서브 트리가 생성됩니다.
리프 노드는 결정된 분류 값을 내포합니다.


✅ Information Gain/Gini-index (정보 이득/지니 계수)

결정 트리는 가능한 한 적은 리프 노드로 높은 예측도를 보여주기 위해서 정보 균일도가 높은 데이터를 찾아야 합니다.
정보 균일도가 높다고 함은, 최대한 데이터가 섞여있지 않음을 의미합니다.

결정 트리는 균일도를 표현할 때, 정보 이득 또는, 지니 계수 개념을 사용합니다.

정보 이득이란, 1 - 엔트로피 지수입니다. 엔트로피는 집합의 혼잡도를 나타내며, 서로 다른 값이 섞여 있으면 엔트로피가 높습니다. 즉, 결정 트리는 정보 이득이 높은 속성을 기준으로 분할합니다.

지니 계수란, 원래 경제학에서 불평등 지수를 나타낼 때 사용하는 계수입니다. 0이 가장 평등하고 1로 갈수록 불평등합니다. 즉, 결정 트리는 지니 계수가 높은 속성을 기준으로 분할합니다.

sklearn의 DecisionTreeClassifier 클래스는 데이터 분할 시 기본적으로 지니 계수를 이용합니다.
DecisionTreeClassifier는 지니 계수가 낮은 조건을 찾아서 자식 노드에 걸쳐 반복적으로 분할한 뒤, 모두 특정 값에 도달하면 멈추고 분류를 결정합니다.



✅ 결정 트리 모델의 특징

결정 트리는 '정보의 균일도'라는 룰을 기반으로 조건을 생성하기 때문에 직관적이라는 장점이 있습니다.

이로 인해, 타 알고리즘에 비해 시각화가 편리하고 정보 균일도만 신경쓰면 되기 때문에 각 피처의 스케일링과 정규화 같은 전처리 작업이 필요 없습니다.

하지만, 이로인해 결정 트리는 과적합에 취약한 알고리즘 입니다.
계속해서 서브 트리와 리프 노드를 만들어가면 학습 데이터에서는 성능이 좋아질 지는 몰라도 테스트 데이터에서는 일반화가 안될 수 있습니다.

따라서 결정 트리 모델은 트리의 크기를 사전에 제한하는 것이 오히려 성능 튜닝에 더 도움이 됩니다.


✅ 결정 트리 파라미터

sklearn에서는 DecisionTreeClassifier 클래스를 제공합니다.(DecisionTreeRegressor도 제공.)
DecisionTreeClassifier 클래스의 주요 파라미터는 다음과 같습니다.

  • max_depth : 트리의 최대 깊이 (default는 None)

  • min_samples_split : 노드를 분할하기 위한 최소한의 샘플 데이터 수

  • min_samples_leaf : 분할이 될 경우 왼쪽과 오른쪽의 브랜치 노드에서 가져야 할 최소한의 데이터 수

  • max_features : 최적의 분할을 위해 고려할 최대 피처 수 (default는 None)
    int형으로 지정하면 대상 피처의 개수, float형으로 지정하면 전체 피처 중 대상 피처의 퍼센트
    'sqrt', 'auto', 'log'가 있음.
    (auto는 sqrt와 같은 효과를 냄)

  • max_leaf_nodes : 말단 노드(leaf node)의 최대 개수

결정 트리의 파라미터는 대부분 Overfitting(과적합)을 방지하기 위한 것입니다.
예를들어, max_depth 파라미터를 조정해 그림을 나타내면 다음과 같습니다.



✅ 결정 트리 Overfitting(과적합)

결정 트리는 직관적이라는 장점이 있지만, Overfitting에 취약하다는 단점이 있습니다.
즉, 이상치 데이터에도 조건을 부여해 학습 데이터에 너무 치우친다는 것입니다.

당연한 얘기지만, 학습 데이터에 과적합된 모델은 테스트 데이터에서 성능이 떨어질 수도 있습니다.
흔히, 과적합을 예방하기 위해 모델을 좀 더 일반화(generalization) 시킨다고 합니다.

결정 트리에서는 과적합 방지를 위해 다양한 파라미터가 있음을 앞에서 확인했습니다.
예를들어, 과적합 방지를 위해 min_samples_leaf=6으로 학습시켜보면 다음과 같이 나옵니다.

학습 데이터를 더 정확하게 맞추진 못했지만, 모델이 일반화가 더 잘 되었습니다.

이렇듯 결정 트리는 과적합에 주의해야할 필요가 있습니다.


✅ feature_importances_

제가 인공지능 관련 대회나 어떤 데이터를 분석할 때 사용하는 방법으로 DecisionTreeClassifier의 feature_importances_ 속성을 자주 이용합니다.

이는 피처의 중요도를 나타내는 값으로 모든 피처 중요도의 합은 1이 됩니다.
사용하는 방법은 다음과 같습니다.

import numpy as np
import seaborn as sns
%matplotlib inline

# feature_importances_ 추출
# dt_clf는 DecisionTreeClassifier를 학습 시킨 estimator
print("Feature importances:\n{0}".format(np.round(dt_clf.feature_importances_, 3)))

for name, value in zip(iris_data.feature_names, dt_clf.feature_importances_):
  print('{0} : {1:.3f}'.format(name, value))

sns.barplot(x=dt_clf.feature_importances_, y=iris_data.feature_names, palette='Pastel1')

feature_importances_는 한번에 피처의 개괄적인 중요도를 알 수 있지만, 이는 지니 계수를 기반으로 한 값이므로 전적으로 신뢰해서는 안됩니다.

profile
세종대학교 지능기전공학과 23

0개의 댓글