본문 바로가기
머신러닝 with Python

[머신러닝 with Python] 결정 트리(Decision Tree) (2/2) / 과적합(Over-fitting)

by CodeCrafter 2023. 9. 8.
반응형

 

이번에는

1) 결정트리(Decision Tree)의 과적합(Overfitting) 무제에 대해 2차원 데이터의 시각화를 통해 알아보겠으며,

2) 이러한 과적합(Overfitting)문제의 해결방안에 대해서 알아보겠습니다.

 

1. 결정트리(Decision Tree)의 과적합(Overfitting) 문제 (Python 활용)

 결정트리(Decision Tree)는 직관적인 설명력을 제공해주는 효과적인 분류(회귀도 가능) 모형이지만, 과적합(Overfitting)이라는 문제 또한 가지고 있습니다.

- 과적합(Overfitting)이란, 기계 학습 모델이 훈련 데이터에 너무 맞춰져서, 훈련 데이터에 대한 예측 성능은 높지만 새로운 데이터나 테스트 데이터에 대한 성능이 낮아지는 현상을 의미합니다.

- 이는 모델이 훈련 데이터의 노이즈까지 학습하는 경향이 있어서 발생합니다. 과적합은 모델이 너무 복잡하거나 자유도가 높을 때 주로 발생하며, 모델이 훈련 데이터를 지나치게 외우기 시작할 때 나타나는 것을 말합니다.

 

 

그렇다면, 결정트리에서의 과적합은 어떤 것을 의미하는지 알아보겠습니다

 

- 결정 트리는 데이터를 분할하여 예측을 수행하는 모델이며, 각 노드에서는 데이터를 가장 잘 분류할 수 있는 특성을 선택하여 분할하게 됩니다. 해당 모델에서는 아래와 같은 과적합이 발생할 수 있습니다.

 * 과적합이 발생할 수 있는 경우: a) 결정 트리가 너무 깊거나, b) 각 노드에서 분할 조건이 너무 복잡할 때 

   (즉, 모델이 훈련 데이터의 작은 변동에도 민감하게 반응할 때 과적합이 발생)

 

 해당 내용을 파이썬 코드를 통해서 알아보겠습니다.

 

 

1) 시각화를 위해 2개의 feature와 3개의 클래스를 가진 임의의 샘플을 만들어보겠습니다.

 * 이때, feature의 갯수를 2개로 한 것은 2차원 평면상에 표현하기 위함입니다.

 * 3개의 Sample Class는 각 클래스들의 색깔을 다르게하여 표현하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
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')
cs

 

 

2) 해당 데이터를 기반으로 결정트리 모델을 만들고 결정트리 모델이 분류해낸 결과를 시각화 해보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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().fit(X_features, y_labels)
visualize_boundary(dt_clf, X_features, y_labels)
cs

 

* 파란색 클래스는 파란색 면적에 / 빨간색 클래스는 빨간색 면적에 / 초록색 클래스는 초록색 면적에 구분이 되도록 결정트리 기본 데이터를 분류해낸 것을 확인할 수 있습니다

* 이 중 각 색깔 클래스의 대부분이 속해있는 영역에 일부 다른 색깔들이 섞여있는 것을 볼 수 있는데, 기본 결정트리 모델은 특정 제약조건을 설정해주지 않았기때문에 하나하나 세세하게 분류를 해버린 것을 확인할 수 있습니다.

* 이렇게 복잡한 모델은 학습 데이터 세트의 특성과 약간만 다른 형태의 데이터 세트를 예측하려고 할때 예측의 정확도가 현저히 떨어지게 되는 "과적합(Overfitting)" 문제가 생기게 됩니다.

 

* 이러한 결정트리 모델의 과적합 문제를 해결하기 위한 방법 중 하나로, 결정 트리가 가지치기하기 위한 최소 데이터세트의 숫자를 제한하는   "min_samples_leaf" 파라미터를 적용해보겠습니다.

 

 

 

2. 결정트리(Decision Tree)의 과적합 문제 해결방안 : min_samples_leaf

 

1) min_samples_leaf

 - 결정 트리(Decision Tree) 알고리즘 및 관련된 앙상블 모델에서 사용되는 하이퍼파라미터 중 하나입니다.

 - 이 하이퍼파라미터는 결정 트리의 노드를 분할할 때 각 리프 노드(최하위 노드)가 가져야 하는 최소 데이터 포인트의 수를 나타내며,  min_samples_leaf를 적절하게 설정하면 과적합(Overfitting)을 제어하고 모델의 일반화 성능을 향상시킬 수 있습니다.

 

2) Python 코드를 통해 확인해보는 결정트리의 과적합 문제 해결방안(min_samples_leaf 활용)

1
2
3
# min_samples_leaf=6 으로 트리 생성 조건을 제약한 Decision Boundary 시각화
dt_clf = DecisionTreeClassifier( min_samples_leaf=6).fit(X_features, y_labels)
visualize_boundary(dt_clf, X_features, y_labels)
cs

* 이번에는 min_samples_leaf를 6으로 설정하여 결정트리를 학습 시켰습니다.

* 즉, 분류하기 위한 최소 샘플의 기준을 6개 이상으로 설정한 것입니다.

* 결과를 보니, 일부 정확하게 분류되지 않은 점들이 보입니다. 하지만, 학습용 데이터에 너무 일반화시킨 것이 아니기에 모델의 예측력이 더 좋을 것으로 예상됩니다.

반응형

댓글