Теорема Байеса
Теорема Байеса переворачивает условную вероятность: зная P(тест|болезнь), вычисляет то, что нам реально нужно — P(болезнь|тест).
Теорема Байеса:
P(A|B) = P(B|A)·P(A) / P(B). Она связывает «обратные» условные вероятности и обновляет наши убеждения с учётом новых данных.
Откуда она берётся
Вывод — одна строчка. Условную вероятность можно записать двумя способами: P(A и B) = P(A|B)·P(B) и P(A и B) = P(B|A)·P(A). Левые части равны, значит равны и правые: P(A|B)·P(B) = P(B|A)·P(A). Делим на P(B) — получаем теорему Байеса. Простая алгебра, но колоссальные следствия.
Знаменитый пример: редкая болезнь
Болезнь есть у 1% людей. Тест на неё: при болезни даёт «положительно» в 99% случаев (чувствительность), а у здоровых ошибочно «положительно» в 5% случаев. Вопрос: у вас положительный тест — какова вероятность, что вы действительно больны? Интуиция кричит «99%», но это ловушка. Посчитаем по Байесу.
# Дано
P_disease = 0.01 # P(болезнь)
P_pos_given_disease = 0.99 # P(тест+ | болезнь) — чувствительность
P_pos_given_healthy = 0.05 # P(тест+ | здоров) — ложная тревога
# P(тест+) по формуле полной вероятности
P_healthy = 1 - P_disease
P_pos = P_pos_given_disease * P_disease + P_pos_given_healthy * P_healthy
# Теорема Байеса: P(болезнь | тест+)
P_disease_given_pos = P_pos_given_disease * P_disease / P_pos
print("P(положительный тест) =", round(P_pos, 4))
print("P(болезнь | тест+) =", round(P_disease_given_pos, 4))
print("То есть всего около", round(P_disease_given_pos * 100, 1), "%")
Вывод:
P(положительный тест) = 0.0594 P(болезнь | тест+) = 0.1667 То есть всего около 16.7 %
Почему всего 17%, а не 99%
Парадокс объясняется на пальцах через «естественные частоты». Возьмём 10 000 человек:
- Больных: 100 (1%). Из них тест верно ловит 99 → 99 истинно-положительных.
- Здоровых: 9 900. Из них тест ошибочно тревожит 5% → 495 ложно-положительных.
- Всего «положительных»: 99 + 495 = 594. Из них реально больны лишь 99.
Значит P(болезнь | тест+) = 99 / 594 ≈ 0.167. Здоровых так много, что даже редкие их ошибки (5%) числом задавливают честные срабатывания на больных. Вывод важен для ML: на несбалансированных данных (редкий класс) высокая «точность теста» обманчива — это та же ловушка.
# Проверим Байеса прямой симуляцией на 2 млн человек
import random
random.seed(2024)
N = 2_000_000
true_pos = 0 # болен и тест+
false_pos = 0 # здоров и тест+
for _ in range(N):
sick = random.random() < 0.01
if sick:
positive = random.random() < 0.99
else:
positive = random.random() < 0.05
if positive:
if sick:
true_pos += 1
else:
false_pos += 1
print("Положительных всего:", true_pos + false_pos)
print("Из них реально больны:", true_pos)
print("P(болезнь | тест+) ≈", round(true_pos / (true_pos + false_pos), 4))
Вывод:
Положительных всего: 118974 Из них реально больны: 19712 P(болезнь | тест+) ≈ 0.1657
Симуляция дала ≈ 0.167 — ровно то, что предсказала теорема Байеса. Формула не обманула.
Связь с ML: наивный байесовский классификатор
Теорема Байеса — это целое семейство моделей. Наивный байес классифицирует спам так: по словам письма (данные B) вычисляет P(спам | слова) через P(слова | спам) и априорную P(спам). «Наивность» — в допущении независимости слов, что упрощает расчёт. Сам принцип «обновить вероятность гипотезы с учётом данных» — фундамент байесовского взгляда на всё машинное обучение.
Итог
- Теорема Байеса: P(A|B) = P(B|A)·P(A) / P(B); выводится из двух записей P(A и B).
- Она переворачивает условную вероятность: из P(тест|болезнь) даёт P(болезнь|тест).
- Парадокс редкой болезни: при редком событии даже точный тест даёт много ложных тревог.
- В ML это наивный байесовский классификатор и ловушка несбалансированных классов.