15

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

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

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

4

3 回答 3

22

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

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

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

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

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

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

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。您可以找到欧几里得不同的登录名并使用它,而不是使用一组不同的“位置”值!这听起来很有趣,祝你好运!

于 2013-11-04T11:17:40.453 回答
1

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

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

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

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

于 2013-11-04T20:31:54.237 回答
1

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

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

于 2013-11-06T20:48:21.767 回答