Обнаружение "необычного поведения" с помощью машинного обучения с помощью CouchDB и Python?


Я собираю много действительно интересных точек данных, когда пользователи приходят в мой веб-сервис Python. Например, у меня есть их текущий город, штат, страна, пользователь-агент и т. д. То, что я хотел бы иметь возможность сделать, это запустить их через какой-то тип системы машинного обучения / алгоритма (возможно, Байесовский классификатор?), с конечной целью получения уведомлений по электронной почте, когда происходит что-то необычное (обнаружение аномалий). Например, Джейн Доу когда-либо входила в систему только из США на Chrome. Поэтому, если она вдруг войдет в мой веб-сервис из Украины на Firefox, я хочу увидеть это как очень "необычное" событие и запустить уведомление.

Я уже использую CouchDB (в частности, с Cloudant), и я вижу, что люди часто говорят здесь и там в интернете, что Cloudant / CouchDB идеально подходит для такого рода вещей (анализ больших данных). Однако я совершенно не знаю, с чего начать. Я не нашел много в плане документации относительно простого отслеживания внешних объектов. события для веб-службы, не говоря уже о хранении ранее "изученных" данных с помощью CouchDB. Я вижу несколько специализированных систем для выполнения такого типа обработки данных (PredictionIO приходит на ум), но я не могу не чувствовать, что они излишни, учитывая природу CouchDB в первую очередь.

Любое озарение было бы очень ценно. Спасибо!

3 15

3 ответа:

Вы правы, предполагая, что эта проблема идеально подходит для машинного обучения, и scikit-learn.org - это моя предпочтительная библиотека для таких типов задач. Не беспокойтесь о деталях - (couchdb cloudant) а пока давайте приведем вашу проблему в состояние, в котором она может быть решена.

Если мы можем предположить, что изменения в деталях входа (время, местоположение, агент пользователя и т. д.) для данного пользователя являются низкими, то любое большое отклонение от этого вызовет ваше предупреждение. Вот где находится в игру вступает обнаружение "выброса", которое предложил @Robert McGibbon.

Например, сжать каждую деталь входа в систему в одно измерение и создать вектор деталей входа в систему для каждого пользователя (есть значительные возможности для улучшения этого дайджеста информации о входе в систему);

  • Время входа в систему (по модулю 24 часа)
  • местоположение (возможно, массив целочисленных местоположений, каждое целое число представляет другую страну)
  • user-agent (аналогичный массив целых чисел агенты-пользователи)

И так далее. Каждый раз, когда пользователь входит в систему, создайте этот массив данных и сохраните его. После того, как вы накопили большой набор тестовых данных, вы можете попробовать запустить некоторые процедуры ML.

Итак, у нас есть пользователь и набор данных для входа, соответствующий успешным входам (обучающий набор). Теперь мы можем обучить машину опорных векторов распознавать этот шаблон входа пользователей:

from sklearn import svm

# training data [[11.0, 2, 2], [11.3, 2, 2] ... etc]
train_data = my_training_data()

# create and fit the model
clf = svm.OneClassSVM()
clf.fit(train_data)

А затем, каждый раз, когда происходит новый вход в систему, создайте один вход в систему подробно массив и передать это мимо SVM

if clf.predict(log_in_data) < 0:
    fire_alert_event()
else:
    # log-in is not dissimilar to previous attempts
    print('log in ok')

Если SVM обнаружит, что новая точка данных существенно отличается от ее тренировочного набора, то он запустит сигнал тревоги.

Мои Два Пенса. После того, как вы получили хороший набор тренировок, есть еще много методов ML, которые могут лучше подходить для вашей задачи (они могут быть быстрее, точнее и т. д.), Но создание ваших тренировочных наборов, а затем обучение подпрограммам будет самой значительной проблемой.

Есть много захватывающих есть что попробовать! Если вы знаете, что у вас есть неудачные попытки входа в систему, вы можете добавить их в учебные наборы, используя более сложную SVM, которую вы тренируете с хорошими и плохими входами. Вместо того чтобы использовать массив разрозненных значений "location", вы можете найти евклидовы различные логины и использовать их! Это звучит как большое развлечение, удачи!

Я также думал о подходе с использованием svm.OneClassSVM от sklearn собирался произвести хороший детектор выбросов. Однако я собрал некоторые репрезентативные данные, основанные на примере в вопросе, и он просто не смог обнаружить выброс. Я вычеркнул параметры ну и гамма .01 до .99 и не нашел удовлетворительного предсказателя SVM.

Моя теория заключается в том, что поскольку выборки содержат категориальные данные (города, штаты, страны, веб-браузеры), алгоритм SVM не является правильным подход. (Кстати, я сначала преобразовал данные в двоичные векторы признаков с помощью Диктвекторизатора.метод fit_transform).

Я считаю, что @sullivanmatt находится на правильном пути, когда он предлагает использовать Байесовский классификатор. Байесовские классификаторы используются для контролируемого обучения, но, по крайней мере на поверхности, эта проблема была брошена как проблема неконтролируемого обучения, т. е. мы не знаем априори, какие наблюдения являются нормальными, а какие-выбросами.

Потому что выброшенные вами если вы хотите обнаружить очень редкие случаи в потоке посещений веб-сайтов, я полагаю, что вы можете обучить Байесовский классификатор, обозначив каждое наблюдение в вашем учебном наборе как положительное/нормальное наблюдение. Классификатор должен предсказывать, что истинные нормальные наблюдения имеют более высокую вероятность просто потому, что большинство наблюдений действительно нормальны. Истинный выброс должен выделяться как получение низкой предсказанной вероятности.

Если вы пытаетесь исследовать аномалии поведения пользователей в течение этого времени, я бы рекомендовал вам посмотреть на time-series anomaly detectors. С помощью этого подхода вы сможете статистически / автоматически вычислять новые, потенциально подозрительные, возникающие паттерны и аномальные события.

Http://www.autonlab.org/tutorials/biosurv.html и http://web.engr.oregonstate.edu/~wong/workshops/icml2006/slides/agarwal.ppt объясните некоторые приемы, основанные на машинном обучении. В этом случае вы можете использовать scikit-learn.org , очень мощная библиотека Python, которая содержит тонны ML Algo.