TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 머신 | 딥러닝 & AI>

[파이썬] 머신러닝 알고리즘: 결정 트리 - 3

by 기록자_Recordian 2024. 6. 23.
728x90
반응형
시작에 앞서
해당 내용은 '<파이썬 머신러닝 완벽 가이드> 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.

 이전 내용
 

[파이썬] 머신러닝 알고리즘: 결정 트리 - 2

시작에 앞서해당 내용은 ' 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다. 이전 내용 [파이썬] 머신러

puppy-foot-it.tistory.com


feature_importances_

 

결정 트리는 균일도에 기반해 어떠한 속성을 규칙 조건으로 선택하느냐가 중요한 요건이다.

중요한 몇 개의 피처가 명확한 규칙 트리를 만드는 데 크게 기여하며, 모델을 좀 더 간결하고 이상치(Outlier)에 강한 모델을 만들 수 있기 때문이다.

 

사이킷런은 피처의 중요한 역할 지표를 DecisionTreeClassifier 객체의 feature_importances_ 속성으로 제공한다.

 

feature_importances_ 는 ndarray 형태로 값을 반환하며 피처 순서대로 값이 할당된다.

또한 피처가 트리 분할 시 정보 이득이나 지니 계수를 얼마나 효율적으로 잘 개선시켰는지를 정규화된 값으로 표현한다.

일반적으로 이 값이 높을수록 해당 피처의 중요도가 높다는 의미로 해석하면 된다.

 

[붓꽃 데이터 세트에서 피처별로 중요도 추출하기]

앞서 진행한 예제에서 fit()으로 학습된 DeicisonTreeClassifier 객체 변수인 dt_clf에서 feature_importances_ 속성을 가져와 피처별로 중요도 값을 매핑하고 이를 막대그래프로 표현한다.

# 붓꽃 데이터 세트에서 피처별로 중요도 추출하기
import seaborn as sns
import numpy as np
%matplotlib inline

# feature importances 추출
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))

# feautre importace를 column 별로 시각화하기 (barplot 이용)
sns.barplot(x=dt_clf.feature_importances_, y=iris_data.feature_names)

 

▶ 여러 피처들 중 petal_length가 가장 피처 중요도가 높음을 알 수 있다.


결정 트리 과적합(Overfitting)

 

결정 트리가 어떻게 학습 데이터를 분할해 예측을 수행하는지, 이로 인한 과적합 문제를 시각화해 살펴본다.

 

사이킷런에서 제공하는 분류를 위한 테스트용 데이터를 쉽게 만들 수 있는 make_classification() 함수를 이용해 2개의 피처가 3가지 유형의 클래스 값을 가지는 데이터 세트를 만들고 이를 그래프 형태로 시각화해 본다.

 

make_classification( ) 호출 시 반환되는 객ㅊ체는 피처 데이터 세트와 클래스 레이블 데이터 세트이다.

# 분류를 위한 테스트용 데이터 세트 생성
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차원 시각화를 위해 피처는 2개, 클래스는 3가지 유형의 샘플 데이터 생성
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)

# 그래프 형태로 2개의 피처로 2차원 좌표 시각화, 각 클래스 값은 다른 색깔로 표시
plt.scatter(X_features[:, 0], X_features[:, 1], marker='o', c=y_labels, s=25, edgecolor='k')

 

▶ 각 피처가 X, Y 축으로 나열된 2차원 그래프이며, 3개의 클래스 값 구분은 색깔로 돼 있다.

 

 

[X_features와 y_labels 데이터 세트를 기반으로 결정 트리 학습]

첫 번째 학습 시에는 결정 트리 생성에 별다른 제약이 없도록 결정 트리의 하이퍼 파라미터를 디폴트로 한 뒤, 결정 트리 모델이 어떠한 결정 기준을 가지고 분할하면서 데이터를 분류하는 지 확인

 

1 .visualize_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()
    
    # 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)

 

2. 결정 트리 생성에 별다른 제약이 없도록 하이퍼 파라미터가 디폴트인 Classifier 를 학습하고 결정 기준 경계 시각화

# 결정 기준 경계 시각화
from sklearn.tree import DecisionTreeClassifier

#특정한 트리 생성 제약 없는 결정 트리의 학습과 결정 경계 시각화
dt_clf = DecisionTreeClassifier(random_state=156).fit(X_features, y_labels)
visualize_boundary(dt_clf, X_features, y_labels)

▶ 결정 트리의 기본 하이퍼 파라미터 설정은 리프 노드 안에 데이터가 모두 균일하거나 하나만 존재해야 하는 엄격한 분할 기준으로 인해 결정 기준 경계가 많아지고 복잡해졌다.

이러한 모델은 학습 데이터 세트의 특성과 약간만 다른 형태의 데이터 세트를 예측하면 예측 정확도가 떨어지게 된다.


★ min_samples_leaf = 6 을 설정하여 결정 기준 경계 살펴보기

min_samples_leaf = 6 을 설정해 6개 이하의 데이터는 리프 노드를 생성할 수 있도록 노드 생성 규칙을 완화한 뒤 하이퍼 파라미터를 변경해 결정 기준 경계가 어떻게 변하는지 살펴본다.

# min_samples_leaf = 6 을 설정하여 결정 기준 경계 살펴보기
dt_clf = DecisionTreeClassifier(min_samples_leaf=6, random_state=156).fit(X_features, y_labels)
visualize_boundary(dt_clf, X_features, y_labels)

▶ 이상치에 크게 반응하지 않으면서 좀 더 일반화된 분류 규칙에 따라 분류됐음을 알 수 있다.

결정 트리 모델의 예측 성능은 첫 번째 모델 (디폴트)보다는 해당 모델이 더 뛰어날 가능성이 높다.

왜냐하면 학습 데이터에만 지나치게 최적화된 분류 기준은 오히려 테스트 데이터 세트에서 정확도를 떨어뜨릴 수 있기 때문이다.


전체 코드

04. DecisionTreeClassifier.ipynb
0.23MB

728x90
반응형