Что такое…

Что такое ложное срабатывание — и почему фильтр с точностью 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% случаев это правда».

Практичный приём вместо одного порога — три исхода:

  1. ниже 0,3 — пропускаем молча;
  2. от 0,3 до 0,8 — пропускаем, но кладём в очередь на просмотр;
  3. выше 0,8 — блокируем сразу.

Так дорогие ошибки остаются редкими, а спорные случаи не превращаются в приговор автоматом.

Где ты столкнёшься с этим в своём приложении

Практически везде, где есть слово «проверка»:

  • модерация комментариев и загруженных картинок;
  • поиск дублей и «похожих» записей;
  • капча и защита формы от ботов;
  • автоматические отписки, баны, лимиты;
  • любые проверки вокруг модели — на входе и на выходе.

Простое правило на старте: сначала посчитай, насколько редкое у тебя событие. Если нарушителей меньше процента, готовься к тому, что большинство флагов будут ложными — и заранее придумай, куда они поедут, кроме бана.

Что важнее — precision или recall?

Зависит от того, кто платит за ошибку. Если за ошибку платит пользователь (его зря заблокировали) — важнее precision. Если платишь ты или пострадавший (пропустили угрозу, мошенничество) — важнее recall. Обе цифры сразу поднять нельзя, поэтому решение всегда продуктовое, а не техническое.

Как выбрать порог, если у меня нет данных?

Размечать руками. Возьми 100–200 реальных примеров из своего приложения, проставь метки сам, прогони через фильтр и посмотри, что попадает во флаги на разных порогах. Сотня честно размеченных примеров даёт больше, чем любые чужие бенчмарки — это и есть простейшая оценка качества. И повторяй замер после каждой правки промпта или смены модели.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →