열심히 코딩 하숭!

분류, 결정트리, Overfitting | 3주차 - 5 | 파이썬 머신러닝 완벽가이드 본문

프로그래밍 언어/python

분류, 결정트리, Overfitting | 3주차 - 5 | 파이썬 머신러닝 완벽가이드

채숭이 2023. 1. 23. 01:13

* 해당 글은 inflearn의 강의 '[개정판] 파이썬 머신러닝 완벽가이드'를 정리한 글입니다.

 

 

 

회색 - 강의 제목

노란색, 주황색 - 강조

 

 

 


 

5일

 

 

분류(Classification) 개요와 결정트리(Decision Tree) 소개

 

 

분류 알고리즘 (Classification)

- 주어진 데이터의 피처와 레이블값을 학습해서 모델 생성

- 생성된 모델에 새로운 데이터 값이 주어졌을 때, 미지의 값을 예측

 

결정 트리 개요

- 매우 쉽고 유연하게 적용될 수 있음

- 데이터의 스케일링이나 정규화 등의 사전 가공의 영향이 적음

- 예측 성능 향상을 위해 복잡한 규칙 구조를 가져야 하며, 이로 인해 과적합(overfitting)이 발생해 반대로 예측 성능이 저하될 수도 있다는 단점이 있음

 

 

앙상블 기법 개요

- 결정 트리의 단점이 앙상블 기법에서는 오히려 장점으로 작용함

- 매우 많은 여러개의 약한 학습기(== 예측 성능이 상대적으로 떨어지는 학습 알고리즘)를 결합해서 확률적 보완과 오류가 발생한 부분에 대한 가중치를 계속 업데이트하면서 예측 성능을 향상시킴 (이 때 결정트리가 좋은 약한 학습기가 된다)

- GBM, XGBoost, LightGBM 등

 

 

 

결정 트리

- 데이터에 있는 규칙을 학습을 통해 자동으로 찾아내서 트리 기반의 분류 규칙을 만든다

- ∴ 어떤 기준을 바탕으로 규칙을 만들어야 가장 효율적인 분류가 될 것인가가 알고리즘의 성능을 크게 좌우함

 

균일도 측정 방법

 

방법 1. 정보 이득(Information Gain)

- 정보 이득 지수 = 1 - 엔트로피 지수

- 엔트로피: 주어진 데이터 집합의 혼잡도, 다른 정보들이 더 많이 섞여있을 수록 엔트로피는 커짐

- 정보 이득 지수가 높을수록 데이터의 혼잡도가 낮음

   정보 이득이 높은 속성을 기준으로 분할함!

 

방법 2. 지니 계수

-  0이 가장 평등하고, 1로 갈수록 불평등함

- 불평등: 데이터가 균일하지 못 하다

- 지니 계수가 작을 수록 정보의 균일도가 높음

 

 

규칙 노드 생성 프로세스

 

결정 트리의 특징

장점

- 쉽다. 직관적이다.

- 피처의 스케일링이나 정규화 등의 사전 가공 영향도가 크지 않다

단점

- 과적합으로 알고리즘 성능이 떨어진다. → 이를 극복하기 위해 트리의 크기를 사전에 제한하는 튜닝이 필요

 

 

 

 

결정트리 모델 시각화를 위한 Graphviz 설치하기

 

 

Graphviz

- 이용하면 결정 트리 모델을 시각화 할 수 있음

 

설치

- Graphviz 실행 파일 설치

- Graphviz 파이썬 래퍼 모듈 설치

- OS 환경변수 구성

 

 

 

 

시각화를 통한 결정 트리 모델의 구조 이해

 

 

Graphviz의 시각화 노드 설명

- petal length <= 2.45 → 자식 노드를 만들기 위한 규칙 조건 (조건이 없으면 리프노드임 or 클래스 하나의 값만 남을 경우 리프 노드임)

- gini → value로 주어진 데이터 분포에서의 지니 계수

- samples → 현 규칙에 해당하는 데이터 건수

- value = [41, 40, 39] → 클래스 값 기반의 데이터 건수 (순서대로 0,1,2)

- class → value 리스트 내에서 가장 많은 건수를 가진 결정값

 

 

 

결정 트리 주요 하이퍼 파라미터의 이해

 

 

결정 트리 주요 하이퍼 파라미터

 

max_depth

- 트리의 최대 깊이

- None으로 설정하면 계속 분할함 → 노드가 가지는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이를 증가시킴

max_depth

 

max_features

- 최대 피처의 개수를 제한

- int형 -> 피처의 개수 / float형 -> 전체 피처 중 대상 피처의 퍼센트

- 디폴트: None

 

 

min_samples_split

- 노드를 분할하기 위한 최소한의 샘플 데이터 수 (과적합 제어에 사용됨)

- 디폴트: 2 (작게 설정할수록 분할되는 노드가 많아져서 과적합 가능성이 증가함

min_samples_split

 

min_samples_leaf

- 분할이 될 경우 왼쪽과 오른쪽의 브랜치 노드에서 가져야 할 최소한의 샘플 데이터 수

- 값을 크게하면 분할이 어려움

 

- 노드가 분할될 경우 자식 노드들이 모두 샘플 데이터 건수가 4 이상을 만족할 수 있는지를 확인한 후 분할하게 됨

 

 

max_leaf_nodes

- 말단 노드의 최대 개수

 

 

(더 자세한 내용은 아래 표 참고)

 

→ max_depth 말고는 거의 다 과적합 제어를 위해 쓰임

 

[예제는 4.2 결정트리]

 

 

 

결정트리 피처 중요도의 이해

 

 

중요도

- dt_clf.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)

결과

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

 

 

 

 

 

결정트리 과적합의 이해

 

 

결정 트리 과적합

 

- 왼쪽보다 오른쪽이 훨씬 과적합에 영향을 받지 않는 분류 기준선임

- 트리 생성 제약이 없을 경우 outlier에 의해 과적합이 발생함

- 물론 왼쪽이 더 좋을 수도 있지만, test data의 입장에서 생각했을 때는 오른쪽이 더 낫다

- 머신러닝은 Underfitting보다 Overfitting이 더 문제다