Machine Learning & Deep Learning/파이썬 머신러닝 완벽 가이드(공룡책)

결정트리

유방울 2023. 5. 29. 13:58

목차

결정트리, 특징, 시각화, 파라미터, 과적합

 

ML 알고리즘 중 직관적으로 이해하기 쉬운 알고리즘

데이터에 있는 규칙 학습을 통해 자동으로 찾아내 Tree 기반 분류 규칙 만들기

 

가장 쉬운 표현 : if/else 기반으로 나타냄

ex) 스무고개 게임과 유사

-> 어떤 기준 바탕의 규칙인지에 따라 효율적인 분류 가능

 

 

 

노드 : 트리를 구성하고 있는 각각의 요소

엣지 : 노드를 연결하고 있는 선

노드의 차수 : 엣지의 수

 

루트 노드 : 1번 노드

- 부모 노드가 없음

 

규칙 노드 : 3번 4번 5번 노드

-      규칙 조건이 있음

 

리프 노드 2번 노드

-      자식 노드가 없음

-      오직 하나의 클래스 값으로 최종 데이터 구성

-      결정된 클래스 값

-      하이퍼 파라미터 조건 충족

 

브랜치/서브 트리 : 새로운 규칙 조건마다 생성

 

(보류)

브랜치 노드

-      자식 노드가 있음

-      자식 노드를 만들기 위한 분할 규칙 조건을 가짐

 

데이터 세트에 피처가 있고, 피처가 결합해 규칙 조건이 만들어지고 규칙 노드 만들어짐

but 많은 규칙 = 분류 결정하는 방식 복잡 => 과적합

즉, 트리의 깊이가 깊어질수록 결정 트리의 예측 성능 저하됨

 

높은 정확도를 위해서?

최대한 많은 데이터 세트가 해당 분류에 속하는 규칙 필요

-> 트리 분할(split)이 중요 : 최대한 균일한 데이터 세트를 구성해야 함

 

균일한 데이터 세트의 의미는?

균일도가 낮은 -> 높은

A < B < C

 

C : 모두 검은 공 -> 별다른 정보 없이도 검은 공이라고 예측 쉬움

B : 일부만 흰 공

A : 흰 공 많음 -> 혼잡도가 높고, 균일도가 낮아서 데이터 판단하는 데 많은 정보 필요

 

결정 트리 모델은

: 정보 균일도가 높은 데이터 세트를 먼저 선택하도록 규칙 조건 만듦

-> 정보 균일도가 데이터 세트로 쪼개질 수 있도록 조건을 찾아 서브 데이터 세트 만들기

-> 다시 이 서브 데이터 세이트에 균일도가 높은 자식 데이터 세트 쪼개는 방식을 자식트리로 내려가기

 

ex) 박스 안 30개 레고

형태 속성 : 동그라미, 네모, 세모

색깔 속성 : 노랑, 빨강, 파랑

 

노랑 블록 : 모두 동그라미

빨강, 파랑 : 동그라미, 네모, 세모 골고류 섞임

-> 첫번째 규칙 조건

if 색깔 == '노란색'

why? 노란색 블록이면 모두 노란 동그라미 블록으로 가장 쉽게 예측 가능

그 다음 나머지 블록에 대해 다시 균일도 조건을 찾아 분류하는 것이 가장 효율적인 분류 방식

 

이러한 정보의 균일도를 측정하는 대표적인 방법

: 엔트로피를 이용한 정보이득지수(informatio gain ), 지니지수

 

균일도 측정

1. 엔트로피를 이용한 정보이득지수

1 - 엔트로피 지수

엔트로피 : 주어진 데이터 집합의 혼잡도

높음 : 다른 값이 섞여 있음 <-> 낮음 : 같은 값이 섞여 있음

높은 속성을 기준으로 분할

 

2. 지니계수

불평등 지수

0 : 평등 --> 1 :불평등

낮은 속성을 기준으로 분할

일반적으로 사용

 

결정 트리 모델의 특징

장점

1.     균일도를 기반해 쉽고 직관적임

룰이 명확하고 규칙 노드, 리프 노드가 만들어지는지 알 수 있음, 시각화 가능

2.     정보의 균일도만 신경쓰기 -> 특별한 경우 제외하고 각 피처의 스케일링, 정규화 같은 전처리 작업 필요 없음

 

단점

1.     과적합으로 정확도 떨어짐

피처 정보의 균일도에 따른 룰 규칙으로 서브 트리를 만들면 피처 많아짐

-> 균일도가 다양하게 존재할수록 트리 깊이가 커지고 복잡함

즉 모든 데이터 상황을 만족하는 완벽한 규칙 못  만듦

But 정확도를 높이기 위해 계속 조건 추가 -> 트리 깊이 커짐 -> 복잡한 학습 모델 됨

 이는 유연하게 대처 불가능 -> 예측 성능 떨어짐

