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

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

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

любое понимание будет высоко ценится. Спасибо!

3 ответов


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

если мы можем предположить, что изменения в деталях входа в систему (время, местоположение, user-agent и т. д.) для данного пользователя низкие, то любое большое отклонение от этого вызовет ваше предупреждение. Этот где в игру вступает обнаружение "выброса", которое предложил @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, который вы тренируете с хорошими и плохими входами. Вместо того, чтобы использовать массив разрозненных значений "местоположения", вы можете найти евклидовы разные логины и использовать их! Это звучит как большое удовольствие, удачи!


Я также думал, что подход с использованием svm.OneClassSVM от sklearn собирался произвести хорошее детектором выбросов. Однако я собрал некоторые репрезентативные данные на основе примера в вопросе, и он просто не мог обнаружить выброс. Я проверил параметры ну и гамма .01 to .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 algos.