Мы ищем оптимальный порог (
p) для отсеивания результатов работы нейронной сети. Сеть обучена на единственном классе. На вход сеть получает некоторый объект, а на выходе сообщает, принадлежит объект нашему классу или нет. Для нас важно
минимизировать количество ложных срабатываний. В процессе родилось такое решение.
- пробегаем значения порога p в цикле, от 0 до 100% (для простоты примера, с шагом 10%);
- для каждого значения вычисляем количество правильных срабатываний (true-positive, TP) и ложно-положительных (false-positive, FP);
- для TP и FP вычисляем доверительный интервал (DOWN - UP);
- выбираем тот порог, у которого нижняя граница (DOWN) наибольшая.
Интуитивно, смысл таков.
Доверительный интервал отражает вероятность того, что ответ нейронной сети не будет ложным срабатыванием.
Для перестраховки берем нижнее значение интервала.
В итоге, выбираем тот порог, у которого процент ложного срабатывания наименьший.
Вот "живые" числа. Мы остановились на интервале Уилсона с уровнем доверия 95%:
Код:
| p, % | TP | FP | DOWN, % | UP, % |
|------|-----|-----|------|------|
| 0 | 361 | 576 | 35 | 42 |
| 10 | 269 | 225 | 50 | 59 |
| 20 | 225 | 142 | 56 | 66 |
| 30 | 180 | 88 | 61 | 73 |
| 40 | 140 | 60 | 63 | 76 |
| 50 | 111 | 40 | 66 | 80 |
| 60 | 81 | 26 | 66 | 83 |
| 70 | 59 | 13 | 71 | 90 |
| 80 | 31 | 3 | 75 | 98 |
| 90 | 8 | 0 | 60 | 99 |
| 100 | 0 | 0 | 0 | 100 |
Основываясь на данных таблицы, выбираем порог 80%.
При этом, мы понимаем, что уменьшаем общую частоту срабатывания нейронной сети. Но, повторюсь, для нас важна минимизация "фальстартов".
Насколько такой подход корректен?