결정 트리(Decision Tree)란?

  • 학습을 통해 데이터에 있는 규칙을 찾고 트리 기반의 분류 규칙을 만드는 직관적인 알고리즘
  • 장점 : 알고리즘이 쉽고 직관적임, 피처의 스케일링이나 정규화 등의 사전 가공 영향도가 크지 않음.
  • 단점 : 과적합으로 알고리즘 성능이 떨어짐. 이를 극복하기 위해 트리의 크기를 사전에 제한하는 튜닝 필요

 

사이킷런을 이용한 결정 트리 알고리즘 구현

  • 분류를 위한 DecisionTreeClassifier, 회귀를 위한 DecisionTreeRegressor 를 제공
  • CART(Classification And Regression Trees) 알고리즘을 기반으로 함.

 

결정 트리 파라미터

파라미터 명 설명
min_samples_split - 노드를 분할하기 위한 최소한의 샘플 데이터 수
- 디폴트는 2, 작게 설정할수록 분할되는 노드가 많아져서 과적합 가능성 증가
min_samples_leaf - 분할이 될 경우 왼쪽과 오른쪽 브랜치 노드에서 가져야 할 최소한의 샘플 데이터 수
- 큰 값으로 설정될수록 노드 분할을 덜 수행함.
- 비대칭적 데이터의 경우 작게 설정 필요.
max_features - 최적의 분할을 위해 고려할 최대 피처 개수
- 디폴트는 None으로 모든 피처를 사용해 분할 수행
- int 형으로 지정하면 대상 피처의 수, float 형으로 지정하면 대상 피처의 퍼센트
- 'squrt', 'auto', 'log' 등
max_depth - 트리의 최대 깊이를 규정
- 디폴트는 None으로 다른 과적합 규제 장치가 없으면 완벽하게 클래스 결정 값이 될 때까지 분할
max_leaf_nodes - 말단 노드(Leaf)의 최대 개수

 

구현

# 필요한 모듈 다운로드
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

# 붓꽃 데이터 로드
iris_data = load_iris()

# train/test set 분리
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size = 0.2, random_state = 12)

# DecisionTree 분류기 생성
dt_clf = DecisionTreeClassifier(random_state = 123)

# 분류기 학습
dt_clf.fit(x_train, y_train)

 

피처별 중요도 확인

import seaborn as sns
import numpy as np
%matplotlib inline

# feature importance 추출
print('Feature importances: ', dt_clf.feature_importances_)

# feature별 importance 매핑
for name, value in zip(iris_data.feature_names, dt_clf.feature_importances_):
    print(f'{name} : {value}')

# feature importance를 column별로 시각화
sns.barplot(x = dt_clf.feature_importances_, y = iris_data.feature_names)

 

[OUTPUT]

Feature importances: [0.01250782 0.03001876 0.90481856 0.05265486]
sepal length (cm) : 0.012507817385866166
sepal width (cm) : 0.030018761726078806
petal length (cm) : 0.9048185603807258
petal width (cm) : 0.05265486050732925


+ Recent posts