출력 y : XOR 연산의 결과
XOR 연산 : 두 입력이 다를 때 1, 같을 때 0을 반환
→ 같은 클래스에 속하는 점들이 서로 대각선 반대편에 위치
→ 어떤 직선을 그어도 0과 1을 완벽히 분리할 수 없음
Titanic dataset
머신러닝 알고리즘의
정확도(Accuracy)와 해석 가능성(Interpretability) 사이의 tradeoff
전체 데이터를 하나의 노드(루트)로 시작하여,
각 노드에서 가장 좋은 기준을 찾아 데이터를 여러 하위 집합으로 분할
이 과정을 재귀적으로(recursive) 반복하면서,
각 노드의 데이터가 가능한 한 하나의 클래스(라벨)에 가까워지도록 함
분할 변수 (Split Variable) 선택
각 노드에서 데이터를 나누기 위해 선택하는 feature
분할 값 (Split Value) 선택
선택된 특징에 대해,
데이터를 두 그룹(이상)으로 나누기 위한 임계치(threshold) 또는 값
: 노드의 데이터가 얼마나 잘 분리되었는지를 평가하는 척도
Purity (순도)
한 노드에 포함된 샘플들이 한 가지 클래스에 치우쳐 있는 정도
Impurity (불순도)
클래스가 섞여 있는 정도
: 현재 노드 t에서 가장 많은 클래스가 아닌 나머지 클래스의 비율을 모두 더한 값
: 현재 노드
: 노드 t에 있는 샘플들 중 클래스 j일 확률
: 노드에서 가장 많이 등장한 우세 클래스(majority class)
• Binary Case (이진 분류의 경우)
모든 샘플이 한 클래스일 경우 오류는 0
두 클래스가 정확히 1:1이면 오류는 0.5
: 노드에 포함된 데이터가 얼마나 섞여 있는지를 측정
: 노드 t에서 클래스 j가 나올 확률
: 각 클래스 비율의 제곱을 더한 값
• Binary Case (이진 분류의 경우)
최솟값 0 : 노드가 모두 한가지 클래스일 경우
최댓값 0.5 : 클래스가 50:50으로 섞여 있을 때 (최대 불순도)
: 데이터의 혼잡도(불확실성)를 측정
노드에 클래스가 섞여 있을수록 → 엔트로피 ↑
한 클래스만 있을수록 → 엔트로피 ↓ (순수함)
t : 현재 노드
j : 클래스 index
: 노드 t에서 클래스 j가 나올 확률
→ 각 클래스의 (비율 × 그 비율의 로그값)을 계산하고, 그 합의 음수값
• Binary Case (이진 분류의 경우)
클래스가 하나로 완전히 몰려 있으면 → Entropy = 0 (완전 순수)
클래스가 50:50으로 섞여 있으면 → Entropy = 1 (최대 불순도)
Entropy > Gini > Class Error
: 결정 트리에서 어떤 분할이 얼마나 좋은지를 평가하기 위한 기준
(부모 노드의 불순도(Impurity) - 자식 노드들의 가중 평균 불순도) 값으로 정의
: 자식 노드의 샘플 수
: 부모 노드의 전체 샘플 수
부모 노드의 불순도에서 자식 노드의 가중 평균 불순도를 뺀 값이 크다
→ 분할 전보다 순도가 많이 개선되었다
→ Information Gain 클수록 좋음
카테고리형 변수의 값이 매우 다양하여 고유값이 많다면,
각 고유값마다 한두 개의 샘플로 매우 작은 자식 노드가 생성
→ 자식 노드들이 거의 모두 순수하게 되어 (불순도 = 0)
정보 이득이 매우 크게 측정될 수 있음
but 과도하게 데이터를 쪼개 overfitting
: 분할 자체가 얼마나 세분화되었는지를 측정하는 값으로,
자식 노드에 할당된 샘플 비율을 바탕으로 엔트로피처럼 계산
: 정보 이득을 분할 정보량으로 나눈 값
→ 정보 이득이 큰 분할이라 하더라도,
분할이 지나치게 세분화되어 있다면 (SplitInfo가 큰 경우) 값을 보정해 줌
과도하게 자식을 많이 만드는 분할의 경우
Gain Ratio가 낮게 측정되어 선택되지 않도록 함
: 두 그룹의 평균 차이가 우연에 의한 것인지,
아니면 통계적으로 유의한 차이가 있는지를 판단하기 위한 통계량
→ 분할의 효과를 평가
: 데이터가 평균 주변에서 얼마나 흩어져 있는지를 나타내는 지표
노드 내 분산이 낮으면 그 노드 내 데이터가 평균값 주변에 몰려 있어
예측 오차가 작아짐
최종 모델의 예측력이 향상되고,
노드별 예측 값(보통 평균값)과 실제 값 사이의 오차가 줄어듦
→ 회귀 트리의 분할 기준 : 분할 시 부모 노드의 전체 분산과 자식 노드들의 가중 분산의 합을 비교하여, 이 차이가 최대가 되는 분할 (자식 노드 분산 합이 최소인 경우)을 선택
: 트리의 성장을 언제 멈출지 결정
→ 과적합(overfitting)을 방지, 모델의 복잡도를 제어
모든 인스턴스가 동일한 클래스에 속할 때
: 현재 노드에 있는 모든 데이터가 같은 클래스
→ 이미 순수한 노드이므로 더 이상 분할할 필요가 없음
모든 속성(attribute) 값이 동일할 때
: 현재 노드의 모든 인스턴스가 모든 속성에서 동일한 값을 가짐
→ 추가 분할 시 아무런 정보도 제공하지 않으므로 멈춤
• 클래스와 속성
속성 : 입력 데이터의 특성을 설명하는 변수이며
클래스 : 예측하고자 하는 결과나 카테고리
→ 각 속성 값들은 모델이 대학 입학 여부(클래스)를 예측하는 데 사용
트리의 깊이 제한 (Depth Threshold)
: 사용자가 사전에 정의한 최대 깊이(maximum depth)에 도달하면,
더 이상 분할을 진행하지 않음
최소 인스턴스 수 (Minimum Number of Instances)
: 노드에 포함된 인스턴스의 수가 사용자가 정의한 최소한의 값보다 작으면, 더 이상 분할하지 않음
불순도 감소의 유의미성 (Significant Decrease in Impurity)
: 분할 후, 불순도(Gini, Entropy)가 사용자가 지정한 임계값(threshold)보다 크게 감소하지 않는다면, 더 이상 분할하지 않음
루트 노드에서 시작하여, 조건(분할 규칙)을 따라 leaf 노드까지 내려가서 최종적으로 도달한 leaf 노드의 정보를 사용합니다.
: 예측하고자 하는 데이터가 분류되어 들어간 그 하나의 leaf 노드에 저장된 클래스 분포 중 다수 클래스를 예측값으로 사용
: 예측하고자 하는 데이터가 분류되어 들어간 그 하나의 leaf 노드에 속한 값들의 평균을 예측값으로 반환
결정 트리가 과적합(overfitting)되는 것을 막기 위해,
완전히 성장한(full grown) 트리에서 불필요한 가지(branch)를 제거하는 방법
→ 모델의 복잡도를 줄이고, 새로운 데이터에 대한 일반화 성능을 향상
Reduced-error Pruning (오차 축소 프루닝)
Cost-complexity Pruning (비용-복잡도 프루닝)
Rule Post-pruning (규칙 기반 후처리 프루닝)
트리의 가장 아래쪽, leaf 노드에 인접한 non-leaf 노드부터 점검
평가할 non-leaf 노드에서 그 아래 모든 자식 노드를 제거하고,
해당 노드를 임시 잎 노드(leaf node)로 만듦
임시 잎 노드에 소속된 학습 데이터의 다수 클래스를 찾아,
그 클래스를 임시 잎 노드의 예측 값으로 설정
임시로 가지치기한 후의 트리를 사용하여
검증 집합(validation set)에 대한 예측 정확도를 측정
위의 과정을 모든 non-leaf 노드에 대해 수행
프루닝은 하위 노드부터 상위 노드로 점차 이동하며 적용
모든 non-leaf를 평가한 후,
프루닝을 적용해도 검증 집합에 대한 성능이 더 이상 개선되지 않는다면 알고리즘은 종료
비용 함수 (Cost Function)
: 트리 T의 예측 오차(또는 불순도)
: 트리의 복잡도를 나타내는 지표, leaf node의 수
→ 잎 노드 수가 많을수록 트리가 복잡
: 복잡도에 부과하는 Penalty 계수
α=0에서부터 α 값을 증가시키면서,
비용 함수 를 최소화하는 서브트리 T(α)들을 생성
α가 증가하면 불필요한 가지들이 제거되어 트리가 점차 단순해짐 (노드 수 감소)
생성되는 트리들은 nested (서로 포함)하는 구조를 이룸
→ 큰 α에 해당하는 트리는 작은 α'에 해당하는 트리의 부분집합
생성된 여러 개의 서브트리
중에서, 검증 집합(validation set)에 대한 예측 성능이 가장 우수한 트리를 선택
결정 트리의 각 잎 노드까지 도달하는 경로를 하나의 규칙으로 표현
ex. "Outlook = sunny", "Humidity = high" 조건을 거쳐
leaf 노드에서 "No"라는 클래스로 분류될 경우
Outlook = sunny ∧ Humidity = high → No
생성된 규칙에서 한 번에 하나씩 조건을 제거해 봄
ex. 위의 규칙에서 "Outlook = sunny" 또는 "Humidity = high" 중 하나를 제거하여 다음과 같은 후보 규칙들을 만듦
후보 1: Outlook = sunny → No
후보 2: Humidity = high → No
각 후보 규칙을 검증 집합(validation set)에 적용하여 예측 성능을 측정
각 규칙에 대해 조건 제거를 반복하여
최종적으로 가장 간단하면서도 예측 성능을 유지하는 규칙을 선택
최종적으로 얻어진 규칙들을 검증 데이터 기준으로 성능이 좋은 순서대로 정렬
→ 새로운 데이터를 예측할 때 어떤 규칙부터 적용할지 결정하는 데 사용
분류 문제와 회귀 문제에 모두 사용할 수 있는 알고리즘
각 노드에서 데이터를 두 개의 하위 집단으로만 분할
→ 분할 기준 : 분류 문제에서는 Gini 불순도(Gini index),
회귀 문제에서는 분산(variance) 감소량을 사용
분할 시 항상 두 그룹으로 나누기 때문에 트리 구조가 단순하고 해석하기 쉬움
회귀 트리의 경우, 각 잎 노드에 있는 값들의 평균을 예측값으로 사용
C4.5는 각 노드에서 하나의 속성에 대해 여러 개의 하위 집단으로 분할
→ 연속형 속성의 경우 구간을 나누거나,
범주형 속성의 모든 값을 고려하여 다중 분할이 가능
분할 기준으로 엔트로피(Entropy)와 Information Gain, 그리고 정보 이득 비율(Gain Ratio)을 사용
→ 각 분할이 데이터의 불확실성을 얼마나 줄이는지를 평가
분할 시 여러 개의 Branch를 허용하기 때문에,
노드가 더 세분화되어 복잡한 데이터 분포를 잘 설명할 수 있음
Information Gain Ratio를 사용해,
고유값이 많은 속성으로 인한 과도한 분할을 보정
하나의 속성에 대해 여러 개의 하위 집단으로 데이터를 분할 가능
카이제곱() 통계량을 사용하여 각 범주 간의 독립성을 판단
→ 분할 시 각 범주 간의 차이가 통계적으로 유의한지를 판단하여,
유의한 차이가 있는 경우에만 분할을 수행
분할 과정에서 통계적 검정을 사용하기 때문에,
분할이 의미 있는 차이에 기반함을 보장
범주형 변수에 강점을 보이며,
다중 분할을 통해 데이터의 상호작용(interaction)을 잘 포착
XOR 문제는 데이터가 대각선 방향으로 교차되어 있어
linear classifier(직선)로는 분리가 불가능함
가로 선 (x₂ 기준)
빨간 점선은 x₂ 값 기준으로 위아래로 데이터를 나눔
세로 선 (x₁ 기준)
x₁ 기준으로 수직 파란 점선으로 한 번 더 분할
→ 4개의 사각형 영역이 생기고, 각 영역에는 하나의 클래스만 존재하도록 분리
색으로 구분된 영역 (초록 / 노랑)마다 한 클래스만 존재하도록 잘 분리되어 있음
결정 트리는 x₁ 또는 x₂ 기준으로 반복적으로 나누면서
복잡한 비선형 경계도 표현 가능
• 트리 구조
트리의 각 내부 노드는 조건을 사용해 데이터를 두 개 이상의 그룹으로 나눔
최종 leaf node에는 데이터들이 모여 있고, 각 데이터들의 클래스가 기록되어 있음
• 예측
트리를 통해 분할한 후 도착한 leaf node에서 다수결(Majority Voting)로 예측
• 트리 구조
분류 트리와 마찬가지로 조건을 사용해 데이터를 여러 구간으로 나누지만, 여기서는 타깃 변수(ex. 집값, 온도 등)가 연속적인 수치
최종 leaf node에는 해당 구간에 속한 연속형 값들이 저장됨
• 예측
새로운 데이터를 트리를 통해 분할한 후 도착한 leaf node의 데이터 값들의 평균값을 예측 결과로 사용