Skip to Content
독학사독학사 2단계머신러닝10. 결정트리와 나이브 베이즈 분류

이번 문서의 목표: 결정트리가 어떤 기준으로 데이터를 나누는지 지니 지수와 엔트로피·정보이득을 실제 숫자 10개로 끝까지 계산해 검산하고, 나이브 베이즈가 조건부 독립을 가정해 어떻게 실제 확률을 계산하는지 손으로 재현할 수 있게 한다.

왜 “어떻게 나눌지”가 문제인가 — 결정트리의 출발점

06편에서 지도학습은 입력 특징으로 정답 레이블을 맞히는 문제라고 배웠습니다. 결정트리(Decision Tree)는 스무고개처럼 “이 조건을 만족하는가?”라는 질문을 반복해서 데이터를 점점 더 순수한(한 클래스에 가까운) 그룹으로 쪼개 나가는 알고리즘입니다. 문제는 데이터를 나누는 기준이 되는 질문(어떤 특징을, 어떤 값으로 나눌지)이 무수히 많다는 점입니다. 결정트리는 나눈 뒤 두 그룹이 얼마나 순수해지는가를 숫자로 재서, 가장 순수해지는 질문을 고릅니다. 이 순수도를 재는 두 가지 지표가 지니 지수(Gini Index)와 엔트로피(Entropy)입니다.

쉽게 말하면: 지니 지수와 엔트로피는 “한 그룹 안에 서로 다른 클래스가 얼마나 섞여 있는가”를 숫자 하나로 나타낸 것입니다. 값이 작을수록 순수합니다(한 클래스로만 몰려 있다는 뜻).

1. 지니 지수와 엔트로피 — 실제 숫자로 계산

쇼핑몰 고객 10명의 구매 여부 데이터가 있습니다. 이 중 6명은 “구매”(양성), 4명은 “비구매”(음성)입니다. 먼저 나누기 전 이 10명 전체(루트 노드)의 순수도를 계산합니다.

p+=610=0.6,p=410=0.4p_{+} = \frac{6}{10} = 0.6, \quad p_{-} = \frac{4}{10} = 0.4

지니 지수는 “무작위로 뽑은 두 샘플이 서로 다른 클래스일 확률”을 나타내며, 공식은 다음과 같습니다.

Gini=1kpk2Gini = 1 - \sum_{k} p_k^2
  • pkp_k: 클래스 kk가 노드 안에서 차지하는 비율
Giniroot=1(0.62+0.42)=1(0.36+0.16)=10.52=0.48Gini_{root} = 1 - (0.6^2 + 0.4^2) = 1 - (0.36+0.16) = 1 - 0.52 = 0.48

엔트로피는 정보이론에서 “불확실성의 크기”를 재는 지표로, 값이 클수록 어떤 클래스가 나올지 예측하기 어렵다는 뜻입니다.

Entropy=kpklog2pkEntropy = -\sum_{k} p_k \log_2 p_k
  • log2\log_2: 밑이 2인 로그(정보를 이진수 비트 단위로 재기 위함)
log2(0.6)0.737,log2(0.4)1.322\log_2(0.6) \approx -0.737, \quad \log_2(0.4) \approx -1.322 Entropyroot=(0.6×(0.737)+0.4×(1.322))=(0.4420.529)=0.971Entropy_{root} = -(0.6 \times (-0.737) + 0.4 \times (-1.322)) = -(-0.442 - 0.529) = 0.971

결과 해석: 루트 노드는 지니 0.480.48, 엔트로피 0.9710.971로 순수하지 않은(섞인) 상태입니다. 만약 6:4가 아니라 10:0(한 클래스만 있음)이었다면 두 지표 모두 00이 되고, 5:5(완전히 반반)였다면 지니는 0.50.5, 엔트로피는 11로 최댓값을 가집니다.

2. 분할 후 정보이득 계산 — 전 과정

“회원등급이 VIP인가?”라는 질문으로 10명을 나눴더니, VIP 그룹(A) 7명 중 5명이 구매·2명이 비구매, 일반 그룹(B) 3명 중 1명이 구매·2명이 비구매로 나뉘었습니다.

검산 1 (분할 전후 인원수 일치 확인): 7+3=107+3=10(전체 일치), 5+1=65+1=6(구매자 합 일치), 2+2=42+2=4(비구매자 합 일치). 분할이 데이터를 빠뜨리지 않고 정확히 나눴음을 확인했습니다.

