머신러닝 : Decision Tree

hisungmi·2024년 10월 1일

AI

목록 보기
5/15

Decison Tree

  • 결정 트리, 의사 결정 나무
  • 분류와 회귀 모두에 사용되는 지도학습 알고리즘
  • 분석 과정이 직관적이며, 이해아 설명이 쉬움
  • 화이트박스 모델 : 모델의 내부를 눈으로 확인가능

    단점
    과적합으로 모델 성능이 떨어지기 쉬움
    트리 깊이 제한이 필요 (=가지치기,튜닝)

용어

Root Node : 뿌리, 시작 마디
Child Node : 자식, 하나로부터 분리된 2개 이상 마디
Parent Node : 부모, 주어진 마디의 상위 마디
Terminal Node : 끝, 자식이 없는 마디 (=Leaf Node)
Internal Node: 중간, 부모 마디와 자식 마디가 모두 있는 마디
Branch: 가지, 연결되어 있는 2개 이상의 마디 집합
Depth: 깊이, 뿌리 마디로부터 끝 마디까지 연결된 마디 개수(오른쪽 트리의 경우 5)


트리 해석

결정트리 분류 - 마지막 노드에 있는 샘플들의 최빈값을 예측값으로 반환
➡️ 불순도
결정트리 회귀 - 평균을 예측값으로 반환
➡️ MSE


불순도(Impurity)

  • 트리를 분기하는 기준
  • 해당 범주 안에 서로 다른 데이터가 얼마나 섞여있는지
  • 다양한 개체일수록 불순도가 높아짐

❗불순도를 감소하도록 설정해야함


정보 이득(Information Gain)

  • 분기 이전의 불순도와 이후 불순도 차이

Gain(T,X)=Entropy(T)ENTROPY(T,X)Gain(T,X)=Entropy(T)-ENTROPY(T,X)

  1. 모든 속성에 대해 분할한 후 정보 이득 계산
  2. 정보 이득이 가장 큰 속성부터 분할

💡 정보이득이 크다 = 어떤 속성으로 분할할때 불순도가 줄어든다

엔트로피(Entropy)

  • 속성의 불순도
  • 0~1 사이의 값
    • 완벽분류 ➡️ 0
    • 완벽하게 섞이면 ➡️ 1

지니(Gini)

정보이득의 최대화 ➡️ 불순도의 감소 ➡️ 엔트로피의 감소

지니불순도=1(양성클래스비2+음성클래스비2)지니 불순도 = 1 - (양성클래스비율^2+음성클래스비율^2)

특징

  1. 낮을수록 순도가 높음
  2. 0 ~ 0.5 사이의 값
    • 완벽분류 ➡️ 0
    • 완벽하게 섞이면 ➡️ 0.5
  3. 낮은 속성으로 의사결정 트리 노드 결정

가지치기

💡목적 : 일반화 시키기위해, 과적합이 일어나지 않게하기위해

  • 여러 하이퍼파라미터 값을 조정해 가지치기 할 수 있음
    • max_depth, min_samples_leaf, min_samples_split 등
  • 학습 데이터에 대한 성능은 낮아지나, 평가 데이터에 대한 성능을 높일 수 있음
  • 가장 적절한 하이퍼파라미터 값을 찾도록 노력해야 함

시각화

plot_tree

  • 적절한 figsize 설정 필요
  • 불순도가 낮을수록 진한색
# 시각화 모듈 불러오기
from sklearn.tree import plot_tree
fig = plt.figure(figsize=(12, 10))
plot_tree(model,
		  filled=True,
		  feature_names=list(x),
		  class_names=['setosa', 'versicolor', 'virginica'],
		  fontsize=10)
plt.show()

export_graphviz

  • 과정 복잡
  • 가독성있는 시각화 가능
# 시각화 모듈 불러오기
from sklearn.tree import export_graphviz

# 이미지 파일 만들기
export_graphviz(model,
				filled=True,
				feature_names=list(x),
				class_names=['setosa', 'versicolor', 'virginica'],
				rounded=True,
				precision=3,
				out_file='tree.dot')
                
!dot tree.dot -Tpng -otree.png -Gdpi=300

# 이미지 파일 로딩
from IPython.display import Image
Image(filename='tree.png', width=600) 

변수 중요도 시각화

• featureimportances속성 값으로 변수 중요도 확인
• Feature 순서대로 값을 가짐
• 값이 클 수록 Feature의 중요도가 높음
• 트리 구성에 중요한 역할을 한 변수를 시각화해서 확인할 수 있음
• 가로 막대 또는 세로 막대 그래프로 시각화

# 변수 중요도 시각화
plt.figure(figsize=(6, 8))
plt.barh(list(x), model.feature_importances_)
plt.ylabel('Features')
plt.xlabel('Importances')
plt.show()

회귀 모델 구현

• 알고리즘 함수: sklearn.tree.DecisionTreeRegressor
• 성능평가 함수: sklearn.metrics.mean_absolute_error, sklearn.metrics.r2_score

# 불러오기
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_absolute_error, r2_score

# 선언하기
model = DecisionTreeRegressor(max_depth=5)

# 학습하기
model.fit(x_train, y_train)

# 예측하기
y_pred = model.predict(x_test)

# 평가하기
print(mean_absolute_error(y_test, y_pred))
print(r2_score(y_test, y_pred))

분류 모델 구현

• 알고리즘 함수: sklearn.tree.DecisionTreeClassifier
• 성능평가 함수: sklearn.metrics.confusion_matrix, sklearn.metrics.classification_report

# 불러오기
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, classification_report

# 선언하기
model = DecisionTreeClassifier(max_depth=5)

# 학습하기
model.fit(x_train, y_train)

# 예측하기
y_pred = model.predict(x_test)

# 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
profile
난 성미다.

0개의 댓글