분류모델 | ① 의사결정나무 모델(Decision Tree Model)

 1. 의사결정나무 모델(Decision Tree Model) 

1. 개념

여러 조건의 X(feature) 값에 따라 데이터를 분류해보며,

데이터가 한 쪽으로 많이 치우쳐지는 방향에 맞춰 특정 조건을 계속 생성해가면서 학습시키는 알고리즘.

 

설명 변수들의 규칙, 관계, 패턴과 같은 여러 값들을 이용해서 목표변수를 분류하는 나무구조의 모델을 만들고,

새로운 값이 들어올때 생성된 나무구조에 의해 데이터를 분류하는 지도학습 알고리즘

 

2. 장단점

- 장점 : 결과 해석이 쉽다 / 대용량의 데이터 작동 / 비모수적(통계 조건을 만족하지 않아도 쉽게 사용 가능)

- 단점 : 분류 경계에서 오류 발생 가능성 / 과적합(Overfitting)

 

3. 예시

(공장 상품 제작 데이터) 정상(700)/불량(300) 분류

이때 [습도 70℃] 기준이 목표변수를 가장 명확하게 분류하므로, 해당 설명 변수를 기준으로 데이터를 계속해서 분류함.

 

4. 의사결정나무 모델의 Hyper parameter

  • Node : 데이터가 나뉘어지는 기점
  • Root Node : 나무구조가 시작되는 기점
  • Child Node : 상위 노드로부터 파생되어 나온 기점
  • Parent Node : 자식 노드의 상위 기점
  • Internal Node : 나무구조 중간에 위치한 기점들
  • Terminal Node(Leaf)
  • Branch : 최상위 기점에서부터, 맨 끝 기점까지 연결된 일련의 노드
  • Depth : 노드가 분할되어 내려가며 발생하는 나무구조의

5. 의사결정나무 모델에 따라 데이터를 분류하는 수학적 기준

  • Gini Index 지니 계수 : 불순도(데이터가 얼마나 잘 섞여있지 않은지)
  • Entropy Index 엔트로피 계수 : 불순도

 

 2. 실습 

1. 기본 라이브러리 설치 및 데이터 불러오기

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
import scipy.stats as stats

df1 = pd.read_csv('01_Contract_Data.csv')
df1.head()

 

2. 설명변수 및 목표변수 선언

# 데이터 값 변경
df1['Target'] = df1['State'].replace({'계약확정':0, '기간만료':0, '해약확정':1, '해약진행중':1})

# 문자열 변수 치환
X = pd.get_dummies(df1.drop(columns=['Index', 'Member_ID', 'State', 'Target', 'Datetime', 'Address2', 'Overdue_Type']))
Y = df1['Target']

 

3. 모델 학습 라이브러리 설치

from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.impute import SimpleImputer

from sklearn.model_selection import train_test_split

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import classification_report

 

4. 학습데이터, 검증데이터 선언

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=1234)

 

5. 파이프라인 구성

pipe_list = [('impute', SimpleImputer()), 
             ('model', DecisionTreeClassifier())]
pipe_model = Pipeline(pipe_list)

파이프라인 구성 이유

  1. 모델 파이프라인 구성: 여러 단계의 데이터 전처리 및 모델 학습 단계를 순차적으로 적용할 수 있습니다. 예를 들어, 데이터 전처리 단계(Feature Scaling, Feature Engineering 등)와 모델 학습 단계를 함께 묶어서 편리하게 사용할 수 있습니다.
  2. 코드 재사용: 같은 전처리 단계나 모델 학습 단계를 여러번 사용해야 할 때, Pipeline을 사용하여 코드를 간결하게 만들 수 있습니다. 이는 유지보수와 확장성을 높여줍니다.
  3. 모델 평가 및 최적화: Pipeline은 Cross-validation이나 Grid Search와 함께 사용될 수 있어 모델을 평가하고 최적화하는 과정을 자동화할 수 있습니다.

6. 하이퍼파라미터 설정

hyper_parameter = {'model__max_depth':range(5,10),
                   'model__criterion':['gini','entropy'],
                   'model__min_samples_split':range(5,10),
                   # 한쪽이 최소 몇개까지 남을 때까지 분류 가지 만들 것이냐 (과하면오버피팅)
                   'model__min_samples_leaf':range(5,10),
                   # 목표변수의 밸런스가 깨져있을 때 사용
                   'model__class_weight':['balanced', None]
                  }

grid_model = GridSearchCV(pipe_model, param_grid=hyper_parameter, 
                          cv=3, n_jobs=-1, scoring='f1')
# scoring : 어떤 지표를 주지표로 잡아 성능을 계산할지 결정할 수 있음.
			아무것도 안 썻을 때는 정확도를 기준으로 모델을 구성하기 때문에 정확도만 높은 모델이 등장하게 된 것.
grid_model.fit(X_train, Y_train)

 

7. 최적 모델을 적용한 학습/검증 데이터의 예측값 선언

best_model = grid_model.best_estimator_

Y_train_pred = best_model.predict(X_train)
Y_test_pred = best_model.predict(X_test)

 

8. 실제 데이터와 예측값 비교

print(classification_report(Y_train, Y_train_pred))
print(classification_report(Y_test, Y_test_pred))

 

 

번외 1. 생성된 트리를 그림으로 만들기

from sklearn.tree import plot_tree

plt.figure(figsize=[100,40])
plot_tree(best_model['model'], filled=True, feature_names=X_train.columns.tolist())
plt.savefig('tree_img.png')
plt.show()

번외 2. 설명변수의 중요도(feature importance) 확인

# 설명변수 중요도 feature importance :트리가 어떤 x를 기점으로 분류할때 가장 영향을 많이 미치나(0~1값)
df_importance = pd.DataFrame()

df_importance['Feature'] = X_train.columns
df_importance['importance'] = best_model['model'].feature_importances_

df_importance.sort_values(by='importance', ascending=False).head(10)