결정 트리란?


결정트리는 ML 알고리즘 중 직관적으로 이해하기 쉬운 알고리즘이다.

 

데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리 기반의 분류 규칙을 만드는 것이다.

 

일반적으로 규칙을 가장 쉽게 표현하는 방법은 if/else 기반으로 나타내는 것이다.

 

예를 들면 스무고개 게임과 유사하며 규칙 기반 프로그램에 적용되는 if, else를 자동으로 찾아내 예측을 위한 규칙을 만드는 알고리즘이다.

 

- Q1이 루트 노드가 된다.

- Q2, Q3가 규칙 노드가 된다.

- Q4, Q5, Q6, Q7이 규칙 노드가 된다.

- 빨간색으로 표시된 END1, END3, END5, END7이 결정이 된 분류값으로 리프 노드가 된다.

- 결정되지 않은 값인 END2, END4, END6, END8은 다시 규칙 노드가 되며 아래로 계속해서 노드가 생성된다.

- 트리의 깊이가 깊어질수록 과적합이 발생할 가능성이 있고 성능 저하를 초래할 수 있다

 

!! 따라서 가능한 적은 결정 노드로 최대한 많은 데이터 셋이 해당 분류에 속할 수 있도록 결정 노드의 규칙이 정해져야 하며, 이를 위해서 어.떻.게 트리를 분할할 것인가에 대한 기준을 정하는 것 가장 중요하다.

 

 

결정 노드의 정보 균일도


결정노드는 정보 균일도가 높은 데이터 셋을 먼저 선택할 수 있도로 규칙 조건을 만든다.

정보의 균일도를 측정하는 대표적 방법은 엔트로피를 이용한 정보 이득(Information Gain)지수와 지니 계수가 있다.

 

  • 정보 이득
    • 엔트로피를 기반으로 하며, 여기서 엔트로피는 주어진 데이터 집합의 혼잡도를 의미한다. 서로 다른 값이 섞여 있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피가 낮다. 정보 이득 지수는 1에서 엔트로피 지수를 뺀 값이다. 결정트리는 정보 이득 지수로 분할 기준을 정한다.
  • 지니 계수
    • 경제학에서 불평등 지수를 나타낼 때 사용하는 계수다. 경제학자인 코라도 지니의 이름에서 딴 계수로, 0이 가장 평등하고 1로 갈수로 불평등하다. 머신러닝에 적용될 때는 지니 계수가 낮을수록 데이터 균일도가 높은 것으로 해석된다. 따라서 결정트리는 지니 계수가 낮은 속성을 분할기준으로 정한다.

 

결정트리 알고리즘을 사이킷런에서 구현한 DecisionTreeClassifier는 기본으로 지니 계수를 이용해 데이터 셋을 분할한다. 

 

 

결정 트리 모델의 특징


결정 트리의 경우 '균일도'라는 룰을 기반으로 하고 있어, 알고리즘이 쉽고 직관적이다. 정보의 균일도만 신경 쓰면 되기에 특별한 경우를 제외하고, 각 피처의 스케일링과 정규화 같은 전처리 작업이 필요하지 않다. 

반면 결정 트리 모델의 가장 큰 단점으로는 과적합으로 인해 정확도가 떨어진다는 점이다.

 

모든 데이터의 상황을 만족하는 완벽한 규칙을 만들지 못하는 경우가 훨씬 많다. 정확도를 높이기 위해 계속해서 규칙을 추가할 경우 트리가 깊어지고, 커지고, 복잡해진다. 이렇게 될 경우 유연하게 대처할 수 없기에 예측 성능이 떨어진다. 따라서 완벽할 수 없다는 것을 인정하면 더 나은 성능을 보장할 가능성이 높다. 즉, 트리의 크기를 사전에 제한하는 것이 오히려 성능 튜닝에 더 도움이 된다.

 

 

결정 트리 파라미터


사이킷런은 결정 트리 알고리즘을 구현한 두 가지 클래스를 제공한다.

  • DecisionTreeClassifier
    • 분류를 위한 클래스

 

  • DeicsionTreeRegressor
    • 회귀를 위한 클래스

 