-> 트리의 크기를 사전에 제한하는 것이 성능 튜닝에 도움이 됨

 

결정 트리 시각화 

Graphviz 패키지

-      어떤 규칙을 가지고 트리 생성하는지 시각적으로 보여줌

-      그래프 기반의 dot 파일

-      Export_graphviz() API 제공

-      함수 인자에 학습이 완료된 Estimator, 피처의 이름 리스트, 레이블 이름 리스트 입력

-      C++ 운영 체제에 포팅된 패키지임으로 파이썬과 인터페이스할 수 있는 파이썬 래퍼 모듈 별도 설치 필요

 

 

여기서 4번 노드

38개의 샘플 데이터 중 인덱스가 2인 데이터가 1, 1번 인덱스가 37개임

하지만 이 두개를 다시 구분하기 위해 다시 자식 노드를 생성

è 규칙 생성 로직을 미리 제어하지 않으면 완벽하게 클래스 값을 규별하기 위해 트리 노드를 계속 만들어서 쉽게 과적합됨

 

결정 트리 파라미터

DecisionTreeClassifier : 분류를 위한 클래스

DecisionTreeRegressor : 회귀를 위한 클래스

CART 알고리즘 기반 : Classification and Regression Trees 기반

분류, 회귀 모두 사용될 수 있는 트리 알고리즘

 

Max_depth으로 결정 트리의 최대 트리 깊이를 제어하면 더 간단한 결정트리가 됨

-      트리의 최대 깊이 규정

-      디폴트 none, 완벽하게 클래스 결정 값이 될 때까지 깊이를 계속 기우고 분할하거나 노드가 가지는 데이터 개수가 min_samples_split보다 작아질 때까지 계속 깊이 증가시킴

-      깊이가 깊어지면 min_samples_split 설정대로 최대 분할해 과적합함

 

 

Min_samples_split 하이퍼 파라미터 변경에 따른 규칙 트리의 변화

-      노드를 분할하기 위해 최소한의 샘플 데이터 수로 과적합을 제어함

-      디폴트 2, 작게 설정 -> 분할되는 노드가 많아져서 과적합 가능성 증가

-      과적합을 제어

 

자식 규칙 노드를 분할해 만들기 위한 최소한의 샘플 데이터 개수

Min_samples_splits = 4 설정시

3개만 있으면 더 이상 자식 규칙 노드를 위한 분할을 하지 않고 리프 노드가 됨

è 자연스럽게 트리 깊이가 줄고, 더욱 간결한 결정트리가 됨

 

 

Min_samples_leaf

리프 노드가 될 수 있는 샘플 데이터 건수의 최솟값

디폴트 1 : 단독 클래스 or 단 한 개의 데이터가 될 때 리프노드가 될 수 있음

 

-      말단 노트(leaf)가 되기 위한 최소한의 샘플 데이터 수

-      과적합 제어 용도

-      비대칭적 데이터일 때 특정 클래스의 데이터가 극도로 작을 수 있음

-      이 경우 작게 설정 필요

 

값을 키우면 더 이상 분할하지 않고 리프 노드가 될 수 있는 조건 완화됨

Min_samples_leaf = 4로 설정시 샘플이 4 이하이면 리프 노드가 되기 때문에 지니 계수 값이 크더라도 샘플이 4인 조건으로 브랜치 노드가 줄어들고 결정 트리가 더 간결해짐

 

Max_leaf_nodes

-      말단 노드의 최대 개수

 

Max_features

-      최적 분할을 위해 고려할 최대 피처 수

-      디폴트 none으로 데이터 세트의 모든 피처를 사용해 분할

-      Int : 대상 피처의 개수, float : 전체 피처 중 대상 피처의 퍼센트

-      Sqrt , auto: 전체 피처 개수의 루트

-      Log 전체 피처 중 log2(전체 피처 개수)

 

어떤 속성을 규칙 조건으로 선택는지 중요함

중요한 몇 개의 피처가 명확한 규칙 트리 만드는 데 크게 기여, 모델을 좀 더 간결하고 이상치에 강한 모델을 만듦

피처의 중요한 역할 지표를 Feature_importances 속성으로 제공함

Dt_clf.feature_feature_importances_

-      Ndarray 형태로 값 반환해 피처 순서대로 값을 할당

-      값이 높을수록 해당 피처의 중요도 높음

 

결정 트리 과적합

어떻게 학습 데이터를 분할해 예측을 수행하는지, 과적합 문제를 시각화함

Make_classification() :분류를 위한 테스트용 데이터 만들기

피처 2, 클래스는 3가지 유형의 분류 샘플 데이터

이를 visualize_boundary(dt_clf, X_features, y_labels ) 함수로 결정 기준을 색상과 경계로 시각화

분할이 자주 일어나서 결정 기준 경계가 많음

Min_saples_leaf = 6으로 트리 생성 조건을 제약시 이상치에 크게 반응하지 않고 더 일반화된 분류 규칙에 따라서 분류됨