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

Posted

技术标签:

【中文标题】使用带有 CouchDB 和 Python 的机器学习来检测“异常行为”?【英文标题】:Detecting 'unusual behavior' using machine learning with CouchDB and Python? 【发布时间】:2013-11-10 23:36:40 【问题描述】:

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

我已经在使用 CouchDB(特别是与 Cloudant 一起使用),而且我看到人们经常在网上到处说 Cloudant / CouchDB 非常适合这类事情(大数据分析)。但是,我完全不知道从哪里开始。我没有找到太多关于相对简单的 Web 服务外部事件跟踪的文档,更不用说使用 CouchDB 存储以前“学习”的数据了。我看到了几个专门的系统来处理这种类型的数据(我想到了 PredictionIO),但我不禁觉得首先考虑到 CouchDB 的性质,它们有点矫枉过正。

任何见解将不胜感激。谢谢!

【问题讨论】:

你可以看看这里的例子:scikit-learn.org/stable/modules/outlier_detection.html AFAIK,问题与现在精心设计的欺诈检测领域密切相关。您可以从出色的 ML 欺诈检测方法调查开始arxiv.org/ftp/arxiv/papers/1009/1009.6119.pdf 【参考方案1】:

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

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

例如,将每个登录详细信息压缩到一个维度,并为每个用户创建一个登录详细信息向量(此登录信息摘要还有很大改进空间);

登录时间(模 24 小时) 位置(可能是整数位置数组,每个整数代表不同的国家/地区) 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 发现新数据点与其训练集显着不同,那么它将发出警报。

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

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

【讨论】:

这是一个很好的登录风险入门链接deloitte.wsj.com/cio/2013/10/30/… 您可能想要规范化您的数据。该skikit doc(和文献推荐它)。这可以通过 sklearn.preprocessing 模块轻松完成。【参考方案2】:

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

我的理论是,因为样本具有分类数据(城市、州、国家、网络浏览器),所以 SVM 算法不是正确的方法。 (顺便说一句,我做到了,首先使用 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 算法。

【讨论】:

以上是关于使用带有 CouchDB 和 Python 的机器学习来检测“异常行为”?的主要内容,如果未能解决你的问题,请参考以下文章

获取带有外部参数的 couchDB 文档

CouchDB-Python:如何使用“_show”和“_list”函数?

如何按字段对文档进行分组并使用带有 CouchDB 视图的自定义 reduce 函数列出不相等的值

使用python设置dockerized Couchdb

关于带有 couchDB 视图的“无效 JSON”的错误,但 json 很好

如何使用 Python 在 Couchdb 中显示所有文档