[파머완 4장] 1. 분류의 개요 2. 결정 트리
4. 분류(Classification)
: 기존 데이터가 어떤 레이블에 속하는지 학습한 뒤에 새롭게 관측된 데이터에 대한 레이블을 판별하는 것
책에서는 앙상블 방법(Ensemble Method)을 집중적으로 다룬다. 정형 데이터의 예측 분석 영역에서는 앙상블이 매우 높은 예측 성능을 보이고 있다
앙상블 방식
: 서로 다른 또는 같은 알고리즘을 결합한다
여러 개의 약한 학습기(성능이 상대적으로 떨어지는)를 결합해 확률적 보완과 오류가 발생한 부분에 대한 가중치를 계속 업데이트하면서 예측 성능을 향상시킨다
- 배깅(Bagging) - 랜덤 포레스트
- 부스팅(Boosting) - 그래디언트 부스팅, XgBoost, LightGBM
1) 결정 트리
: 데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리 기반의 분류 규칙을 만드는 것
- 규칙 노드(Decision Node) : 규칙 조건
- 리프 노드(Leaf Node) : 결정된 클래스 값, 자식 노드가 없는 노드
- 브랜치 노드(Branch Node) : 자식 노드가 있는 노
- 서브 트리(Sub Tree) : 새로운 규칙 조건마다 생성된다
많은 규칙이 있다는 것은 분류 방식이 복잡해진다는 것을 의미하고, 이는 과적합으로 이어지기 쉽다
트리의 깊이가 깊어질수록 예측 성능이 저하될 수 있다!
또한 트리를 최대한 균일한 데이터 세트로 분할하는 것이 중요하다
※ 데이터가 균일하다 = 모든 공이 검은색인 경우
균일도 측정 방법
1. 정보 이득(Information Gain)
1 - 엔트로피 지수
엔트로피는 주어진 데이터 집합의 혼잡도로
여러 값이 섞여 있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피가 낮다
따라서 균일도가 낮으면(여러 값이 섞여 있으면)정보 이득 지수가 낮다
2. 지니 계수
데이터 균일도가 높으면 지니 계수가 낮다
사이킷런의 DecisionTreeClassifier는 기본으로 지니 계수를 이용해 데이터 세트를 분할한다
결정 트리 모델 특징
장점 | 단점 |
1. 균일도를 룰로 해 쉽고 직관적이다 2. 피처의 스케일링과 정규화 같은 전처리 작업이 필요 없다 |
1. 과적합으로 정확도가 떨어진다. 따라서 트리의 크기를 사전에 제한하는 튜닝이 필요하다 |
결정 트리 파라미터
파라미터명 | 설명 |
min_samples_split | 노드를 분할하기 위한 최소한의 샘플 데이터 수 클수록 과적합 방지 |
min_samples_leaf | 분할이 될 경우 왼쪽과 오른쪽 노드에서 가져야 할 최소한의 샘플 데이터 수 클수록 과적합 방지 비대칭적 데이터의 경우 작게 설정 |
max_features | 최대 피처 개수 디폴트는 None으로 모든 피처 사용해 분할 |
max_depth | 트리의 최대 깊이 설정 |
max_leaf_nodes | 말단 노드(Leaf)의 최대 개수 |
결정 트리 모델의 시각화
Graphviz 패키지를 사용한다
불꽃 데이터 세트를 이용해 규칙 트리 만들기
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')
# DecisionTree Classifier 생성
dt_clf = DecisionTreeClassifier(random_state=156)
# 붓꽃 데이터를 로딩하고, 학습과 테스트 데이터 셋으로 분리
iris_data = load_iris()
X_train , X_test , y_train , y_test = train_test_split(iris_data.data, iris_data.target,
test_size=0.2, random_state=11)
# DecisionTreeClassifer 학습.
dt_clf.fit(X_train , y_train)
export_graphviz( )
: Graphviz가 읽어 들여서 그래프 형태로 시각화할 수 있는 출력 파일을 생성
from sklearn.tree import export_graphviz
# export_graphviz()의 호출 결과로 out_file로 지정된 tree.dot 파일을 생성함.
export_graphviz(dt_clf, out_file="tree.dot", class_names=iris_data.target_names , \
feature_names = iris_data.feature_names, impurity=True, filled=True)
출력 파일 tree.dot을 시각화
import graphviz
# 위에서 생성된 tree.dot 파일을 Graphviz 읽어서 Jupyter Notebook상에서 시각화
with open("tree.dot") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
- 주황색 - 0 : Setosa, 초록색 - 1 : Versicolor, 보라색 - 2 : Virginica
- 색깔이 짙을수록 지니 계수가 낮고 해당 레이블에 속하는 샘플 데이터가 많다는 의미이다
- 규칙 생성 로직을 미리 제어하지 않으면 트리 노드를 계속 만들어가 과적합이 발생한다
feature_importances_
: 피처의 중요한 역할 지표를 제공
값이 높을수록 해당 피처의 중요도가 높다는 의미이다
다른 알고리즘은 내부 동작 원리를 잘 알 수 없지만 결정 트리는 알고리즘이 직관적이기 때문에 시각화할 수 있다
결정 트리 과적합(Overfitting)
make_classification( )
: 분류를 위한 테스트용 데이터 만들기
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
%matplotlib inline
plt.title("3 Class values with 2 Features Sample data creation")
# 2차원 시각화를 위해서 feature는 2개, 결정값 클래스는 3가지 유형의 classification 샘플 데이터 생성.
X_features, y_labels = make_classification(n_features=2, n_redundant=0, n_informative=2,
n_classes=3, n_clusters_per_class=1,random_state=0)
# plot 형태로 2개의 feature로 2차원 좌표 시각화, 각 클래스값은 다른 색깔로 표시됨.
plt.scatter(X_features[:, 0], X_features[:, 1], marker='o', c=y_labels, s=25, cmap='rainbow', edgecolor='k')
- 각 피처가 X, Y축으로 나열된 2차원 그래프
- 3개 클래스 값은 색깔로 구분됨
머신러닝 모델이 클래스 값을 예측하는 결정 기준을 색상과 경계로 나타내면 다음과 같다
이상치 데이터까지 분류하기 위해 분할이 자주 일어나 경계가 매우 많아졌다
따라서 min_samples_lear=6 을 설정해 일반화된 분류 규칙을 만든다