DecisionTreeClassifier와 DeicsionTreeRegressor는 모두 동일한 파라미터를 사용한다.

  • min_samples_split
    • 노드를 분할하기 위한 최소한의 샘플 데이터 수로 과적합을 제어하는 데 사용
    • 디폴트는 2고 작게 설정할수록 분할되는 노드가 많아져서 과적합 가능성 증가
    • 과적합을 제어. 1로 설정할 경우 분할되는 노드가 많아져 과적합 가능성 증가

 

  • min_samples_leaf
    • 말단 노드가 되기 위한 최소한의 샘플 데이터 수
    • min_samples_split과 유사하게 과적합 제어 용도. 그러나 비대칭(imbalanced) 데이터의 경우 특정 클래스의 데이터가 극도로 작을 수 있으므로 이 경우는 작게 설정 필요

 

  • max_features
    • 최적의 분할을 위해 고려할 최대 피처 개수. 디폴트는 None으로 데이터 셋의 모든 피처를 사용해 분할 수행

 

  • max_depth
    • 트리의 최대 깊이 규정, 디폴트는 None
    • None으로 설정하면 완벽하게 클래스 결정 값이 될 때까지 깊이를 계속 키우며 분할하거나, 노드가 가지는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이를 증가시킴

 

  • max_leaf_nodes
    • 말단 노드의 최대 개수

 

결정 트리 모델의 시각화


Graphviz 패키지를 사용해서 가능하다. 사이킷런은 Graphviz 패키지와 쉽게 인터페이스할 수 있도록 export_graphviz() API를 제공한다.

 

export_graphviz()는 함수 인자로 학습이 완료된 Estimator, 피처의 이름 리스트, 레이블 이름 리스트를 입력하면 학습된 결정 트리 규칙을 실제 트리 형태로 시각화해 보여준다.

 

 

 

결정트리의 하이퍼파라미터


하이퍼 파라미터의 경우 과적합이 쉽게 되는 결정 트리 알고리즘을 제어하기 위해 사용되며, 복잡한 트리가 생성되는 것을 막는다. 

 

  • max_dpeth 하이퍼 파라미터
    • max_depth의 경우 결정 트리의 최대 깊이를 제어하며, 만약 더 작은 수로 깊이를 설정할 경우 더 간단한 결정 트리가 된다.
  • min_samples_split 하이퍼 파라미터
    • 자식 규칙 노드를 분할해 만들기 위한 최소한의 샘플 데이터 개수

만약 min_samples_splits 하이퍼 파라미터 값을 4로 설정한 경우 다음과 같은 결정트리 그래프가 생성된다.

표시된 사선 박스를 확인하면 [0, 2, 1]과 [0, 1, 2]로 서로 상이한 클래스 값이 있어도 더 이상 분할하지 않고 리프 노드가 된다. 

 

만약 min_samples_splits 하이퍼 파라미터 값을 5로 지정해주면 다음과 같은 결정트리 그래프가 생성된다.

앞서 보인 그래프와 달리 깊이가 1 증가하면서 추가적인 노드가 생성되어 모든 분류가 진행된 것을 확인할 수 있다.

 

  • min_samples_leaf 하이퍼 파라미터
    • 해당 파라미터의 값을 키울 경우 더 이상 분할하지 않고, 리프 노드가 될 수 있는 조언이 완화된다. 즉, 지정 값 기준만 만족하면 리프노드가 된다

예시로는 min_samples_leaf 값을 4로 설정할 경우 샘플이 4이하이면 리프 노드가 되기에, 지니 계수 값이 크더라도 이를 무시한다.

Sample이 4이상인 노드는 리프 클래스 노드가 될 수 있음므로 규칙이 sample 4인 노드를 만들 수 있는 상황을 반영하여 변경된다.

 

 

결정 트리의 경우 어떤 속성을 규칙 조건으로 선택하느냐가 중요한 요건이다.

 

Feature의 중요 역할 지표


사이킷런에서는 결정트리 알고리즘이 학습을 통해 규칙을 정하는 데 있어 피처의 중요한 역할 지표를 DecisionTreeClassifier 객체의 feature_importances_ 속성으로 제공한다.

 

피처의 값이 높을 수록 중요도가 높음을 의미하고 예시는 다음과 같다.

 

네 가지 피쳐중 petal length에 해당하는 피처가 가장 중요도가 높음을 알 수 있다.

 

Reference


[1] 파이썬 머신러닝 완벽가이드

+ Recent posts