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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

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", вы можете найти евклидовы разные логины и использовать их! Это звучит очень весело, удачи!

Ответ 2

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

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

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

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

Ответ 3

Если вы пытаетесь исследовать аномалии поведения пользователей в течение времени, я бы рекомендовал вам посмотреть 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.