Как выявлять аномалии данных
Что проверяют
Умеете ли вы начать с вопроса «что в этой задаче считается аномалией», а не с названия алгоритма. Вопрос поведенческий, поэтому ждут ваш случай: какие данные, что нашли, что с этим сделали. Следом спрашивают, как вы проверяли качество детектора без разметки.
Как отвечать
Постройте ответ по цепочке «тип аномалии, метод, проверка, действие»:
- точечные выбросы: одно значение вне нормы. Правило трёх сигм работает только на распределении, близком к нормальному, и само портится от выбросов, ведь среднее и отклонение считаются по ним же. Устойчивее медиана с MAD (робастный z-score) или межквартильный размах с границами
Q1 - 1.5*IQRиQ3 + 1.5*IQR; - контекстные: значение нормальное вообще, но не для этого часа или дня недели. Сначала убирают тренд и сезонность (STL-декомпозиция, скользящие окна), выбросы ищут в остатках;
- многомерные: каждый признак в норме, а сочетание нет. Здесь
IsolationForest,LocalOutlierFactor, One-Class SVM или автоэнкодер с порогом по ошибке восстановления; - аномалии в пайплайне: пропуски, дубликаты, изменение схемы, падение объёма загрузки. Их ловят проверками в dbt-тестах или Great Expectations и мониторингом дрейфа (PSI, тест Колмогорова-Смирнова).
Без разметки качество проверяют так: топ самых подозрительных записей отдают на ручной разбор и считают precision@k.
Историю рассказывайте свою и с цифрами: объём данных, какая доля помечена, сколько подтвердилось при разборе, что изменилось после. Если промышленного опыта нет, честно опирайтесь на учебный проект или соревнование, но всё равно покажите путь от гипотезы до проверки.
Где спотыкаются
Сразу удаляют выбросы. Аномалия бывает самым ценным сигналом (мошенничество, баг в выгрузке), а удаление без разбора прячет проблему.
Применяют три сигмы к скошенным данным вроде сумм платежей или времени ответа. Длинный хвост даёт сотни ложных срабатываний, сначала нужен логарифм или робастные методы.
Не могут объяснить, как проверяли результат. Фраза «модель нашла 5% аномалий» пуста, если параметр contamination=0.05 в IsolationForest задали сами: он просто выставляет порог под эту долю.