반응형
결정트리
- 분할과 가지치기 과정을 반복하면서 모델을 생성한다.
- 결정트리에는 분류와 회귀 모두에 사용할 수 있다.
- 여러개의 모델을 함께 사용하는 앙상블 모델이 존재한다. (RandomForest, GradientBoosting, XGBoost)
- 각 특성이 개별 처리되기 때문에 데이터 스케일에 영향을 받지 않아 특성의 정규화나 표준화가 필요 없다.
- 시계열 데이터와 같이 범위 밖의 포인트는 예측 할 수 없다.
- 과대적합되는 경향이 있다. 이는 본문에 소개할 가지치기 기법을 사용해도 크게 개선되지 않는다.
DecisionTreeClassifier()
DecisionTreeClassifier(criterion, splitter, max_depth, min_samples_split, min_samples_leaf, min_weight_fraction_leaf, max_features, random_state, max_leaf_nodes,
min_impurity_decrease, min_impurity_split, class_weight, presort)
- criterion : 분할 품질을 측정하는 기능 (default : gini)
- splitter : 각 노드에서 분할을 선택하는 데 사용되는 전략 (default : best)
- max_depth : 트리의 최대 깊이 (값이 클수록 모델의 복잡도가 올라간다.)
- min_samples_split : 자식 노드를 분할하는데 필요한 최소 샘플 수 (default : 2)
- min_samples_leaf : 리프 노드에 있어야 할 최소 샘플 수 (default : 1)
- min_weight_fraction_leaf : min_sample_leaf와 같지만 가중치가 부여된 샘플 수에서의 비율
- max_features : 각 노드에서 분할에 사용할 특징의 최대 수
- random_state : 난수 seed 설정
- max_leaf_nodes : 리프 노드의 최대수
- min_impurity_decrease : 최소 불순도
- min_impurity_split : 나무 성장을 멈추기 위한 임계치
- class_weight : 클래스 가중치
- presort : 데이터 정렬 필요 여부
사용 예제
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
# 데이터 로드
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=11)
# 모델 학습
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
- iris 데이터를 활용해 학습 데이터와 테스트 데이터를 만든다.
- random_state 값만 주어 model을 만들고 학습 데이터를 fitting 시킨다.
# 결정트리 규칙을 시각화
import matplotlib.pyplot as plt
from sklearn import tree
plt.figure( figsize=(20,15) )
tree.plot_tree(model,
class_names=iris.target_names,
feature_names=iris.feature_names,
impurity=True, filled=True,
rounded=True)
- sklearn의 tree 모듈을 활용해 완성된 결정트리를 그린다.
- 모두 분류될 때까지 (지니불순도가 0이 될때까지 리프 노드를 확장한 것을 확인할 수 있다.
가지치기
- 위에서 만든 결정트리는 학습 데이터에 완전 적합(과적합)되어 있다. 따라서 다른 데이터엔 적절하게 사용될 수 없을 것이다.
- 따라서 적절히 가치지기를 수행한다.
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X_train, y_train)
# 결정트리 규칙 시각화
plt.figure( figsize=(20,15) )
tree.plot_tree(model,
class_names=iris.target_names,
feature_names=iris.feature_names,
impurity=True, filled=True,
rounded=True)
- max_depth를 3으로 주고 시각화를 진행했다.
- 깊이 3일 때까지만 분류를 진행했음을 알 수 있다.
- 이 외에도 min_samples_split(리프 노드가 될 수 있는 샘플 데이터 최소값), min_samples_leaf(리프 노드가 될 수 있는 샘플 데이터 최소값), max_leaf_nodes (리프 노드가 될 수 있는 샘플 데이터 최대값) 등을 조절해 가지치기를 할 수 있다.
특성 중요도
- 트리 분류 모델 형성에 각 특성이 얼마나 작용했는지 평가하는 지표이다.
- 해당 지표는 0~1사이의 값을 가지며, 0이면 특성이 전혀 작용하지 않았음을 의미하고 1은 완전하게 작용했음을 의미한다.
- 특성 중요도 전체의 합은 1이다.
import seaborn as sns
import numpy as np
%matplotlib inline
# feature별 importance 매핑
for name, value in zip(iris.feature_names , model.feature_importances_):
print('{} : {:.3f}'.format(name, value))
# feature importance를 column 별로 시각화 하기
sns.barplot(x=model.feature_importances_ , y=iris.feature_names)
==결과==
sepal length (cm) : 0.006
sepal width (cm) : 0.000
petal length (cm) : 0.546
petal width (cm) : 0.448
- 특정 모델 트리의 feature_importances_ 변수를 확인함으로서 특성 중요도를 체크할 수 있다.
- (cf. 해당 특성중요도는 위의 트리와는 연관이 없다.)
반응형
'🛠 기타 > Data & AI' 카테고리의 다른 글
문자열 형태소 제거하기 (0) | 2020.08.06 |
---|---|
문자열 특수문자 제거 (0) | 2020.08.06 |
LSTM을 활용한 스팸분류 (0) | 2020.08.05 |
합성곱 신경망(CNN) - 기본구조 이론 (0) | 2020.08.03 |
다층퍼셉트론 - 기본구조 구현 (0) | 2020.08.02 |