Теорема Байеса и наивный Байес
Теорема Байеса — правило пересчёта вероятностей при появлении улик: prior, likelihood и posterior на примере медицинского теста. Наивный Байес (Naive Bayes) — классификатор на её основе: спам-фильтр, сглаживание Лапласа и классика собеседований про генеративные и дискриминативные модели.
Интуиция: задача, на которой ошибаются даже врачи
Болезнь встречается у 1% населения. Тест находит её у 95% больных и ложно срабатывает у 5% здоровых. Ваш тест положительный. Какова вероятность, что вы действительно больны?
Интуиция кричит «около 95%» — так отвечает большинство, включая врачей в реальных исследованиях. Правильный ответ — примерно 16%. Проверим на 10 000 человек:
- больны 100 человек (1%), тест увидит 95 из них;
- здоровы 9 900, у 5% из них тест ложно сработает — это 495 человек;
- всего положительных тестов 95 + 495 = 590, и лишь 95 из них — настоящие больные: 95 / 590 ≈ 16%.
Эта ошибка интуиции называется игнорированием базовой частоты (base rate neglect): мы смотрим на точность теста и забываем, насколько редка сама болезнь. Здоровых так много, что даже редкие ложные срабатывания дают целую гору ложных тревог, в которой тонут настоящие больные.
Как это работает: формула
Теорема Байеса (Bayes' theorem) формализует этот пересчёт:
Словами, на нашем примере:
- Приор (prior) P(A) — вера до улик: болезнь встречается у 1%.
- Правдоподобие (likelihood) P(B | A) — насколько улика ожидаема при гипотезе: вероятность положительного теста у больного, 95%.
- Апостериорная вероятность (posterior) P(A | B) — обновлённая вера после улик: вероятность болезни при положительном тесте.
- Свидетельство (evidence) P(B) — полная вероятность улики по всем гипотезам; это просто нормировка, и при сравнении классов её можно не считать: она одинакова для всех.
Наивный Байес: спам-фильтр в три строчки
Теперь сделаем из теоремы классификатор. Гипотезы — классы («спам» / «не спам»), улики — слова письма:
Здесь спрятано «наивное» предположение: слова условно независимы при данном классе — вероятность встретить «бесплатно» не зависит от того, было ли рядом «выигрыш». Это очевидно неверно (слова в языке сильно скоррелированы), но модель всё равно отлично работает: для верного вердикта достаточно, чтобы правильный класс просто набрал больше очков, а точная калибровка вероятностей не нужна.
Две инженерные детали, о которых спрашивают:
- Лог-пространство. Произведение сотен чисел вида 0.001 быстро уходит в машинный ноль (underflow). Поэтому считают сумму логарифмов: log P(спам) + Σ log P(wi | спам) — произведение превращается в сумму, и переполнения нет.
- Сглаживание Лапласа (Laplace smoothing). Если слово ни разу не встречалось в спаме обучающей выборки, то P(w | спам) = 0 — и один ноль убивает всё произведение, каким бы «спамным» ни было остальное письмо. Лечение: добавить каждому слову виртуальный счётчик +1: P(w | спам) = (count(w) + 1) / (N + V), где V — размер словаря.
Когда наивный Байес хорош — и кто его главный конкурент
Сильные стороны: обучение — это просто подсчёт частот за один проход по данным, поэтому NB молниеносен, работает при малом числе примеров и почти не переобучается. Классические ниши — тексты (спам, тональность, рубрикация), высокая размерность «мешка слов» и роль быстрого бейзлайна: прежде чем городить трансформер, полезно узнать, сколько выжимает NB. Проигрывает он там, где взаимодействия признаков важны: скоррелированные фичи он «считает» по несколько раз, а его вероятности плохо откалиброваны.
Классическое сравнение — с логистической регрессией. Наивный Байес — генеративная (generative) модель: он моделирует совместное распределение P(x, y) = P(x | y) · P(y), то есть «как выглядят данные каждого класса», и выводит ответ через Байеса. Логистическая регрессия — дискриминативная (discriminative): она сразу учит P(y | x), границу между классами, не тратя силы на моделирование самих данных. При малых данных генеративный NB часто выигрывает (его приоры-допущения помогают), при больших — дискриминативная модель обгоняет, потому что не опирается на неверное предположение независимости.
- «Болезнь у 1%, тест точен на 95%, тест положительный — вероятность болезни?» — решай по шагам на 10 000 человек: 95 истинных срабатываний против 495 ложных → 95/590 ≈ 16%. Назови эффект: base rate neglect.
- «Чем генеративная модель отличается от дискриминативной?» — генеративная учит P(x|y)·P(y) и выводит ответ через Байеса (NB), дискриминативная сразу учит P(y|x) (логрег).
- «Зачем сглаживание Лапласа?» — без него слово, не встречавшееся в классе, даёт нулевую вероятность и зануляет всё произведение.
- «Почему считают в логарифмах?» — произведение сотен малых вероятностей уходит в underflow; сумма логарифмов численно стабильна.