개념
결합확률에서 베이즈 정리로
Lesson 06에서 조건부 확률(conditional probability)을 배웠습니다.
P(A|B) = P(A and B) / P(B)
대칭적으로 아래도 성립합니다.
P(B|A) = P(A and B) / P(A)
두 식은 같은 분자(numerator), 즉 P(A and B)를 공유합니다. 두 식을 같다고 놓고 정리합니다.
P(A and B) = P(A|B) * P(B) = P(B|A) * P(A)
Therefore:
P(A|B) = P(B|A) * P(A) / P(B)
이것이 베이즈 정리(Bayes' theorem)입니다. 네 개의 양과 하나의 방정식으로 이루어져 있습니다.
네 가지 구성 요소
| 구성 요소 | 이름 | 의미 |
|---|
P(A|B) | 사후확률(Posterior) | 증거 B를 본 뒤 A에 대해 갱신된 믿음 |
P(B|A) | 가능도(Likelihood) | A가 참(true)일 때 증거 B가 나타날 확률 |
P(A) | 사전확률(Prior) | 증거를 보기 전 A에 대한 믿음 |
P(B) | 증거(Evidence) | 모든 가능성 아래에서 B가 나타날 총확률 |
증거 항(evidence term) P(B)는 정규화 인자(normalizer) 역할을 합니다. 전체확률법칙(law of total probability)으로 다음과 같이 풀어 쓸 수 있습니다.
P(B) = P(B|A) * P(A) + P(B|not A) * P(not A)
의료 검사(Medical test) 예시
어떤 질병이 10,000명 중 1명에게 영향을 줍니다. 검사는 99% 정확합니다. 환자의 99%를 잡아내고, 건강한 사람에게는 1%의 위양성(false positive)을 냅니다.
P(sick) = 0.0001 (prior: disease is rare)
P(positive|sick) = 0.99 (likelihood: test catches it)
P(positive|healthy) = 0.01 (false positive rate)
P(positive) = P(positive|sick) * P(sick) + P(positive|healthy) * P(healthy)
= 0.99 * 0.0001 + 0.01 * 0.9999
= 0.000099 + 0.009999
= 0.010098
P(sick|positive) = P(positive|sick) * P(sick) / P(positive)
= 0.99 * 0.0001 / 0.010098
= 0.0098
= 0.98%
1%보다 작습니다. 사전확률이 결과를 지배합니다. 어떤 조건이 매우 드물다면 정확한 검사라도 양성 결과의 대부분이 위양성이 됩니다. 의사가 확진 검사(confirmation test)를 추가로 요청하는 이유가 바로 이 때문입니다.
스팸 필터(Spam filter) 예시
lottery라는 단어가 들어간 이메일(email)을 받았습니다. 스팸일까요?
P(spam) = 0.3 (30% of email is spam)
P("lottery"|spam) = 0.05 (5% of spam emails contain "lottery")
P("lottery"|not spam) = 0.001 (0.1% of legitimate emails contain "lottery")
P("lottery") = 0.05 * 0.3 + 0.001 * 0.7
= 0.015 + 0.0007
= 0.0157
P(spam|"lottery") = 0.05 * 0.3 / 0.0157
= 0.955
= 95.5%
단어 하나가 확률을 30%에서 95.5%로 끌어올렸습니다. 실제 스팸 필터는 수백 개의 단어에 대해 베이즈 정리를 동시에 적용합니다.
나이브 베이즈(Naive Bayes): 독립성 가정
나이브 베이즈는 클래스(class)가 주어졌을 때 모든 특징(feature)이 조건부로 독립(conditionally independent)이라고 가정해, 베이즈 정리를 여러 특징으로 확장합니다.
P(class | feature_1, feature_2, ..., feature_n)
= P(class) * P(feature_1|class) * P(feature_2|class) * ... * P(feature_n|class)
/ P(feature_1, feature_2, ..., feature_n)
naive(순진한) 부분은 바로 이 독립성 가정(independence assumption)을 가리킵니다. 실제 텍스트에서 단어의 등장은 서로 독립적이지 않습니다. 예를 들어 New와 York는 강하게 상관(correlated)되어 있습니다. 그럼에도 분류기는 정밀하게 보정된(calibrated) 확률을 만들어 낼 필요 없이 클래스의 순위(ranking)만 잘 매기면 충분하므로, 실제로는 놀랄 만큼 잘 작동합니다.
분모(denominator)는 모든 클래스에 대해 같은 값이므로 생략하고 분자(numerator)만 비교할 수 있습니다.
score(class) = P(class) * product of P(feature_i | class)
점수(score)가 가장 큰 클래스를 고릅니다.
최대가능도추정(MLE)
학습 데이터(training data)에서 P(feature|class)를 어떻게 구할까요? 단순히 세면(count) 됩니다.
P("free"|spam) = ("free"를 포함한 spam email 수) / (전체 spam email 수)
이것이 MLE입니다. 관찰된 데이터(observed data)가 가장 그럴듯해지는 모수(parameter) 값을 고릅니다. 이산 빈도(discrete count)의 경우에는 결국 상대빈도(relative frequency)로 환원됩니다.
문제는, 어떤 단어가 학습 중 스팸에 한 번도 등장하지 않았다면 MLE가 그 단어에 확률 0을 부여한다는 점입니다. 본 적 없는 단어(unseen word) 하나가 전체 곱(product)을 0으로 만들어 버립니다. 이 문제를 라플라스 스무딩(Laplace smoothing)으로 해결합니다.
P(word|class) = (count(word, class) + 1) / (total_words_in_class + vocabulary_size)
모든 빈도 값에 1을 더해 두면 어떤 확률도 0이 되지 않습니다.
최대사후확률추정(MAP)
MLE는 묻습니다. 어떤 모수가 P(data|parameters)를 최대화할까요?
MAP은 묻습니다. 어떤 모수가 P(parameters|data)를 최대화할까요?
베이즈 정리에 따르면 아래 관계가 성립합니다.
P(parameters|data) proportional to P(data|parameters) * P(parameters)
MAP은 모수 자체에 대한 사전분포(prior)를 추가합니다. 모수가 작아야 한다고 믿는다면, 큰 값에 벌점(penalty)을 주는 사전분포로 그 믿음을 표현합니다. 이는 머신러닝의 L2 정규화(L2 regularization)와 동일합니다. 능형회귀(ridge regression)의 능형 벌점(ridge penalty)은 말 그대로 가중치(weight)에 대한 가우시안 사전분포(Gaussian prior)입니다.
| 추정 방식 | 최적화 대상 | 머신러닝의 대응물 |
|---|
| MLE | P(data|params) | 정규화 없는 학습(unregularized training) |
| MAP | P(data|params) * P(params) | L2 / L1 정규화 |
베이지안(Bayesian)과 빈도주의(Frequentist)의 실질적 차이
빈도주의는 모수를 고정된 미지수로 봅니다. "이 실험을 여러 번 반복하면 어떤 일이 벌어질까?"라고 묻습니다.
베이지안은 모수를 분포(distribution)로 봅니다. "내가 관찰한 것을 고려하면 모수에 대해 무엇을 믿어야 하는가?"라고 묻습니다.
머신러닝 시스템을 만들 때 실질적인 차이는 아래와 같습니다.
| 항목 | 빈도주의 | 베이지안 |
|---|
| 출력 | 점 추정값(point estimate) | 값에 대한 분포 |
| 불확실성 | 신뢰구간(confidence interval), 절차에 대한 보장 | 신용구간(credible interval), 모수에 대한 진술 |
| 데이터가 적을 때 | 과적합(overfit) 위험 | 사전분포가 정규화 역할을 함 |
| 계산 | 보통 더 빠름 | 표본추출(sampling, MCMC)이 필요한 경우가 많음 |
실무 머신러닝(production ML)의 대부분은 빈도주의 방식입니다. 확률적 경사하강법(SGD)과 점 추정이 대표적입니다. 베이지안 방법은 보정된 불확실성(calibrated uncertainty)이 중요한 의료 의사결정(medical decision), 안전이 중요한 시스템(safety-critical system), 또는 데이터가 적은 퓨샷 학습(few-shot learning)이나 콜드 스타트(cold start) 상황에서 강점을 가집니다.
베이지안 사고가 머신러닝에 중요한 이유
이 연결은 단순한 비유 이상입니다.
사전분포는 정규화입니다. 가중치에 대한 가우시안 사전분포는 L2 정규화입니다. 라플라스 사전분포(Laplace prior)는 L1입니다. 정규화 항을 추가할 때마다 사실은 어떤 모수 값을 기대하는지에 대한 베이지안적 진술을 하는 셈입니다.
사후분포는 불확실성입니다. 하나의 예측 확률만으로는 모델이 그 추정을 얼마나 확신하는지 알 수 없습니다. 베이지안 방법은 "P(spam)이 0.8과 0.95 사이일 것 같다"처럼 값에 대한 분포를 제공합니다.
베이즈 업데이트는 온라인 학습(online learning)입니다. 오늘의 사후분포가 내일의 사전분포가 됩니다. 모델은 새로운 데이터를 만났을 때 처음부터 다시 학습(retraining)하지 않고, 점진적으로(incrementally) 믿음을 갱신합니다.
모델 비교도 베이지안입니다. 베이즈 정보 기준(Bayesian Information Criterion; BIC), 주변 가능도(marginal likelihood), 베이즈 인자(Bayes factor)는 모두 과적합 없이 모델을 선택하기 위해 베이지안 추론을 활용합니다.
직접 만들기
Step 1: 베이즈 정리(Bayes theorem) 함수
def bayes(prior, likelihood, false_positive_rate):
evidence = likelihood * prior + false_positive_rate * (1 - prior)
posterior = likelihood * prior / evidence
return posterior
result = bayes(prior=0.0001, likelihood=0.99, false_positive_rate=0.01)
print(f"P(sick|positive) = {result:.4f}")
Step 2: 나이브 베이즈 분류기(Naive Bayes classifier)
import math
from collections import defaultdict
class NaiveBayes:
def __init__(self, smoothing=1.0):
self.smoothing = smoothing
self.class_counts = defaultdict(int)
self.word_counts = defaultdict(lambda: defaultdict(int))
self.class_word_totals = defaultdict(int)
self.vocab = set()
def train(self, documents, labels):
for doc, label in zip(documents, labels):
self.class_counts[label] += 1
words = doc.lower().split()
for word in words:
self.word_counts[label][word] += 1
self.class_word_totals[label] += 1
self.vocab.add(word)
def predict(self, document):
words = document.lower().split()
total_docs = sum(self.class_counts.values())
vocab_size = len(self.vocab)
best_class = None
best_score = float("-inf")
for cls in self.class_counts:
score = math.log(self.class_counts[cls] / total_docs)
for word in words:
count = self.word_counts[cls].get(word, 0)
total = self.class_word_totals[cls]
score += math.log((count + self.smoothing) / (total + self.smoothing * vocab_size))
if score > best_score:
best_score = score
best_class = cls
return best_class
로그 확률(log probability)은 언더플로(underflow)를 막아 줍니다. 작은 확률을 많이 곱하면 부동소수점(floating point)으로 표현하기 어려울 만큼 작은 수가 되기 때문입니다. 로그 확률을 더하는 방식은 수치적으로도 안정적(stable)이고, 곱하는 것과 수학적으로 동등(equivalent)합니다.
Step 3: 스팸 데이터(Spam data)로 학습하기
train_docs = [
"win free money now",
"free lottery ticket winner",
"claim your prize today free",
"urgent offer free cash",
"congratulations you won free",
"meeting tomorrow at noon",
"project update attached",
"can we schedule a call",
"quarterly report review",
"lunch on thursday sounds good",
"team standup notes attached",
"please review the pull request",
]
train_labels = [
"spam", "spam", "spam", "spam", "spam",
"ham", "ham", "ham", "ham", "ham", "ham", "ham",
]
classifier = NaiveBayes()
classifier.train(train_docs, train_labels)
test_messages = [
"free money waiting for you",
"meeting rescheduled to friday",
"you won a free prize",
"please review the attached report",
]
for msg in test_messages:
print(f" '{msg}' -> {classifier.predict(msg)}")
Step 4: 학습된 확률(probability) 살펴보기
def show_top_words(classifier, cls, n=5):
vocab_size = len(classifier.vocab)
total = classifier.class_word_totals[cls]
probs = {}
for word in classifier.vocab:
count = classifier.word_counts[cls].get(word, 0)
probs[word] = (count + classifier.smoothing) / (total + classifier.smoothing * vocab_size)
sorted_words = sorted(probs.items(), key=lambda x: x[1], reverse=True)
for word, prob in sorted_words[:n]:
print(f" {word}: {prob:.4f}")
print("\nTop spam words:")
show_top_words(classifier, "spam")
print("\nTop ham words:")
show_top_words(classifier, "ham")
사용해보기
Scikit-learn은 실무에 바로 쓸 수 있는(production-ready) 나이브 베이즈 구현을 제공합니다.
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(train_docs)
clf = MultinomialNB()
clf.fit(X_train, train_labels)
X_test = vectorizer.transform(test_messages)
predictions = clf.predict(X_test)
for msg, pred in zip(test_messages, predictions):
print(f" '{msg}' -> {pred}")
같은 알고리즘입니다. CountVectorizer는 토큰화(tokenization)와 어휘 사전 구축(vocabulary building)을 처리합니다. MultinomialNB는 스무딩과 로그 확률 계산을 내부에서 처리합니다. 직접 만든 버전도 40줄 안에서 같은 일을 해냅니다.
산출물 만들기
이 lesson의 검수 대상은 아래 두 가지입니다.
code/bayes.py: 표준 라이브러리만으로 끝까지 실행되는 베이즈 정리, 나이브 베이즈, 순차 업데이트(sequential update), A/B 테스트 예제
outputs/prompt-bayesian-reasoning.md: 베이지안 추론(Bayesian reasoning)을 단계별로 점검하는 프롬프트(prompt)
켤레 사전분포
사전분포와 사후분포가 같은 분포 패밀리(distribution family)에 속하면 그 사전분포를 켤레 사전분포(conjugate prior)라고 부릅니다. 이 경우 베이지안 업데이트가 대수적으로 깔끔(algebraically clean)해집니다. 수치적 적분(numerical integration) 없이 닫힌 형식(closed-form)의 사후분포를 얻을 수 있기 때문입니다.
| 가능도(Likelihood) | 켤레 사전분포(Conjugate Prior) | 사후분포(Posterior) | 예시 |
|---|
| 베르누이(Bernoulli) | Beta(a, b) | Beta(a + 성공 수, b + 실패 수) | 동전 편향(bias) 추정 |
| 정규(Normal, 분산 알려진 경우) | Normal(mu_0, sigma_0) | Normal(가중 평균, 더 작은 분산) | 센서 보정(sensor calibration) |
| 푸아송(Poisson) | Gamma(a, b) | Gamma(a + 빈도 합, b + n) | 도착률(arrival rate) 모델링 |
| 다항(Multinomial) | Dirichlet(alpha) | Dirichlet(alpha + 빈도) | 토픽 모델링, 언어 모델 |
켤레 사전분포가 없으면 사후분포를 근사하기 위해 몬테카를로 표본추출(Monte Carlo sampling)이나 변분 추론(variational inference)이 필요합니다. 켤레 사전분포가 있다면 숫자 두 개만 갱신하면 됩니다.
베타 분포(Beta distribution)는 실무에서 가장 자주 쓰이는 켤레 사전분포입니다. Beta(a, b)는 어떤 확률 모수에 대한 믿음을 나타냅니다. 평균은 a/(a+b)입니다. a+b가 커질수록 분포가 더 좁게 뾰족해(concentrated)집니다.
베타 사전분포의 특수한 경우는 다음과 같습니다.
Beta(1, 1)은 균등 분포(uniform)입니다. 모수에 대해 아무런 의견이 없는 상태입니다.
Beta(10, 10)은 0.5 근처에서 뾰족합니다. 모수가 0.5 부근일 거라고 강하게 믿는 상태입니다.
Beta(1, 10)은 0 쪽으로 치우친(skewed) 모양입니다. 모수가 작다고 믿는 상태입니다.
업데이트 규칙은 매우 단순합니다.
Prior: Beta(a, b)
Data: s successes, f failures
Posterior: Beta(a + s, b + f)
적분도 표본추출도 필요하지 않습니다. 단순한 덧셈만 있습니다.
순차 베이지안 업데이트(Sequential Bayesian updating)
베이지안 추론(Bayesian inference)은 본래 순차적(sequential)인 성질을 가집니다. 오늘의 사후분포가 내일의 사전분포가 됩니다. 실제 시스템이 과거 데이터(historical data)를 모두 다시 처리하지 않고도 점진적으로 학습할 수 있는 이유가 바로 이 때문입니다.
동전이 공정한지(fair) 추정하는 구체적인 예시를 살펴봅니다.
1일 차: 아직 데이터가 없습니다.
Beta(1, 1) 균등 사전분포로 시작합니다. 아무런 의견이 없는 상태입니다.
- 사전 평균(prior mean): 0.5
- 사전분포는
[0, 1] 구간 전체에서 평평(flat)합니다.
2일 차: 앞면 7번, 뒷면 3번을 관찰합니다.
사후분포 = Beta(1 + 7, 1 + 3) = Beta(8, 4)
- 사후 평균(posterior mean):
8/12 = 0.667
- 증거는 동전이 앞면 쪽으로 치우쳤음(biased)을 시사합니다.
3일 차: 앞면 5번, 뒷면 5번을 추가로 관찰합니다.
어제의 사후분포를 오늘의 사전분포로 사용합니다.
사후분포 = Beta(8 + 5, 4 + 5) = Beta(13, 9)
- 사후 평균:
13/22 = 0.591
- 새로 들어온 균형 잡힌 데이터가 추정값을 0.5 쪽으로 다시 끌어당겼습니다.
graph LR
A["Prior<br/>Beta(1,1)<br/>mean = 0.50"] -->|"7H, 3T"| B["Posterior 1<br/>Beta(8,4)<br/>mean = 0.67"]
B -->|"becomes prior"| C["Prior 2<br/>Beta(8,4)"]
C -->|"5H, 5T"| D["Posterior 2<br/>Beta(13,9)<br/>mean = 0.59"]
관찰의 순서는 결과에 영향을 주지 않습니다. Beta(1,1)에 앞면 12번, 뒷면 8번을 한꺼번에 업데이트해도 동일하게 Beta(13, 9)가 됩니다. 즉, 순차 업데이트와 일괄 업데이트(batch updating)는 수학적으로 동등합니다. 그러나 순차 업데이트는 원본 데이터(raw data)를 저장하지 않고도 매 단계에서 의사결정을 내릴 수 있게 해 준다는 실용적인 장점이 있습니다.
이것이 실무 머신러닝 시스템의 온라인 학습(online learning)을 떠받치는 기반입니다. 멀티 암드 밴딧(bandit)의 톰슨 샘플링(Thompson sampling), 점진적 추천 시스템(incremental recommendation system), 스트리밍 이상 탐지기(streaming anomaly detector)가 모두 이 패턴을 따릅니다.
A/B 테스트(A/B testing)와의 연결
A/B 테스트는 사실상 위장된 베이지안 추론입니다.
상황은 이렇습니다. 두 가지 버튼 색상을 비교 실험합니다. 변형 A(variant A)는 파란색, 변형 B(variant B)는 초록색입니다. 어느 쪽이 더 많은 클릭을 얻는지 알고 싶습니다.
베이지안 방식의 A/B 테스트는 아래와 같이 진행됩니다.
- 사전분포(Prior). 두 변형 모두
Beta(1, 1)로 시작합니다. 사전 선호(preference)가 없습니다.
- 데이터(Data). 변형 A: 1000회 노출 중 50회 클릭. 변형 B: 1000회 노출 중 65회 클릭.
- 사후분포(Posteriors).
- A:
Beta(1 + 50, 1 + 950) = Beta(51, 951). 평균 = 0.051
- B:
Beta(1 + 65, 1 + 935) = Beta(66, 936). 평균 = 0.066
- 의사결정(Decision).
P(B > A), 즉 B의 실제 전환율(conversion rate)이 A보다 높을 확률을 계산합니다.
P(B > A)를 해석적(analytic)으로 계산하기는 까다롭습니다. 그러나 몬테카를로 방식을 쓰면 매우 단순해집니다.
1. Beta(51, 951)에서 100,000개 표본을 뽑습니다. -> samples_A
2. Beta(66, 936)에서 100,000개 표본을 뽑습니다. -> samples_B
3. P(B > A) = B 표본이 A 표본보다 큰 비율
P(B > A) > 0.95이면 변형 B를 배포(ship)합니다. 0.05와 0.95 사이라면 데이터를 더 모읍니다. P(B > A) < 0.05이면 변형 A를 배포합니다.
빈도주의 A/B 테스트와 비교했을 때 장점은 다음과 같습니다.
- "B가 더 좋을 확률이 97%입니다"처럼 직접적인 확률 진술을 얻을 수 있습니다.
- p값(p-value) 해석상의 혼란이 없습니다. "귀무가설을 기각하지 못했다" 같은 애매한 표현이 줄어듭니다.
- 위양성률을 부풀리지 않고도 언제든 결과를 들여다볼 수 있습니다. 즉, 엿보기 문제(peeking problem)가 없습니다.
- "이전 실험에서 전환율은 보통 3-8%였다" 같은 사전 지식을 반영할 수 있습니다.
| 항목 | 빈도주의 A/B | 베이지안 A/B |
|---|
| 출력 | p값 | P(B > A) |
| 해석 | "A=B라면 이 데이터가 얼마나 놀라운가?" | "B가 A보다 좋을 가능성이 얼마나 높은가?" |
| 조기 종료 | 위양성률이 부풀려짐 | 잘 선택한 사전분포와 올바르게 지정된 모델이라면 어느 시점에도 안전 |
| 사전 지식 | 사용하지 않음 | 베타 사전분포로 인코딩 |
| 결정 규칙 | p < 0.05 | P(B > A) > threshold |
연습문제
- 반복 검사(Multiple tests) — 쉬움. 99% 정확한 두 개의 독립 검사(independent test)를 모두 받았고 둘 다 양성이 나왔습니다. 질병의 유병률(prevalence)은 10,000명 중 1명입니다. 두 검사 뒤
P(sick)은 얼마인가요? 첫 번째 검사의 사후분포를 두 번째 검사의 사전분포로 사용합니다.
- 스무딩의 영향(Smoothing impact) — 중간. 스팸 분류기를 스무딩 값 0.01, 0.1, 1.0, 10.0으로 각각 실행해 봅니다. 상위 단어들의 확률이 어떻게 달라지나요?
smoothing=0인 상태에서 햄(ham)에만 등장한 단어가 있다면 무슨 일이 벌어지나요?
- 특징 추가(Add features) — 어려움.
NaiveBayes 클래스를 확장해 단어 빈도와 함께 메시지 길이(짧음/긺)를 하나의 특징으로 사용합니다. 학습 데이터에서 P(short|spam)과 P(short|ham)을 추정하고 예측 점수(prediction score)에 반영합니다.
- MAP을 손으로 계산하기(MAP by hand) — 어려움. 동전을 10번 던져 앞면이 7번 나온 관찰 데이터가 있습니다.
Beta(2,2) 사전분포를 사용해 동전 편향의 MAP 추정값을 구하고, MLE 추정값 7/10과 비교해 봅니다.
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 사전확률(Prior) | 초기 추측 | 증거를 관찰하기 전 가설의 확률. 머신러닝에서는 정규화 항(regularization term)에 해당한다 |
| 가능도(Likelihood) | 데이터가 얼마나 잘 맞는가 | P(evidence|hypothesis). 특정 가설 아래에서 관찰된 데이터가 얼마나 그럴듯한가 |
| 사후확률(Posterior) | 갱신된 믿음 | P(hypothesis|evidence). 사전확률에 가능도를 곱한 뒤 정규화한 값 |
| 증거(Evidence) | 정규화 상수 | 모든 가설에 걸친 P(data). 사후확률이 합쳐 1이 되도록 만든다 |
| 나이브 베이즈(Naive Bayes) | 단순한 텍스트 분류기 | 클래스가 주어졌을 때 특징들이 서로 독립이라고 가정하는 분류기. 잘못된 가정에도 실무에서 잘 작동한다 |
| 라플라스 스무딩(Laplace smoothing) | Add-one 스무딩 | 본 적 없는 데이터가 영확률(zero probability)을 만들지 않도록 모든 특징에 작은 빈도 값을 더하는 방식 |
| MLE | 빈도를 그대로 쓰면 됨 | P(data|parameters)를 최대화하는 모수를 고른다. 사전분포가 없어 데이터가 적을 때 과적합될 수 있다 |
| MAP | 사전분포가 있는 MLE | P(data|parameters) * P(parameters)를 최대화한다. 정규화된 MLE와 대응된다 |
| 로그 확률(Log-probability) | 로그 공간에서 계산 | 작은 확률을 많이 곱할 때 부동소수점 언더플로를 피하기 위해 P 대신 log(P)를 사용한다 |
| 위양성(False positive) | 잘못된 경보 | 검사는 양성이라고 말했지만 실제 상태는 음성인 경우. 기저율 오류(base rate fallacy)를 만든다 |
더 읽을거리