그룹 A(7명: 구매 5, 비구매 2)의 지니와 엔트로피:

p+=570.714,p=270.286p_{+}=\frac{5}{7}\approx0.714, \quad p_{-}=\frac{2}{7}\approx0.286 GiniA=1(0.7142+0.2862)=1(0.510+0.082)=10.592=0.408Gini_A = 1 - (0.714^2+0.286^2) = 1-(0.510+0.082) = 1-0.592 = 0.408 log2(0.714)0.485,log2(0.286)1.807\log_2(0.714)\approx-0.485, \quad \log_2(0.286)\approx-1.807 EntropyA=(0.714×(0.485)+0.286×(1.807))=(0.3470.517)=0.863Entropy_A = -(0.714\times(-0.485)+0.286\times(-1.807)) = -(-0.347-0.517) = 0.863

그룹 B(3명: 구매 1, 비구매 2)의 지니와 엔트로피:

p+=130.333,p=230.667p_{+}=\frac{1}{3}\approx0.333, \quad p_{-}=\frac{2}{3}\approx0.667 GiniB=1(0.3332+0.6672)=1(0.111+0.444)=10.556=0.444Gini_B = 1-(0.333^2+0.667^2) = 1-(0.111+0.444) = 1-0.556 = 0.444 log2(0.333)1.585,log2(0.667)0.585\log_2(0.333)\approx-1.585, \quad \log_2(0.667)\approx-0.585 EntropyB=(0.333×(1.585)+0.667×(0.585))=(0.5280.390)=0.918Entropy_B = -(0.333\times(-1.585)+0.667\times(-0.585)) = -(-0.528-0.390) = 0.918

전체 분할 후 가중평균(그룹 크기 비율로 가중치를 매김):

Entropysplit=710×0.863+310×0.918=0.604+0.275=0.880Entropy_{split} = \frac{7}{10}\times0.863 + \frac{3}{10}\times0.918 = 0.604+0.275 = 0.880 Ginisplit=710×0.408+310×0.444=0.286+0.133=0.419Gini_{split} = \frac{7}{10}\times0.408 + \frac{3}{10}\times0.444 = 0.286+0.133 = 0.419

정보이득(Information Gain)은 분할 전 불순도에서 분할 후 가중평균 불순도를 뺀 값으로, 이 값이 클수록 좋은 분할입니다.

IGentropy=EntropyrootEntropysplit=0.9710.880=0.091IG_{entropy} = Entropy_{root} - Entropy_{split} = 0.971 - 0.880 = 0.091 IGgini=GinirootGinisplit=0.480.419=0.061IG_{gini} = Gini_{root} - Gini_{split} = 0.48 - 0.419 = 0.061

검산 2 (극단값으로 지표 확인): 만약 VIP 그룹이 7명 전부 구매였다면 EntropyA=0Entropy_A=0, GiniA=0Gini_A=0이 되어 완전히 순수한 노드가 됩니다. 위 계산에서 EntropyA=0.863Entropy_A=0.863, GiniA=0.408Gini_A=0.40800보다 크게 나온 것은 이 그룹에 아직 비구매자 2명이 섞여 있기 때문이며, 실제 그룹 구성(5:2)과 방향이 일치합니다. 결정트리는 여러 후보 질문(특징) 각각에 대해 이 정보이득을 계산한 뒤, 정보이득이 가장 큰 질문을 그 노드의 분할 기준으로 선택합니다.

3. 지니와 엔트로피, 무엇이 다른가

구분지니 지수엔트로피
최솟값00(완전 순수)00(완전 순수)
이진분류 최댓값0.50.5(5:5일 때)11(5:5일 때)
계산 비용로그 계산이 없어 더 빠름로그 계산이 필요해 상대적으로 느림
사용 알고리즘CARTID3, C4.5
실무 차이두 지표로 고른 분할 기준은 대부분 비슷하며, 결과에 큰 차이가 나는 경우는 드물다

4. 가지치기 — 결정트리의 과적합 대응

결정트리를 끝까지(모든 노드가 완전히 순수해질 때까지) 키우면 훈련 데이터의 노이즈까지 전부 외워버려 과적합이 심하게 발생합니다. 이를 막는 방법을 가지치기(Pruning)라고 합니다.

