AI/MachineLearning

의사결정트리(Decision Tree)

oaho 2023. 2. 24. 11:02
반응형
의사결정트리(Decision Tree) 개념

: 어떤 규칙을 하나의 트리(tree) 형태로 표현한 후 이를 바탕으로 분류회귀 문제를 해결하는 것

 

 

📌 불순도(Impurity)를 수치화 할 수 있는 지표

 

🔸 지니 불순도(Gini Impurity) : 분류 후에 얼마나 잘 분류했는지 평가하는 지표(얼마나 순도가 증가했는지, 불순도가 감소했는지) 

         - 이진 분류로 나뉠 때 사용

         - 지니 불순도가 낮을수록 순도가 높다.

         - 0~0.5 사이의 값 ( 완벽하게 분류되면 -> 0, 완벽하게 섞인다면 ->0.5)

         - 지니 불순도가 낮은 속성으로 의사결정 트리 노드 결정

 

 

🔸 엔트로피(Entropy) 

- 개념 : 어떤 목적 달성을 위한 경우의 수를 정량적으로 표현하는 수치

ex) A반 학생 10명을 소풍 장소로 이동시키기 원한다고 가정하자.

    -> 큰 버스 1대로 이동할 경우 경우의 수는 1개이지만, 자전거 10대로 이동한다면 10!(=3,628,800) 만큼의 경우의 수가 나타난다. 결론적으로 버스 1대보다 자전거 10대로 이동하는 경우가 훨씬 엔트로피가 크다고 할 수 있다.

     => 결론 : 엔트로피는 작을수록 경우의 수가 적다, 낮은 엔트로피는 낮은 불확실성을, 높은 엔트로피는 높은 불확실성을 의미한다. 

 

   엔트로피가 작다면 우리가 얻을 수 있는 정보가 많으면서도 확실하다고 할 수 있다.

 

 

 

정보이득(Information Gain)

 

 

  • 정보 이득이 크다 = 어떤 속성으로 분할할 때 불순도가 줄어든다.
  • 정보 속성에 대해 분할한 후 정보 이득 계산
  • 정보 이득이 가장 큰 속성부터 분할

 

 

 

트리 가지치기

 

가지치기를 하지 않으면 모델이 학습 데이터에는 매우 잘 맞지만, 평가 데이터에는 잘 맞지 않는다. ->과대적합

만약 1개로 이루어진 잎 노드(클래스의 마지막 노드)가 많을 경우 해당 의사결정트리는 과대적합되어 있는 상태라고 할 수 있다.

 

=> 문제 해결 : 트리 가지치기(tree pruning)

 

 

 

🔸사전 가지치기(pre-pruning)

: 처음 트리를 만들 때 애초에 트리의 깊이나 마지막 노드의 최소 개수 등을 사전에 결정하여 입력하는 방식

하이퍼 매개변수로 모든 값을 입력해야 한다.

사용자가 직관에 의해 값을 입력하면 중요한 속성 값을 놓치거나 과소적합 문제가 발생할 수 있다.

 

 

🔸사후 가지치기(post-pruning)

: 트리를 먼저 생성한 후 실험적으로 하이퍼 매개변수를 조정하는 방식

'최종 노드의 개수', '트리의 깊이', '선택되는 속성의 개수'등을 하이퍼 매개변수로 보고 이를 조정하여 성능을 조정한다.

성능을 측정하기 위해서는 먼저 전체 데이터를 훈련셋(train set), 검증셋(validation set), 테스트셋(test set)으로 분류 -> 훈련셋과 테스트셋을 사용하여 성능 비교

-> 훈련 셋 , 테스트 셋의 오차율을 보면서 하이퍼 매개변수에 적합한 값을 선정

 

 

 

🔹 주요 하이퍼파라미터

 

max_depth : 트리의 최대 깊이 ⭐

                            계속 분할되면 트리 깊이가 너무 깊어져 과적합이 발생할 수 있으니 적절한 값 설정 필요

min_samples_split : 노드를 분할하기 위한 최소한의 샘플 개수(기본값 : 2) ⭐

min_samples_leaf : 리프 노드가 되기 위한 최소한의 샘플수(기본값: 1) ⭐

max_feature : 최선의 분할을 위해 고려할 Feature수(기본값 : None)

                         기본값으로 설정하면 모든 Featuren를 사용해서 분할 수행

max_leaf_node : 리프 노드 최대 개수

 

 

 

 

모델링

 

1. 불러오기

 

🔸 분류문제

import sklearn.tree import DecisionClassifier

 

🔸 회귀문제

import sklearn.tree import DecisionTreeRegressor

 

2. 선언하기

model = DecisionTreeClassifier(max_depth=5, random_state=1)

 

3. 학습하기

model.fit(x_train, y_train)

 

4. 예측하기

y_pred = model.predict(x_test)

 

5. 평가하기 -  회귀문제

print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

 

 

🔷 의사결정트리 시각화하기

Decision Tree는 시각화를 통해 모델이 어떻게 작동하는 지 확인할 수 있다.

Graphvis 패키지 사용

 

1. 시각화 모듈 불러오기

from sklearn.tree import export_graphviz
from IPython.display import Image

 

2. 이미지 파일 만들기

export_graphviz(model,                           # 모델 이름
                out_file='tree.dot',             # 파일 이름 
                feature_names = x.columns,        # Feature 이름
                class_names =['die', 'survived'],   # Target Class 이름
                rounded=True,                      # 둥근 테두리
                max_depth=3,                       # 어디까지 보여줄지
                precision=2,             # 불순도 소숫점 자리수
                filled=True)             # 박스 내부 채우기

# 파일 변환
!dot tree.dot -Tpng -otree.png

# 이미지 파일 표시
Image(filename='tree.png')

 

출력 :

 

 

 

=> 하나의 속성에 대해서 어떤 기준으로 가지가 발생했는지 알 수 있고, 각 가지마다 데이터의 개수가 어떻게 나누어지는지도 확인할 수 있다.

 

 

 

🔷 변수(피쳐) 중요도 시각화

 

입력:

model.feature_importances_

 

출력:

 

 

입력:

plt.barh(list(x), model.feature_importances_)
plt.show()

 

출력:

 

 

 

 

 

 

 

 

 

머신러닝 - 분류모델 (Confusion Matrix, Accuracy, Precision, Recall, F1_Score)

Confusion Matrix TN(True Negative) : 예측값과 실제값이 모두 0으로 동일할 때, 즉 모델의 예측값이 정답이고 예측 대상이 0일 때 TP(True Positive) : 예측값과 실제값이 모두 0으로 동일할 때, 즉 모델의 예측

oaho.tistory.com

 

 

Reference 

: 데이터 과학을 위한 파이썬 머신러닝, 한빛아카데미, 최성철

반응형