Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测';异常行为';将机器学习与CouchDB和Python结合使用?_Python_Machine Learning_Couchdb_Bayesian_Cloudant - Fatal编程技术网

检测';异常行为';将机器学习与CouchDB和Python结合使用?

检测';异常行为';将机器学习与CouchDB和Python结合使用?,python,machine-learning,couchdb,bayesian,cloudant,Python,Machine Learning,Couchdb,Bayesian,Cloudant,当用户访问我的Python web服务时,我收集了很多非常有趣的数据点。例如,我有他们当前的城市、州、国家、用户代理等。我希望能够通过某种类型的机器学习系统/算法(可能是贝叶斯分类器?)运行这些系统/算法,最终目标是在发生异常时获得电子邮件通知(异常检测)。例如,Jane Doe只在Chrome上从美国登录过。因此,如果她突然在Firefox上从乌克兰登录到我的web服务,我希望看到这是一个非常“不寻常”的事件,并发出通知 我已经在使用CouchDB(特别是Cloudant),我经常在网上看到人

当用户访问我的Python web服务时,我收集了很多非常有趣的数据点。例如,我有他们当前的城市、州、国家、用户代理等。我希望能够通过某种类型的机器学习系统/算法(可能是贝叶斯分类器?)运行这些系统/算法,最终目标是在发生异常时获得电子邮件通知(异常检测)。例如,Jane Doe只在Chrome上从美国登录过。因此,如果她突然在Firefox上从乌克兰登录到我的web服务,我希望看到这是一个非常“不寻常”的事件,并发出通知

我已经在使用CouchDB(特别是Cloudant),我经常在网上看到人们说Cloudant/CouchDB非常适合这类东西(大数据分析)。然而,我完全不知道从哪里开始。关于web服务的外围事件的相对简单的跟踪,我还没有找到多少文档,更不用说使用CouchDB存储以前“学到的”数据了。我看到有几个专门的系统用于进行这种类型的数据处理(我想到了PredictionIO),但我忍不住觉得,考虑到CouchDB最初的性质,这些系统的功能有些过头了


如有任何见解,将不胜感激。谢谢

您正确地假设这是一个非常适合机器学习的问题,并且是我针对此类问题的首选库。不要担心细节问题(现在,让我们把你的问题放到可以解决的状态

如果我们可以假设给定用户的登录详细信息(时间、位置、用户代理等)变化较小,则任何较大的变化都会触发警报。这就是@Robert McGibbon建议的“异常值”检测发挥作用的地方

例如,将每个日志详细信息压缩到一个维度,并为每个用户创建一个日志详细信息向量(这对于改进日志详细信息摘要有很大的空间)

  • 登录时间(以24小时为单位)
  • 位置(可能是一个整数位置数组,每个整数代表不同的国家)
  • 用户代理(整数用户代理的类似数组)
等等。每次用户登录时,创建此详细信息数组并将其存储。一旦积累了大量测试数据,就可以尝试运行一些ML例程

因此,我们有一个用户和一组与成功登录相对应的登录数据(一个训练集)。我们现在可以训练a来识别这种用户登录模式:

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')
如果clf.predict(登录数据)<0:
火灾警报事件()
其他:
#登录与以前的尝试没有什么不同
打印('登录正常')
如果SVM发现新的数据点与它的训练集显著不同,那么它将触发警报

我的两便士。一旦你掌握了一个好的训练集,可能会有更多的ML技术更适合你的任务(它们可能更快、更准确等等),但是创建你的训练集,然后训练例程将是最重大的挑战


有很多令人兴奋的事情可以尝试!如果您知道您有错误的登录尝试,您可以通过使用更复杂的SVM将这些尝试添加到训练集中,您可以使用正确和错误的登录进行训练。您可以找到不同的欧几里德登录并使用它,而不是使用不同的“位置”值数组!这听起来很有趣,祝你好运

我还认为使用sklearn的svm.OneClassSVM的方法将产生一个好的异常值检测器。然而,我根据问题中的示例收集了一些有代表性的数据,它根本无法检测到异常值。我将nu和gamma参数从.01扫描到.99,发现没有令人满意的SVM预测值

我的理论是,因为样本有分类数据(城市、州、国家、网络浏览器),SVM算法不是正确的方法。(顺便说一句,我先用DictVectorizer.fit_转换方法将数据转换成二进制特征向量)

我相信@sullivanmatt建议使用贝叶斯分类器是正确的。贝叶斯分类器用于有监督学习,但至少在表面上,该问题被视为无监督学习问题,即我们不知道哪些观察值是正常的,哪些是异常值


因为您想要检测的异常值在网站访问流中非常罕见,我相信您可以通过将训练集中的每个观察标记为积极/正常观察来训练贝叶斯分类器。分类器应该预测真正正常的观测值具有更高的概率,因为大多数观测值确实是正常的。真正的异常值应突出显示为接收低预测概率。

如果您试图调查在此期间用户行为的异常,我建议您查看
时间序列异常检测器。通过这种方法,您将能够统计/自动找出新的、潜在可疑的、正在出现的模式和异常事件


解释一些基于机器学习的技术。在本例中,您可以使用一个非常强大的Python库,其中包含大量的ML算法。

您可以在这里查看示例:AFAIK,这个问题与现在精心设计的欺诈检测领域密切相关。您可以从一个伟大的ML欺诈检测方法调查开始,这是一个链接,指向一个好的登录风险入门,您可能希望规范化您的数据。skikit文档(以及文献推荐)。这可以通过sklearn.preprocessing模块轻松完成。