분류 Classification
- 베이즈(Bayes)통계와 생성 모델에 기반한 나이브 베이즈(Naive Bayes)
- 독립변수와 종속변수의 선형관계성에 기반한 로지스틱 회귀(Logistic Regressiom)
- 데이터 균일도에 따른 규칙 기반의 결정트리(Decision Tree)
- 개별 클래스 간의 최대 분류 마진을 효과적으로 찾아주는 서포트 벡터 머신(Support Vector Machine)
- 근접 거리를 기준으로 최소 근접(Nearest Neighbor) 알고리즘
- 심층 연결 기반의 신경망(Neural Network)
- 서로 다른(또는 같은) 머신러닝 알고리즘을 결합한 앙상블(Ensemble)
결정트리 Decision Tree
데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리(Tree)기반의 분류 규칙을 만드는 것
트리의 깊이(depth)가 깊어질수록 결정 트리의 예측 성능이 저하될 가능성이 높음
결정노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 만든다
정보의 균일도를 측정하는 대표적인 방법으로는 엔트로피를 이용한 정보 이득(Information Gain) 지수와 지니계수가 있음
- 엔트로피 : 주어진 데이터 집합의 혼잡도
- 정보 이득 지수 : 1에서 엔트로피 지수를 뺸 값; 결정 트리는 이 정보 이득 지수로 분할 기준을 정한다
즉, 정보 이득이 높은 속성을 기준으로 분할한다
'균일도' 룰을 기반으로 하여 알고리즘이 쉽고 직관적이다
어떻게 규칙 노드와 리프 노드가 만들어지는지 알 수 있고 시각화로 표현할 수 있음
정보의 균일도만 신경쓰면 되므로 특별한 경우를 제외하고는 각 피처의 스케일링과 정규화 같은 전처리 작업 필요 없음
단점으로는 과적합으로 정확도가 떨어진다는 점
사이킷런에서 제공하는 결정 트리 알고리즘
1. DecisionTreeClassifier - 분류
2. DecisionTreeRegressor - 회귀
모두 동일한 파라미터 사용
- min_samples_split : 노드를 분할하기 위한 최소한의 샘플 데이터 수
- min_samples_leaf : 분할이 될 경우 왼쪽과 오른쪽의 브랜치 노드에서 가져야 할 최소한의 샘플 데이터 수
- max_features : 최적의 분할을 위해 고려할 최대 피처 개수
- max_depth : 트리의 최대 깊이
- max_leaf_nodes : 말단 노드의 최대 개수
결정 트리 모델의 시각화
- Graphviz 패키지 사용
붓꽃 데이터 세트에 결정 트리 적용
from sklearn.tree impot 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)
#DecisionTreeClassifier 학습
dt_clf.fit(X_train, y_train)
리프 노드 : 더 이상 자식이 없는 노드, 최종 클래스(레이블)값이 결정된 노드
브랜치 노드 : 자식 노드가 있는 노드, 자식 노드를 만들기 위한 분할 규칙 조건을 가지고 있음
중요한 몇 개의 피처가 명확한 규칙 트리를 만드는 데 크게 기여하고 모델을 좀 더 간결하고 이상치에 강한 모델을 만들 수 있음
사이킷런은 결정 트리 알고리즘이 학습을 통해 규칙을 정하는 데 있어 피처의 중요한 역할 지표를 feature_importances_속성으로 제공한다
feature_importances_는 피처가 트리 분할 시 정보 이득이나 지니 계수를 얼마나 효율적으로 잘 개선시켰는지를 정규화한 값, 일반적으로 값이 높을 때 해당 피처의 중요도가 높음을 의미
import seaborn as sns
import numpy as np
%matplotlib inline
#feature importance 추출
print("Feature importances:\n{0}".format(np.round(dt_clf.feature_importances_,3)))
#feature별 importance 매핑
for name, value in zip(iris_data.feature_names, dt_clf.feature_importances_):
print('{0} : {1:.3f}'.format(name, value))
#feature importance를 column 별로 시각화하기
sns.barplot(x=dt_clf.feature_importances_, y = iris_data.feature_names)
결정 트리 과적합(overfitting) 유의