ML

분류 Classification

hyerimir 2022. 11. 8. 16:54

 

 

  • 베이즈(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) 유의