머신러닝

의사결정트리( Decision Tree )

ROSEV 2021. 8. 9. 10:01

사이킷런의 파이프라인

결측치 처리, 스케일링, 모델학습 등을 파이프라인을 통해 한번에 처리할 수 있습니다.

이를 통해 가독성을 높이면서, 중복코드를 최소화할 수 있습니다.

 

from category_encoders import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline


pipe = make_pipeline(
    OneHotEncoder(), 
    SimpleImputer(), 
    StandardScaler(), 
    LinearRegression(n_jobs=-1))  # 선형회귀

 

사이킷런의 결정트리

지도학습 모델중 하나로, 속성들을 기준으로 데이터를 분류해가며 그 모양새가 나무의 가지와 비슷하여 걸정트리라는 이름을 갖게 되었습니다. 아래 그림과 같이 속성이 범주형이면 범주형자료내 카디널리티로 분류하거나 , 수치형이면 수치로 나누어 분류하여 정답을 찾아가는 과정이라고 할 수 있습니다.

출처 : 텐서 플로우 블로그

 

의사결정트리는 회귀모델과 분류모델 둘다 사용이 가능합니다. 하지만 범주형을 예측할 때 이진형을 예측하는지 혹은 더 많은 유형의 범주를 예측하는지에 따라 사용되는 알고리즘은 나뉠 수 있습니다.

 

의사결정트리 with Python

from sklearn.tree import DecisionTreeClassifier

pipe = make_pipeline(
    OneHotEncoder(use_cat_names=True), 
    SimpleImputer(), 
    DecisionTreeClassifier(random_state=42, criterion='entropy')
)

# pipe 내 DecisionTreeClassifier만 수정하였습니다.

 


의사결정트리의 분할 방법

노드를 어떤 기준으로 분할했을 때 잘 분류가 되는지를 확인하기 위해서는 분류 되었을 때 평가를 합니다. 평가 방법은 불순도라는 개념을 활용합니다. 분류 했을 때 데이터 내 클래스(A, B)의 비율이 유사하다면 불순도가 높은 것이며, 반면 분류가 잘 되었을 때는 한쪽 클래스 (A)의 비율이 높다고 하다면 불순도가 낮다고 말할 수 있습니다. 불순도는 총 3가지 방법으로 나타낼 수 있으며 그 중 2가지 방법만 소개하려 고합니다.

 

1. 엔트로피 = 불순도를 나타내는 척도 ( C4.5, 5.0 알고리즘에서 사용)

엔트로피 공식
위 그림의 전체 엔트로피
선으로 분류 했을 때 엔트로피

  • 0.95에서 0.75로 불순도가 낮아 진 것을 볼 수 있습니다 즉, 클래스의 분류가 한쪽으로 조금 기울었다는 의미이며 분류가 기존보다 더 잘되었다는 의미로 해석할 수 있습니다.

 

2. 지니계수 = 불순도를 나타내는 척도 ( CART 알고리즘 - 이진분류 에서 사용 ) 

 

 

좌측의 지니계수는 1 - ( (7/12)^2 + (5/10)^2 ) = 0.40

(파란색 공 /왼쪽공의 총 개수) + (파란색 공/오른쪽공의 총개수)

 

우측 그림에서의 지니계수는 1 - [ (0/10)^2 + (9/11)^2 ] = 0.33

(주황색 공/왼쪽공의 총 개수) + (주황색 공/오른쪽공의 총개수)

 

  • 지니계수가 더 낮은 우측이 더 분류가 더 잘되어있다고 말할 수 있습니다.

 

정보획득량(Information Gain) = entropy(parent) - [weighted average] entropy(children)

 

의사결정 트리는 정보획득량이 최대화 하는 방법으로 학습이 진행되며, 어떠한 속성(키, 몸무게 등)의 어느 수치적인 부분에서 정보 획득량이 최대화 되는지 판단하고 진행합니다.

 

 

분할 전 엔트로피 /  출처 https://gomguard.tistory.com/86

 

좌,우로 분할 후 엔트로피 /  출처 https://gomguard.tistory.com/86

 

  • G(S) = 1.558 - 1.485 = 0.07정도 엔트로피 감소, 즉 정보 획득량이 0.07이며 분할한 것이 더낫다고 볼 수 있습니다.

 

트리 알고리즘 비교

  CART C4.5 CHAID
분류 트리 O O O
회귀 트리 O O X
예측변수 범주, 수치 범주, 수치 범주
불순도 알고리즘 Gini Index Entropy Chi-square, 통계량
분리 Binary Multi-way Multi-way

 

 

의사결정트리를 통한 특성중요도 with Python

 

def plot_feature_importances_cancer(model):
    n_features = cancer.data.shape[1]
    plt.barh(range(n_features), model.feature_importances_, align='center')
    plt.yticks(np.arange(n_features), cancer.feature_names)
    plt.xlabel("특성 중요도")
    plt.ylabel("특성")
    plt.ylim(-1, n_features)

plot_feature_importances_cancer(tree)

 

출처 텐서플로우 블로그

선형모델에서는 종속변수와의 관계를 회귀계수(coefficients)를 통해 알 수 있었지만, 결정트리에서는 특성중요도를 통해 확인해야 합니다. 회귀 계수와는 다르게, 특성중요도는 항상 양수값을 갖으며, 이 값을 통해  얼마나 일찍 자주 분기에 사용되는지 결정됩니다.

 

 

선형회귀모델과 의사결정트리의 차이

  • 선형회귀와 다르게, 데이터의 분포가 선형이 아닌 비선형, 비단조 등의 용의합니다
  • 선형회귀는 속성 끼리의 다중공선성의 문제로 인해 학습이 잘 되지 않거나 혹은 유사성이 있을 때의 계수 해석이 어려울 수 있지만, 결정트리의 경우 이러한 문제를 자동으로 해결하는 특징이 있습니다.