방법방식
사전 가지치기(Pre-pruning)트리의 최대 깊이, 노드가 갈라지기 위한 최소 샘플 수 등을 미리 제한해 트리가 너무 커지지 않게 막는다
사후 가지치기(Post-pruning)일단 트리를 끝까지 키운 뒤, 검증 데이터 성능이 나아지지 않는 가지를 잘라낸다

과적합과 편향-분산 트레이드오프의 일반적인 이론은 19편에서 교차검증과 함께 더 깊이 다룹니다. 결정트리에서는 “깊이가 깊을수록 훈련 정확도는 올라가지만 검증 정확도는 어느 시점부터 떨어진다”는 패턴이 대표적인 출제 포인트입니다.

5. 나이브 베이즈 — 조건부 독립을 가정하고 확률을 곱한다

나이브 베이즈(Naive Bayes)는 베이즈 정리(조건부 확률을 뒤집어 계산하는 정리)를 이용해 “이 데이터가 주어졌을 때 어떤 클래스일 확률이 가장 높은가”를 계산하는 분류 알고리즘입니다. 이름의 “나이브(순진한)“는 모든 특징이 클래스가 주어졌을 때 서로 독립적이라는, 실제로는 잘 맞지 않을 수 있는 순진한 가정을 그대로 밀어붙이기 때문에 붙은 이름입니다.

쉽게 말하면: 나이브 베이즈는 “이 메일에 ‘무료’라는 단어가 있을 확률”과 “‘할인’이라는 단어가 있을 확률”을 마치 서로 아무 상관 없는 것처럼 각각 따로 계산해서 곱해버립니다. 실제로는 두 단어가 함께 나오는 경향이 있어도 무시하는 것입니다.

조건부 독립 가정(Conditional Independence Assumption)을 수식으로 쓰면 다음과 같습니다.

P(x1,x2C)=P(x1C)×P(x2C)P(x_1,x_2|C) = P(x_1|C) \times P(x_2|C)
  • CC: 클래스(예: 스팸 여부)
  • x1,x2x_1, x_2: 특징(예: 특정 단어의 등장 여부)

실제 확률로 계산해 보겠습니다. 스팸 메일 분류기를 만든다고 합시다. 사전 확률(Prior, 데이터를 보기 전에 이미 알고 있는 클래스 비율)과 각 단어가 클래스별로 등장할 조건부 확률(Likelihood, 우도)이 다음과 같습니다.

구분스팸(Spam)정상(Ham)
사전 확률 P(C)P(C)0.40.6
P(’무료’C)P(\text{'무료'} \vert C)0.70.2
P(’할인’C)P(\text{'할인'} \vert C)0.60.3

새로 온 메일에 “무료”와 “할인”이 둘 다 들어 있습니다. 조건부 독립을 가정해 각 클래스에 대한 값을 계산합니다(베이즈 정리의 분모는 두 클래스에서 공통이므로 비교 목적에서는 생략하고, 분자만 계산한 뒤 마지막에 정규화합니다).

P(Spam)×P(무료Spam)×P(할인Spam)=0.4×0.7×0.6=0.168P(Spam) \times P(\text{무료}|Spam) \times P(\text{할인}|Spam) = 0.4 \times 0.7 \times 0.6 = 0.168 P(Ham)×P(무료Ham)×P(할인Ham)=0.6×0.2×0.3=0.036P(Ham) \times P(\text{무료}|Ham) \times P(\text{할인}|Ham) = 0.6 \times 0.2 \times 0.3 = 0.036

두 값을 더한 합으로 각각을 나누어 실제 확률로 정규화합니다.

P(Spam무료,할인)=0.1680.168+0.036=0.1680.2040.824P(Spam|\text{무료,할인}) = \frac{0.168}{0.168+0.036} = \frac{0.168}{0.204} \approx 0.824 P(Ham무료,할인)=0.0360.2040.176P(Ham|\text{무료,할인}) = \frac{0.036}{0.204} \approx 0.176

검산: 0.824+0.176=1.0000.824+0.176=1.000으로 확률의 합이 정확히 11이 됩니다. 이 메일은 스팸일 확률이 약 82.4퍼센트로 계산되어 스팸으로 분류됩니다.

