목차
결정트리, 특징, 시각화, 파라미터, 과적합
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으로 트리 생성 조건을 제약시 이상치에 크게 반응하지 않고 더 일반화된 분류 규칙에 따라서 분류됨
'Machine Learning & Deep Learning > 파이썬 머신러닝 완벽 가이드(공룡책)' 카테고리의 다른 글
스태킹 앙상블 (0) | 2023.06.29 |
---|---|
불균형 데이터 처리, 언더 샘플링, 오버 샘플링 (0) | 2023.06.28 |
p39 ~ 04 데이터 핸들링- 판다스 (0) | 2023.05.21 |