Что такое ложное срабатывание — и почему фильтр с точностью 99% ошибается в половине случаев

Давай посчитаем вместе, потому что цифра тут удивляет почти всех.
У тебя в приложении 10 000 сообщений в день. Спама среди них — 1%, то есть сотня. Ты прикрутил фильтр с точностью 99%: он ловит 99 спам-сообщений из 100 и ошибается всего на 1% нормальных.
Считаем флаги. Спам пойман: 99. Нормальных сообщений 9 900, ошибка на 1% — это 99 штук.
Итого 198 флагов, и ровно половина из них — невиновные. Фильтр с точностью 99% обвиняет живого человека так же часто, как ловит спамера.
Ничего не сломалось. Так работает математика.
Что такое ложное срабатывание
Ложное срабатывание (false positive) — это когда система сказала «да», а правильный ответ был «нет». Фильтр пометил нормальное письмо как спам. Антифрод заблокировал честную покупку. Детектор ИИ-текста обвинил человека, который писал сам.
У ошибки есть зеркальный близнец: ложный пропуск (false negative) — система сказала «нет», а надо было «да». Спам проехал в почту. Мошенник прошёл. Оскорбление осталось в комментариях.
Любая система, которая ставит метки, ошибается обоими способами. Вопрос не «ошибается ли она», а «в какую сторону ты предпочитаешь ошибаться».
Почему «точность 99%» ничего не значит
Вернись к нашему счёту. Проблема была не в фильтре, а в том, насколько редкое событие ты ловишь.
Чем реже событие, тем больше в потоке «нормальных» — и тем больше абсолютное число ошибок на них. Уменьшим долю спама с 1% до 0,1%:
- спама теперь 10, фильтр ловит 10;
- нормальных 9 990, ошибка 1% — это примерно 100 ложных флагов;
- из 110 флагов ошибочных больше девяти из десяти.
Тот же самый фильтр. Та же самая «точность 99%». Просто событие стало реже.
Отсюда практический вывод: никогда не оценивай фильтр по одной цифре точности. Спрашивай: из тех, кого он пометил, сколько на самом деле виноваты? Эту долю называют precision. А долю пойманных из всех настоящих нарушителей — recall.
Две ошибки стоят по-разному
Это самое важное, и это уже не математика, а твоё решение.
- Спам-фильтр. Пропустить одно рекламное письмо — неприятно. Отправить в спам письмо от работодателя — катастрофа. Здесь дороже ложное срабатывание.
- Модерация детского приложения. Зря скрыть безобидный комментарий — мелочь. Пропустить травлю — беда. Здесь дороже ложный пропуск.
- Антифрод в платежах. Обе ошибки стоят денег: пропущенное мошенничество — прямой убыток, заблокированная честная оплата — потерянный клиент навсегда.
Пока ты не ответил, какая из двух ошибок для твоего продукта дороже, ты не можешь настроить фильтр. Не потому что не хватает данных, а потому что это вопрос не к данным.
Порог — это ручка, а не истина
Почти любой классификатор выдаёт не «да/нет», а число: 0,03 · 0,44 · 0,91. Дальше ты сам решаешь, с какого значения считать это флагом. Это и есть порог.
Порог работает как качели:
- опустил порог (флажим с 0,3) — ловим больше нарушителей, но и невиновных цепляем больше;
- поднял порог (флажим с 0,9) — почти не трогаем невиновных, но половина нарушителей проезжает.
Волшебного значения нет. Есть только обмен одной ошибки на другую. Полезно помнить, что сама цифра — это уверенность модели, а не вероятность правды: 0,9 не означает «в 90% случаев это правда».
Практичный приём вместо одного порога — три исхода:
- ниже 0,3 — пропускаем молча;
- от 0,3 до 0,8 — пропускаем, но кладём в очередь на просмотр;
- выше 0,8 — блокируем сразу.
Так дорогие ошибки остаются редкими, а спорные случаи не превращаются в приговор автоматом.
Где ты столкнёшься с этим в своём приложении
Практически везде, где есть слово «проверка»:
- модерация комментариев и загруженных картинок;
- поиск дублей и «похожих» записей;
- капча и защита формы от ботов;
- автоматические отписки, баны, лимиты;
- любые проверки вокруг модели — на входе и на выходе.
Простое правило на старте: сначала посчитай, насколько редкое у тебя событие. Если нарушителей меньше процента, готовься к тому, что большинство флагов будут ложными — и заранее придумай, куда они поедут, кроме бана.
Что важнее — precision или recall?
Зависит от того, кто платит за ошибку. Если за ошибку платит пользователь (его зря заблокировали) — важнее precision. Если платишь ты или пострадавший (пропустили угрозу, мошенничество) — важнее recall. Обе цифры сразу поднять нельзя, поэтому решение всегда продуктовое, а не техническое.
Как выбрать порог, если у меня нет данных?
Размечать руками. Возьми 100–200 реальных примеров из своего приложения, проставь метки сам, прогони через фильтр и посмотри, что попадает во флаги на разных порогах. Сотня честно размеченных примеров даёт больше, чем любые чужие бенчмарки — это и есть простейшая оценка качества. И повторяй замер после каждой правки промпта или смены модели.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