자주 틀리는 함정 — 제로 확률 문제(Zero-Frequency Problem): 만약 훈련 데이터에 “할인”이라는 단어가 스팸 메일에서 단 한 번도 등장한 적이 없어 P(할인Spam)=0P(\text{할인}|Spam)=0으로 추정되면, 조건부 독립 가정에 따라 전체 곱셈 결과가 다른 단어와 무관하게 무조건 00이 되어버립니다. 이를 막기 위해 모든 확률에 작은 값을 더해 00이 되지 않게 보정하는 라플라스 스무딩(Laplace Smoothing, 가산 평활화)을 함께 씁니다.

6. 결정트리 vs 나이브 베이즈

구분결정트리나이브 베이즈
기본 원리불순도(지니·엔트로피)가 가장 크게 줄어드는 질문으로 반복 분할조건부 독립을 가정하고 베이즈 정리로 사후 확률 계산
해석 가능성매우 높음(질문 흐름을 그대로 사람이 읽을 수 있음)각 특징의 기여도를 확률로 확인 가능하나 트리만큼 직관적이지는 않음
과적합 위험깊이 제한이 없으면 매우 높음(가지치기 필요)상대적으로 낮음(가정이 강해 오히려 과적합에 덜 취약)
특징 간 상관관계자연스럽게 반영됨(순차적 분할이 상호작용을 포착)조건부 독립 가정을 위반하면 성능이 떨어질 수 있음
대표 활용신용 심사, 의료 진단 규칙처럼 근거 설명이 중요한 경우스팸 필터링, 텍스트 분류처럼 특징 수가 많고 계산이 빨라야 하는 경우

자주 틀리는 점: “나이브 베이즈는 특징 간 상관관계를 반영해 더 정교하게 계산한다”는 설명은 틀렸습니다. 오히려 정반대로, 나이브 베이즈는 특징 간 상관관계를 무시하는(독립으로 가정하는) 알고리즘이며, 이 단순한 가정 덕분에 계산이 빠르고 적은 데이터로도 잘 작동한다는 것이 장점입니다.

핵심 정리

  • 지니 지수 1pk21-\sum p_k^2와 엔트로피 pklog2pk-\sum p_k\log_2 p_k는 노드의 불순도를 재며, 값이 작을수록 순수한 노드다. 6:4 데이터에서 지니는 0.480.48, 엔트로피는 0.9710.971이다.
  • 정보이득은 분할 전 불순도에서 분할 후 가중평균 불순도를 뺀 값이며, 결정트리는 정보이득이 가장 큰 질문을 분할 기준으로 선택한다.
  • 결정트리는 깊이 제한 없이 키우면 과적합되므로 사전·사후 가지치기로 대응한다.
  • 나이브 베이즈는 특징들이 클래스가 주어졌을 때 서로 독립이라고(조건부 독립) 가정해 우도들을 단순히 곱한 뒤 정규화해 사후 확률을 구한다. 제로 확률 문제는 라플라스 스무딩으로 보정한다.

마무리 복습

문제 14지선다
구매 6명, 비구매 4명(총 10명)인 노드의 지니 지수로 옳은 것은?
문제 24지선다
같은 10명을 VIP 그룹(7명: 구매5, 비구매2)과 일반 그룹(3명: 구매1, 비구매2)으로 나눴을 때, 분할 후 가중평균 엔트로피(약 0.880)를 이용한 정보이득으로 가장 가까운 것은? (분할 전 엔트로피는 0.971)
문제 34지선다
결정트리를 제한 없이 끝까지 키웠을 때 가장 우려되는 문제와 그 대응으로 가장 적절한 것은?
문제 44지선다
나이브 베이즈 분류기의 '나이브(순진한)'라는 이름이 붙은 이유로 가장 적절한 것은?
문제 54지선다
본문 예제에서 P(Spam)*P('무료'|Spam)*P('할인'|Spam)=0.168, P(Ham)*P('무료'|Ham)*P('할인'|Ham)=0.036일 때, 정규화한 P(Spam|무료,할인)로 가장 가까운 것은?
문제 64지선다
훈련 데이터에 특정 단어가 스팸 메일에서 한 번도 등장하지 않아 조건부 확률이 0으로 추정되는 문제를 보정하는 방법은?
문제 74지선다
결정트리와 나이브 베이즈를 비교한 설명으로 옳지 않은 것은?
문제 84지선다
지니 지수와 엔트로피에 대한 설명으로 옳지 않은 것은?

참고 자료

Last updated on