我目前正在为文本文章设计一个推荐系统(一个有趣的二进制案例'或者不感兴趣的')。我的一个规格是它应该不断更新以适应不断变化的趋势。
据我所知,最好的方法是使用支持incremental / online learning的机器学习算法。
Perceptron和Winnow等算法支持在线学习,但我不完全确定支持向量机。 scikit-learn python库是否支持在线学习,如果是,支持向量机是否可以使用它的算法之一?
我显然没有完全依赖于使用支持向量机,但由于它们的全面性能,它们通常是用于二进制分类的算法。我愿意改变最终最适合的东西。
答案 0 :(得分:29)
虽然SVM的在线算法确实存在,但是指定是否需要内核或线性SVM变得很重要,因为已经针对线性SVM的特殊情况开发了许多有效的算法。
对于线性情况,如果使用带有铰链损失和L2正则化的SGD classifier in scikit-learn,您将获得可在线/递增更新的SVM。您可以将其与feature transforms that approximate a kernel结合使用,以获得类似于在线内核SVM的功能。
我的一个规格是它应该不断更新趋势。
这被称为概念漂移,并且通过简单的在线SVM无法很好地处理。使用PassiveAggresive分类器可能会给你更好的结果,因为它的学习率不会随着时间的推移而降低。
假设您在训练/跑步时获得反馈,您可以尝试检测精确度随时间的降低,并在准确度开始降低时开始训练新模型(当您认为准确度变得更准确时切换到新模型)。 JSAT有两种漂移检测方法(参见jsat.driftdetectors),可用于跟踪准确性并在变化时提醒您。
它还有更多在线线性和内核方法。
(偏见注释:我是JSAT的作者)。
答案 1 :(得分:19)
也许这让我很天真,但我认为值得一提的是当你逐步呈现数据时如何实际更新sci-kit SGD classifier:
clf = linear_model.SGDClassifier()
x1 = some_new_data
y1 = the_labels
clf.partial_fit(x1,y1)
x2 = some_newer_data
y2 = the_labels
clf.partial_fit(x2,y2)
答案 2 :(得分:7)
简短的回答是否。 Sklearn实施(以及大多数现有的其他)不支持在线SVM培训。可以以增量方式训练SVM,但这不是那么简单的任务。
如果你想限制自己的线性情况,那么答案是是,因为sklearn为你提供了随机梯度下降(SGD),它可以选择最小化SVM标准。
您也可以尝试使用pegasos库,它支持在线SVM培训。
趋势适应问题目前在ML社区非常流行。正如@Raff所说,它被称为概念漂移,并且有许多方法,这些方法通常是各种元模型,分析“趋势如何表现”并改变基础ML模型(例如强迫它重新训练数据的子集)。所以你在这里有两个独立的问题:
答案 3 :(得分:2)
如果对概念漂移的在线学习感兴趣,那么这里有一些以前的工作
在概念漂移下学习:概述 https://arxiv.org/pdf/1010.4784.pdf
概念漂移的问题:定义和相关工作 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.58.9085&rep=rep1&type=pdf
概念漂移适应概述 http://www.win.tue.nl/~mpechen/publications/pubs/Gama_ACMCS_AdaptationCD_accepted.pdf
流媒体数据的MOA概念漂移主动学习策略 http://videolectures.net/wapa2011_bifet_moa/
概念漂移的算法流 http://people.cs.georgetown.edu/~maloof/pubs/maloof.heilbronn12.handout.pdf
采用概念漂移挖掘数据流 http://www.cs.put.poznan.pl/dbrzezinski/publications/ConceptDrift.pdf
使用流处理和机器学习分析时间序列数据 http://www.ibmbigdatahub.com/blog/analyzing-time-series-data-stream-processing-and-machine-learning
答案 4 :(得分:2)
批量学习任务的SGD通常具有较低的学习率并且多次超过训练集。因此,对于纯粹的在线学习,请确保将learning_rate设置为“常量”'在sklearn.linear_model.SGDClassifier()和eta0 = 0.1或任何所需的值。因此,过程如下:
clf= sklearn.linear_model.SGDClassifier(learning_rate = 'constant', eta0 = 0.1, shuffle = False, n_iter = 1)
# get x1, y1 as a new instance
clf.partial_fit(x1, y1)
# get x2, y2
# update accuracy if needed
clf.partial_fit(x2, y2)
答案 5 :(得分:1)
扩展SVM的方法可以将您的大型数据集拆分为可以由SVM算法安全使用的批次,然后分别为每个批次查找支持向量,然后在包含所有支持的数据集上构建生成的SVM模型在所有批次中找到的载体。
每次运行训练管道时,都可以通过维护时间窗来更新趋势。例如,如果您每天进行一次培训并且一个月的历史数据中有足够的信息,请根据最近30天内获得的历史数据创建培训数据集。