728x90
1.분류(Classification) 개요
분류(Classification)는 학습 데이터로 주어진 데이터의 feature와 Label값(target값, Class값)을 ML 알고리즘으로 학습해 모델을 생성하고, 이렇게 생성된 모델에 새로운 데이터 값이 주어졌을 때 미지의 Label값을 예측하는 것
분류 알고리즘
- 베이즈(Bayes) 통계와 생성 모델에 기반한 나이브 베이즈(Naive Bayes)
- 독립변수와 종속변수의 선형 관계성에 기반한 로지스틱 회귀(Logistic Regression)
- 회귀인데 분류 알고리즘이 되는 케이스
- 데이터 균일도에 따른 규칙 기반의 결정 트리 (Decision Tree)
- 개별 클래스 간의 최대 분류 마진을 효과적으로 찾아주는 서포트 벡터 머신 (Support Vector Machine)
- 근접 거리를 기준으로 하는 최소 근접(Nearest Neighbor) 알고리즘
- 심층 연결 기반의 신경망(Neural Network) : Deep Learning
- 서로 다른(또는 같은) 머신러닝 알고리즘을 결합한 앙상블(Ensemble)
결정 트리와 앙상블
장점
- 매우 쉽고 유연하게 적용될 수 있는 알고리즘
- 데이터의 스케일링이나 정규화 등의 사전 가공의 영향이 매우 적음
단점
- 예측 성능을 향상시키기 위해 복잡한 규칙 구조를 가져야 함
- 이로 인해 과적합 Overfitting이 발생하여 예측 성능이 저하될 수 있음
앙상블
- 이러한 단점들이 앙상블 기법에서는 장점으로 작용함
- 앙상블은 매우 많은 여러 개의 약한 학습기(예측 성능이 상대적으로 떨어지는 학습 알고리즘)를 결합해 확률적 보완과 오류가 발생한 부분에 대한 가중치를 계속 업데이트하면서 예측 성능을 향상시킴
- 결정 트리가 여기서 좋은 약한 학습기가 되기 때문 (GBM, XGBoost, LightGBM)
2. 결정 트리
결정 트리
데이터의 균일도에 따른 규칙 기반 분류
- 결정 트리 알고리즘은 데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리(Tree) 기반의 분류 규칙을 만듦 (If-Else 기반 규칙)
- 따라서 데이터의 어떤 기준을 바탕으로 규칙을 만들어야 가장 효율적인 분류가 될 것인가가 알고리즘의 성능을 크게 좌우함
- 브랜치/서브 트리: 새로윤 규칙 조건마다 규칙 노드 기반의 서브 트리 생성
트리 분할을 위한 데이터의 균일도
- 데이터 셋 C가 가장 균일함
균일도 기반 규칙 조건
데이터의 균일도가 높은 속성을 기준으로 우선 분할
3. 정보 균일도 측정 방법
정보 균일도 측정 방법
- 정보 이득(Information Gain)
- 정보 이득은 엔트로피라는 개념을 기반으로 함
- 엔트로피는 주어진 데이터 집합의 혼잡도를 의미하는데, 서로 다른 값이 섞여있으면 엔트로피가 높고, 같은 값이 섞여 있으면 엔트로피가 낮음
- 정보 이득 지수는 1에서 엔트로피 지수를 뺀 값 = 1 - 엔트로피 지수
- 정보 이득이 높은 속성을 기준으로 분할
- 지니 계수
- 원래 경제학에서 불평등 지수를 나타낼 때 사용하는 계수
- 경제학자인 코라도 지니(Corrado Gini)의 이름에서 딴 계수로서 0이 가장 평등하고 1로 갈수록 불평등함
- 머신러닝에 적용될 때는 지니계수가 낮을수록 데이터의 균일도가 높은 것으로 해석되어 계수가 낮은 속성을 기준으로 분할
- 데이터 세트 내의 정보가 빈번하지 않고, 예측 불가능하고, 한 번에 나타났을 때 정보의 효용성이 높다
4. 결정 트리의 규칙 노드 생성 과정 &결정 트리 특징
결정 트리의 규칙 노드 생성 프로세스
결정 트리의 특징
- 결정 트리 장점
- 쉽고 직관적임
- feature의 스케일링이나 정규화 등의 사전 가공(데이터 전처리) 영향도가 크지 않음
- 결정 트리 단점
- 과적합으로 알고리즘 성능이 떨어진다 (모두 단일 분류값으로 만들기 위해 결정 트리가 계속 커짐)
- 이를 극복하기 위해 트리의 크기를 사전에 제한하는 튜닝 필요
5. 결정 트리 주요 Hyper Parameter
Hyper Parameters: Tree의 분할을 제어
- samples: 현 규칙(부모 노드의 조건)에 해당하는 데이터 건수
- max_depth
- 트리의 최대 깊이를 규정
- default=None, None으로 설정하면 완벽하게 클래스 결정 값이 될 때까지 깊이를 계속 키우며 분할하거나 노드가 가지는 데이터 개수가 min_samples_split 보다 작아질 때까지 계속 깊이를 증가시킴
- 깊이가 깊어지면 min_samples_split 설정대로 최대 분할하여 과적합할 수 있으므로 적절한 값으로 제어 필요
- max_features
- 최적의 분할을 위해 고려할 최대 feature 개수
- default=None으로 데이터 세트의 모든 feature를 사용해 분할 수행
- 'sqrt'는 전체 feature 중 sqrt(전체 feature 개수) = $\sqrt {total \: feature \: 개수}$
- min_samples_split
- 노드를 분할하기 위한 최소한의 샘플 데이터 수로 과적합을 제어하는데 사용됨
- default=2이고 작게 설정할수록 분할되는 노드가 많아져서 과적합 가능성 증가
- min_samples_leaf
- 분할이 될 경우 왼쪽과 오른쪽의 브랜치 노드에서 각각 가져야 할 최소한의 샘플 데이터 수
- 큰 값으로 설정될 수록, 분할될 경우 왼쪽과 오른쪽의 브랜치 노드에서 가져가야 할 최소한의 샘플 데이터 수 조건을 만족시키기가 어려우므로 노드 분할을 상대적으로 덜 수행함
- max_leaf_nodes
- 말단 노드(leaf node)의 최대 개수
- random_state
train_test_split()에서 사용되는 random_state 인자는 데이터를 train과 test 데이터 세트로 특정 비율로 분할 할때 random 하게 섞어서 분할을 하게 되는데, 이때 random 분할을 수행시 마다 동일하게 적용하기 위해서 random seed값을 random_state로 지정
DecisionTreeClassifier에서 사용되는 random_state는 random을 고정한다는 자체는 동일한데, 역할이 다름
DecisionTreeClassifier는 트리 기반의 노드를 분할시마다 분할 기준등이 동일하게 발생할 경우 random하게 feature들을 선택하는 특성이 있는데, 이때 random을 고정하는 역할을 함
그래서 이때의 random_state는 수행시마다 동일하게 feature가 분할하는 역할을 수행하게 만들어 줍니다.
max_depth에 따른 결정 트리 구조
min_samples_split에 따른 결정 트리 구조
min_samples_leaf에 따른 결정 트리 구조
6. Graphviz를 이용한 결정 트리 모델의 시각화
설치
- Graphviz 실팽 파일을 설치
- Graphviz 파이썬 래퍼 모듈을 설치
- os 환경변수 구성
결정 트리 모델의 시각화
export_graphviz(classifier, out_file, class_names(label 값들), feature_names(feature data set의 column들), impurity, filled)
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 = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.2, random_state=11
)
# DecisionTreeClassifer 학습.
dt_clf.fit(X_train, y_train)
from sklearn.tree import export_graphviz
# export_graphviz()의 호출 결과로 out_file로 지정된 tree.dot 파일을 생성함.
export_graphviz(
dt_clf,
out_file="tree.dot",
class_names=iris.target_names,
feature_names=iris.feature_names,
impurity=True,
filled=True,
)
import graphviz
# 위에서 생성된 tree.dot 파일을 Graphviz 읽어서 Jupyter Notebook상에서 시각화
with open("tree.dot") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
Graphviz의 시각화 노드
- Feature의 조건이 있는 것은 자식 노드를 만들기 위한 규칙 조건이므로 브랜치 노드에 해당한다
- 해당 조건이 없으면 리프 노드이다
- gini: value = []로 주어진 데이터 분포에서의 지니 계수
- value = []: Class 값 기반의 데이터 건수
- class: value 리스트 내에 가장 많은 건수를 가진 결정값(target값)
- samples: 현 규칙(부모 노드의 조건)에 해당하는 데이터 건수
결정트리 피처 중요도의 이해
- 모델에서 특정 feature가 다른 feature 대비 상대적으로 어떤 중요도를 갖는지
- 특정 feature가 다른 feature 보다 값이 높다고 해서 무조건적으로 중요한 건 아님
- [계산로직] = 분할을 자주 사용하는데에 있어 feature가 얼마나 사용이 되는지: 분할을 자주했다고 해서 반드시 중요한 feature라는 의미는 아님
- feature_importances_ method 이용
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.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.feature_names)
# Feature importances:
# [0.025 0. 0.555 0.42 ]
# sepal length (cm) : 0.025
# sepal width (cm) : 0.000
# petal length (cm) : 0.555
# petal width (cm) : 0.420
7. 결정 트리(Decision Tree) 과적합(Overfitting)
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')
import numpy as np
# Classifier의 Decision Boundary를 시각화 하는 함수
def visualize_boundary(model, X, y):
fig,ax = plt.subplots()
# 학습 데이타 scatter plot으로 나타내기
ax.scatter(X[:, 0], X[:, 1], c=y, s=25, cmap='rainbow', edgecolor='k',
clim=(y.min(), y.max()), zorder=3)
ax.axis('tight')
ax.axis('off')
xlim_start , xlim_end = ax.get_xlim()
ylim_start , ylim_end = ax.get_ylim()
# 호출 파라미터로 들어온 training 데이타로 model 학습 .
model.fit(X, y)
# meshgrid 형태인 모든 좌표값으로 예측 수행.
xx, yy = np.meshgrid(np.linspace(xlim_start,xlim_end, num=200),np.linspace(ylim_start,ylim_end, num=200))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
# contourf() 를 이용하여 class boundary 를 visualization 수행.
n_classes = len(np.unique(y))
contours = ax.contourf(xx, yy, Z, alpha=0.3,
levels=np.arange(n_classes + 1) - 0.5,
cmap='rainbow', clim=(y.min(), y.max()),
zorder=1)
from sklearn.tree import DecisionTreeClassifier
# 특정한 트리 생성 제약없는 결정 트리의 Decsion Boundary 시각화.
dt_clf = DecisionTreeClassifier(random_state=156).fit(X_features, y_labels)
visualize_boundary(dt_clf, X_features, y_labels)
# min_samples_leaf=6 으로 트리 생성 조건을 제약한 Decision Boundary 시각화
dt_clf = DecisionTreeClassifier(random_state=156, min_samples_leaf=6).fit(X_features, y_labels)
visualize_boundary(dt_clf, X_features, y_labels)
Decision Tree Overfitting
- 2개의 Feature로 된 3개의 결정 클래스를 가지도록 make_classification() 함수를 이용하여 임의 데이터를 생성한 후 트리 생성 제약이 없는 경우와 min_samples_leaf=6으로 제약을 주었을 때 분류 기준선의 변화
Overfitting / Underfitting
- Overfitting : Train data에 대해서 과도하게 학습 & Test data에 대해서는 잘 동작 X
- Overfitting은 학습 데이터(Training Set)에 대해 과하게 학습된 상황입니다. 따라서 학습 데이터 이외의 데이터(Test Set)에 대해선 모델이 잘 동작하지 못합니다.
- 학습 데이터가 부족하거나, 데이터의 특성에 비해 모델이 너무 복잡한 경우 발생합니다. Training Set에 대한 loss는 계속 떨어지는데, Test Set에 대한 loss는 감소하다가 다시 증가합니다.
- Underfitting : Train data 조차도 학습 X 할 정도로 부족하게 학습
- Underfitting(과소적합)은 이미 있는 Train set도 학습을 하지 못한 상태를 의미합니다. Overfitting과 반대되는 상태를 의미합니다.
- Underfitting이 바생하는 이유는 아래와 같습니다.
- 학습 반복 횟수가 너무 적음
- 데이터의 특성에 비해 모델이 너무 간단함
- 데이터 양이 너무 적음
- Model Generality: Variance를 낮춰야 함 (overfitting)
- Model Accuarcy: Bias를 낮춰야 함 (underfitting)
- Bias, Variance는 서로 Trade - off 관계
- Complex Model: Overfitting occurs, Variance 증가, Bias 감소
- Simple Model: Underfitting occurs, Variance 감소, Bias 증가
728x90