Détecter un "comportement inhabituel" en utilisant l'apprentissage automatique avec CouchDB et Python?

je collectionne beaucoup de points de données vraiment intéressants alors que les utilisateurs viennent à mon service Web Python. Par exemple, j'ai leur ville, état, pays, user-agent, etc. Ce que j'aimerais pouvoir faire, c'est les exécuter à l'aide d'un type de système / algorithme d'apprentissage automatique (peut-être un classificateur bayésien?), avec l'objectif éventuel de recevoir des notifications par e-mail lorsque quelque chose d'inhabituel se produit (Détection d'anomalies). Par exemple, Jane Doe ne s'est connectée qu'à partir de USA sur Chrome. Donc, si elle se connecte soudainement à mon service web depuis L'Ukraine sur Firefox, je veux voir cela comme un événement très "inhabituel" et lancer une notification.

J'utilise déjà CouchDB (spécifiquement avec Cloudant), et je vois souvent des gens dire ici et là en ligne que Cloudant / CouchDB est parfait pour ce genre de chose (analyse de big data). Cependant, je suis à une perte complète pour où commencer. Je n'ai pas trouvé beaucoup en termes de documentation concernant le suivi relativement simple de les événements périphériques pour un service web, et encore moins le stockage de données "apprises" en utilisant CouchDB. Je vois plusieurs systèmes dédiés pour faire ce type de crunching de données (PredictionIO vient à l'esprit), mais je ne peux pas m'empêcher de penser qu'ils sont surmenés étant donné la nature de CouchDB en premier lieu.

toute suggestion serait très appréciée. Merci!

15
demandé sur sullivanmatt 2013-10-31 08:30:06

3 réponses

Vous avez raison de supposer que c'est un problème idéalement adapté à l'Apprentissage de la Machine, et scikit-learn.org est mon préféré de la bibliothèque pour ces types de problèmes. Ne vous inquiétez pas pour les détails - (couchdb cloudant) pour l'instant, permet d'obtenir votre problème dans un état où il peut être résolu.

si nous pouvons supposer que les variations dans les détails de connexion (heure, lieu, utilisateur-agent, etc.) pour un utilisateur donné sont faibles, puis toute grande variation de cette déclencherait votre alerte. Ce c'est là que la détection de l '"aberration" que @Robert McGibbon suggère entre en jeu.

Par exemple, presser chaque journal en détail dans une dimension, et la création d'un journal-dans le détail vecteur pour chaque utilisateur (il y a beaucoup de place pour améliorer le recueil des données de connexion);

  • journal-dans le temps (modulo 24 heures)
  • emplacement (peut-être un tableau d'entiers à des endroits, chaque entier représentant un pays différent)
  • user-agent (similaire tableau d'entiers à les user-agents)

et ainsi de suite. Chaque fois qu'un utilisateur se connecte, créez ce tableau de détails et stockez-le. Une fois que vous avez accumulé un grand ensemble de données de test, vous pouvez essayer d'exécuter quelques routines ML.

ainsi, nous avons un utilisateur et un ensemble de données d'ouverture de session correspondant à des ouvertures de session réussies (un ensemble de formation). Nous pouvons maintenant former un Machine À Vecteurs De Support pour reconnaître les utilisateurs se connectent-dans le modèle:

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)

et puis, à chaque fois un nouveau log-in même se produit, créer un seul tableau de détails log-in et passer que passé le SVM

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

si le SVM constate que le nouveau point de données est très différent de son ensemble d'entraînement, il déclenche l'alarme.