Каковы хорошие алгоритмы для обнаружения аномалий?
Фон
Вот проблема:
- Черный ящик выводит новый номер каждый день.
- Эти числа были записаны в течение определенного периода времени.
- Определите, когда новое число из черного ящика выходит за рамки чисел, установленных за определенный период времени.
Числа являются целыми числами, а период времени - год.
Вопрос
Какой алгоритм будет идентифицировать образец в числах?
Шаблон может быть простым, как всегда по возрастанию или всегда по убыванию, или числа могут попадать в узкий диапазон и так далее.
идеи
У меня есть некоторые идеи, но я не уверен относительно лучшего подхода или того, какие решения уже существуют:
- Алгоритмы машинного обучения?
- Нейронная сеть?
- Классифицировать нормальные и ненормальные числа?
- Статистический анализ?
3 ответа
Сгруппируйте ваши данные.
Если вы не знаете, сколько режимов будут иметь ваши данные, используйте что-то вроде модели гауссовой смеси (GMM) вместе с функцией оценки (например, Байесовский информационный критерий (BIC)), чтобы вы могли автоматически определять вероятное число кластеров в ваши данные. Я рекомендую это вместо k-средних, если вы не знаете, какое значение k
скорее всего, будет. После того, как вы создали GMM для ваших данных за прошедший год, с учетом нового назначения данных x
, вы можете рассчитать вероятность того, что он был сгенерирован любым из кластеров (смоделировано гауссианом в GMM). Если ваша новая точка данных имеет низкую вероятность того, что она будет сгенерирована каким-либо из ваших кластеров, вполне вероятно, что это настоящий выброс.
Если это кажется слишком сложным, вы будете рады узнать, что вся процедура GMM + BIC для автоматической идентификации кластера была реализована для вас в отличном пакете MCLUST для R. Я использовал это несколько раз для большого успеха для таких проблем.
Мало того, что это позволит вам идентифицировать выбросы, у вас будет возможность поставить р-значение в точку, являющуюся выбросом, если вам понадобится эта возможность (или вы захотите ее) в какой-то момент.
Во всех тех техниках, о которых ты упоминаешь, мало магии. Я считаю, что вы должны сначала попытаться сузить типичные отклонения, с которыми вы можете столкнуться, это помогает упростить ситуацию.
Затем вы можете рассчитать производные величины, относящиеся к этим функциям. Например: "Я хочу обнаружить, что числа резко меняют направление" => вычислить u_{n+1} - u_n и ожидать, что он будет иметь постоянный знак или попадать в некоторый диапазон. Возможно, вы захотите сохранить эту гибкость и позволить своему дизайну кода быть расширяемым (шаблон стратегии, возможно, стоит посмотреть, если вы сделаете ООП)
Затем, когда у вас есть интересующие вас производные величины, вы выполняете их статистический анализ. Например, для производной величины A вы предполагаете, что она должна иметь некоторое распределение P(a, b) (равномерное ([a, b]) или Beta(a, b), возможно, более сложное), вы ставите априорные законы на а, б и вы настраиваете их на основе последовательной информации. Затем последующая вероятность информации, предоставленной последним добавленным пунктом, должна дать вам некоторое представление о том, нормально это или нет. Относительная энтропия между задним и предшествующим законом на каждом шаге - это тоже хорошая вещь для мониторинга. Обратитесь к книге о байесовских методах для получения дополнительной информации.
Я не вижу смысла в сложных традиционных материалах машинного обучения (слои персептрона или SVM, чтобы цитировать только их), если вы хотите обнаруживать выбросы. Эти методы прекрасно работают при классификации данных, которые, как известно, достаточно чисты.
Вы можете попробовать линейное предсказание, используя линейную регрессию, и посмотреть, как это будет, это будет довольно легко реализовать на вашем языке. После того, как вы ввели линию в свои данные, вы можете рассчитать среднее стандартное отклонение вдоль линии. Если новая точка находится на линии тренда +- стандартное отклонение, это не должно рассматриваться как отклонение от нормы.
PCA - это еще один метод, который приходит на ум при работе с данными такого типа.
Вы также можете обратиться к обучению без присмотра. Это метод машинного обучения, который можно использовать для обнаружения различий в больших наборах данных.
Звучит как забавная проблема! Удачи