当用户访问我的Python网络服务时,我收集了很多非常有趣的数据点。例如,我有他们的当前城市、州、国家、用户代理等。我希望能够将这些数据输入到某种类型的机器学习系统/算法中(可能是贝叶斯分类器?),最终目标是在发生异常情况时通过电子邮件接收通知(异常检测)。例如,Jane Doe 一直只从美国使用Chrome登录。如果她突然从乌克兰使用Firefox登录我的网络服务,我希望将其视为高度“异常”的事件,并触发通知。
我已经在使用CouchDB(具体是Cloudant),我经常在网上看到人们说Cloudant/CouchDB非常适合这种类型的大数据分析。然而,我完全不知道从哪里开始。我没有找到太多关于相对简单的跟踪网络服务异常事件的文档,更不用说使用CouchDB存储之前“学习”的数据了。我看到了几种专门用于进行这种类型数据处理的系统(我想到了PredictionIO),但考虑到CouchDB的本质,我不禁觉得它们有些过头了。
任何见解都将不胜感激。谢谢!
回答:
你假设这是一个非常适合机器学习的问题是正确的,我偏爱scikit-learn.org来解决这类问题。暂时不要担心具体细节 – (couchdb
cloudant
),让我们先把你的问题调整到可以解决的状态。
如果我们可以假设对于给定用户的登录细节(时间、位置、用户代理等)的变化很小,那么任何大的变化都会触发你的警报。这就是@Robert McGibbon 建议的“异常值”检测发挥作用的地方。
例如,将每个登录细节压缩到一个维度,然后为每个用户创建一个登录细节向量(有很大的改进空间来消化这些登录信息);
- 登录时间(模24小时)
- 位置(可能是一个整数位置数组,每个整数代表不同的国家)
- 用户代理(类似的整数用户代理数组)
依此类推。每次用户登录时,创建这个细节数组并存储它。一旦你积累了一大组测试数据,你可以尝试运行一些机器学习程序。
所以,我们有一个用户和一组对应成功登录的登录数据(一个训练集)。我们现在可以训练一个支持向量机来识别这个用户的登录模式:
from sklearn import svm# 训练数据 [[11.0, 2, 2], [11.3, 2, 2] ... 等]train_data = my_training_data()# 创建并拟合模型clf = svm.OneClassSVM()clf.fit(train_data)
然后,每次发生新的登录事件时,创建一个单一的登录细节数组并将其传递给SVM
if clf.predict(log_in_data) < 0: fire_alert_event()else: # 登录与之前的尝试不相似 print('log in ok')
如果SVM发现新数据点与其训练集显著不同,它将触发警报。
我的两分钱。一旦你掌握了一个好的训练集,还有许多其他机器学习技术可能更适合你的任务(它们可能更快、更准确等),但创建你的训练集并训练这些程序将是最大的挑战。
有很多令人兴奋的事情可以尝试!如果你知道有不良的登录尝试,你可以将这些添加到训练集中,通过使用更复杂的SVM来训练良好和不良的登录。不要使用一组不同的“位置”值的数组,你可以找到欧几里得不同的登录并使用它!这听起来很有趣,祝你好运!