Теорема Байеса

Теорема Байеса переворачивает условную вероятность: зная 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 это наивный байесовский классификатор и ловушка несбалансированных классов.
Проверьте себя
1. Как записывается теорема Байеса?
AP(A|B) = P(A)·P(B)
BP(A|B) = P(B|A)·P(A) / P(B)
CP(A|B) = P(B|A) / P(A)
DP(A|B) = P(A) + P(B) − P(B|A)
2. Почему при положительном тесте на редкую болезнь вероятность болезни может быть всего ~17%?
AТест неисправен
BЗдоровых очень много, и их редкие ложные срабатывания числом превышают честные срабатывания на больных
CБайес считает неправильно
DБолезнь на самом деле частая
3. Чему учит парадокс редкой болезни применительно к ML?
AТочность теста (P(тест|класс)) на несбалансированных данных обманчива
BНужно всегда доверять положительному результату
CРедкие классы предсказывать легко
DСимуляции не нужны
Поддержать проект