반응형
Index
분류(Classification)모델은 이산형(Discrete), 범주형(Categorical)한 변수를 예측하는 분야로 KNN, SVM 과 같이 고전적인 방법, Logistic Regression, 딥러닝 분야의 Neural Network, 여러가지 ML모델을 결합한 Ensemble등 다양한 모델이 있다.
그중에서 이번 포스팅에서는 '데이터의 균일도' 를 기반으로 분류하는 모델인 Decision Tree 모델에 대해 정리한다.
일반적으로 음성/텍스트(NLP)/이미지 등의 데이터셋에는 신경망 구조의 딥러닝 모델이 강력하고, Tabular 형식의 정형 데이터의 분류에는 앙상블(Ensemble) 모델이 높은 성능으로 자주 사용되고 있다.
1. Decision Tree 개요
- 스무고개와 같이 Rule 기반으로 if/else 규칙을 자동으로 찾아내 학습하는 알고리즘
- if/else 규칙 조건이 되는 규칙노드(Decision Node) 와 클래스로 결정된 값이 되는 리프노트(Leaf Node)로 구성됨
- Sub Tree가 많을수록 Depth 가 깊다고 표현하며, 결정방식이 복잡해 과적합으로 이어지기 쉽다. (예측 성능 ↓)
- "정보의 균일도" 를 기준으로 데이터 분류 규칙을 생성하고, 정보균일도는 ①지니계수 ②정보이득 계수를 이용한다
- 정보의 균일도가 높은 데이터가 먼저 분류되도록한다. 예를들어 공 색깔이 빨/노/파, 모양이 □/△/○ 있고 노랑색이 네모만 있다면? → 첫 번째 규칙은, if color is yellow 가 되겠다.
- 장점: 균일도 기반이라 학습이 쉽고, 전처리 필요없고, 직관적이고, 해석가능성이크다. 단점: 데이터가 새로 생길 수록 트리의 깊이가 계속 깊어진다. → Overfitting 방지를 위해 트리의 크기를 사전에 제한해야한다.
2. Decision Tree 의 Parameter
- min_samples_split : 노드 분할을 위한 최소 샘플데이터 수. 이 숫자보다 작으면 더이상 노드를 추가하지 않는다. 이 값이 클수록 노드 분할을 많이 하지 못한다.
- min_samples_leaf : 리프노드(결정노드)가 되기 위한 최소 샘플 데이터 수, 이 숫자보다 작으면 리프가 될 수 없다. 즉, 이 값이 클수록 함부로 분할할 수 없게 된다.
- max_features : 최대 피쳐개수. 즉, 규칙노드에서 데이터셋이 가지고 있는 피쳐중, 정해진 개수만큼만 사용
- max_depth : 최대 깊이
- max_leaf_nodes : 최대 리프노드 개수
3. Decision Tree 결과 시각화, 피쳐 중요도 파악
- Decision Tree 결과 시각화 및 해석
Decision Tree 의 결과값은 graphviz 라는 패키지를 통해 시각화할 수 있다.
# Graphviz 를 통합 시각화
from sklearn.tree import export_graphviz
export_graphviz(dt_clf, out_file="tree.dot", class_names=iris_data.target_names, feature_names = iris_data.feature_names, impurity=True, filled=True)
import graphviz
with open("tree.dot") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
- petal width, length 등 피쳐에 대한 조건문이 있어야 규칙노드
- value 값은 각 레이블의 클래스값에 대한 갯수로 하나의 클래스값만 갖으면 리프토드
- gini 계수는 낮을수록 균일도가 높다. gini=0 이면 리프노드
- class = virginica 의 뜻은 virginica 클래스의 데이터가 가장 많다는 것
- 각 노드의 색깔은 Class 별로 다르고, 진할수록 지니계수가 낮은 것
- Decision Tree 의 피쳐 중요도 확인
아래와 같이 Decision Tree 객체는 feature_importances_ 라는 내장된 매서드를 통해 중요도를 반환받을 수 있다.
# 피쳐 중요도 추출
print("Feature importances:{0}".format(np.round(dt_clf.feature_importances_,3)))
결과값 : Feature importances:[0.025 0. 0.555 0.42 ]
반응형
'Study > ML' 카테고리의 다른 글
7. 앙상블(Ensemble) - 부스팅(Boosting) (0) | 2023.05.28 |
---|---|
6. 앙상블(Ensemble) - 보팅(Voting),배깅(Bagging) (0) | 2023.05.28 |
4. 성능 평가 (Evaluation) - Classification 평가방법 (0) | 2023.05.27 |
3. 데이터의 전처리 (Pre-processing) (1) | 2023.05.27 |
2. 교차검증 (Cross-Validation) (1) | 2023.05.26 |
댓글