用CouchDB和Python使用机器学习来检测“异常行为”?

2024-04-27 18:35:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我已经在使用CouchDB(特别是与Cloudant一起使用),而且我经常看到人们在网上说Cloudant/CouchDB非常适合这类事情(大数据分析)。但是我完全不知道从哪里开始。在文档方面,我没有发现太多关于web服务的外围事件的相对简单的跟踪,更不用说使用CouchDB存储以前“学到的”数据了。我看到有几个专门的系统可以进行这种类型的数据处理(我想到的是PredictionIO),但是我忍不住觉得,考虑到CouchDB的特性,这些系统已经被过度破坏了。

任何洞察都将不胜感激。谢谢!


Tags: 数据用户算法机器web类型代理分类器
3条回答

我还认为使用sklearn中的svm.OneClassSVM的方法将产生一个好的异常值检测器。然而,我根据问题中的示例整理了一些有代表性的数据,它根本无法检测出异常值。我将nu和gamma参数从0.01扫到0.99,发现没有令人满意的支持向量机预测。

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

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

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

如果你想调查这段时间内用户行为的异常,我建议你看看time-series anomaly detectors。通过这种方法,你将能够统计/自动地找出新的、可能可疑的、新出现的模式和异常事件。

http://www.autonlab.org/tutorials/biosurv.htmlhttp://web.engr.oregonstate.edu/~wong/workshops/icml2006/slides/agarwal.ppt 解释一些基于机器学习的技术。在本例中,您可以使用scikit-learn.org,这是一个非常强大的Python库,它包含大量的ML算法。

假设这是一个非常适合机器学习的问题,并且scikit-learn.org是我处理这类问题的首选库,这是正确的。现在不要担心细节-(couchdbcloudant)让你的问题进入一个可以解决的状态。

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

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

  • 登录时间(模块24小时)
  • 位置(可能是一个整数位置数组,每个整数代表一个不同的国家)
  • 用户代理(类似的整数用户代理数组)

等等。每次用户登录时,创建此详细信息数组并将其存储。一旦积累了大量的测试数据,就可以尝试运行一些ML例程。

因此,我们有一个用户和一组对应于成功登录的登录数据(一个训练集)。我们现在可以训练a 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)

然后,每次新的登录发生时,创建一个详细的日志数组并将其传递给支持向量机

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技术可能更适合你的任务(它们可能更快,更准确等),但创建你的训练集,然后训练套路将是最重要的挑战。

有很多令人兴奋的事情要尝试!如果你知道你有错误的登录尝试,你可以通过使用一个更复杂的支持向量机将这些添加到训练集,你可以使用好的和坏的登录进行训练。你可以找到欧几里德的不同登录名,而不是使用一系列不同的“位置”值!听起来很有趣,祝你好运!

相关问题 更多 >