본문 바로가기

Study doc./Machine Learning

[ML] 결정트리(Decision Tree) 한 번에 정리하기

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

 

순서

  1. 결정트리 알고리즘의 개념
    1. 개념
    2. 구조
  2. 하이퍼파라미터 튜닝
  3. 특성중요도

 


 

 

1. 결정트리 알고리즘의 개념

1-1. 개념

결정트리 알고리즘을 한 마디로 설명하면 스무고개 입니다.

그런데 기가막히게 예리한 질문지들을 척척 만들어내는 녀석입니다.

 

예를 들어 강아지, 고양이, 새 사진이 각각 100장씩 섞여있는 그룹에서 이 세 가지를 정확하게 분류하려면 어떤 질문들이 필요할까요?

일단 날개가 있는지로 새를 정확하게 분류할 수 있을 것 같습니다.

그리고 날개가 없는 강아지와 고양이는 눈동자의 모양이 날카로운지에 따라 분류할 수 있을 것입니다.

하지만 이 기준으로 강아지와 고양이를 100% 분류할 수 없기 때문에 추가적으로 다른 질문을 해야합니다.

발톱이 날카로운지,, 발바닥이 분홍색인지,, 

 

이렇게 여러가지 질문들을 통해 분류해내는 기법을 결정트리 알고리즘이라 합니다.

여기에 더해, 컴퓨터는 최대한 적은 질문을 통해 정확하게 분류하는 것을 목표로 합니다.

따라서 같은 기준들로 분류하더라도 그 순서가 매우 중요하게 여겨집니다.

 

물론 모든 과정은 컴퓨터가 수행하기 때문에 우리는 수행된 결과를 해석하는 방법만 알면 됩니다.

이를 위해 일단 구조를 파악합시다.

 

1-2. 구조

https://medium.com/datadriveninvestor/decision-tree-algorithm-with-hands-on-example-e6c2afb40d38

 

결정트리는 여러가지 노드로 분할됩니다.

가장 처음으로 분류해야 할 대상이 될 노드를 루트노드(Root Node) 라고 합니다.

그리고 어떤 기준을 통해 분류되는 노드를 규칙노드(Decision Node), 더 이상 분류되지 않는 최종 노드를 리프 노드(Leaf Node) 라고 합니다.

 

여기서 중요한 점은 분할될때마다 최대한 '잘' 분할되어야 하는 것인데요, 그것을 '지니(Gini) 계수'를 통해 확인할 수 있습니다.

지니계수는 경제학에서 불평등 지수로 사용하는 계수인데, 0으로 갈수록 평등하고 1로 갈수록 불평등합니다.

머신러닝에서는 0으로 갈수록 데이터 균일도가 높으것으로 해석되기 때문에 0과 가까울수록 잘 분할되었다고 해석할 수 있습니다.

 

지금까지 결정트리 알고리즘의 개념과 구조에 대해서 알아봤습니다.

언뜻 보기에는 사용하기도 쉽고 간단한 모델 같지만, 결정적인 단점이 존재합니다.

바로 '과적합 되기 쉽다' 라는 점인데요, 데이터를 정확하게 분류하기 위해 만든 기준이 새로운 데이터에는 잘 맞지 않을 수 있기 때문입니다. 

따라서 우리는 하이퍼파라미터 튜닝을 통해 이런 과적합을 극복해야 합니다.

 

2. 하이퍼파라미터 튜닝

▶ min_samples_split [default = 2] : 노드를 분할하기 위한 최소한의 샘플 데이터 수

        이 정도는 돼야 더 이상 노드를 분할하지 않겠다!! 

        높은 값을 부여할수록 과적합을 막을 수 있음

 

 max_depth [default = None] : 트리 최대 깊이

        깊이가 깊어질수록 과적합 위험

 

max_features [default = None] : 고려할 최대 피처 개수

        None : 전체 피처

        sqrt (=auto) : sqrt(전체 피처개수)

        log : log2(전체 피처개수)

 

 

3. 특성 중요도

결정 트리 알고리즘에서는 특성이 기준이 되기 때문에, 특성이 많은 데이터의 경우에는 사용되지 않는 특성이 있을 수 있습니다.

그런 논리로 특성마다 머신러닝에 기여한 정도가 다를 수 있는데, 이걸 한 눈에 볼수 있는 메서드를 지원합니다.

from sklearn.tree import DecisionTreeClassifier
import seaborn as sns

dt_clf = DecisionTreeClassifier(random_state=11)
dt_clf.fit(X_train, y_train)

# 배열형태로 반환
ft_importance_values = dt_clf.feature_importances_

# 정렬과 시각화를 쉽게 하기 위해 series 전환
ft_series = pd.Series(ft_importance_values, index = X_train.columns)
ft_top20 = ft_series.sort_values(ascending=False)[:20]

# 시각화
plt.figure(figsize=(8,6))
plt.title('Feature Importance Top 20')
sns.barplot(x=ft_top20, y=ft_top20.index)
plt.show()

 

'Study doc. > Machine Learning' 카테고리의 다른 글

[ML] 스태킹(Stacking) 완벽 정리  (2) 2020.08.11
[ML] LightGBM 이해하고 사용하자  (0) 2020.08.03
[ML] Logistic Regression  (0) 2020.06.22
[ML] Linear Regression  (0) 2020.06.21
[ML] XGBoost 이해하고 사용하자  (0) 2020.06.05