sklearn中的SVM是否支持增量(在线)学习?

时间:2014-04-14 09:24:17

标签: python machine-learning scikit-learn svm

我目前正在为文本文章设计一个推荐系统(一个有趣的二进制案例'或者不感兴趣的')。我的一个规格是它应该不断更新以适应不断变化的趋势。

据我所知,最好的方法是使用支持incremental / online learning的机器学习算法。

Perceptron和Winnow等算法支持在线学习,但我不完全确定支持向量机。 scikit-learn python库是否支持在线学习,如果是,支持向量机是否可以使用它的算法之一?

我显然没有完全依赖于使用支持向量机,但由于它们的全面性能,它们通常是用于二进制分类的算法。我愿意改变最终最适合的东西。

6 个答案:

答案 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模型(例如强迫它重新训练数据的子集)。所以你在这里有两个独立的问题:

  • 在线培训问题,纯粹是技术问题,可由SGD或其他图书馆解决,而不是sklearn
  • 概念漂移,这是一个热门话题,没有只是作品答案有很多可能性,假设和概念证明,而没有一种,一般被接受的处理这种现象的方法事实上,ML中的许多博士论文目前都基于这个问题。

答案 3 :(得分:2)

如果对概念漂移的在线学习感兴趣,那么这里有一些以前的工作

  1. 在概念漂移下学习:概述 https://arxiv.org/pdf/1010.4784.pdf

  2. 概念漂移的问题:定义和相关工作 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.58.9085&rep=rep1&type=pdf

  3. 概念漂移适应概述 http://www.win.tue.nl/~mpechen/publications/pubs/Gama_ACMCS_AdaptationCD_accepted.pdf

  4. 流媒体数据的MOA概念漂移主动学习策略 http://videolectures.net/wapa2011_bifet_moa/

  5. 概念漂移的算法流 http://people.cs.georgetown.edu/~maloof/pubs/maloof.heilbronn12.handout.pdf

  6. 采用概念漂移挖掘数据流 http://www.cs.put.poznan.pl/dbrzezinski/publications/ConceptDrift.pdf

  7. 使用流处理和机器学习分析时间序列数据 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天内获得的历史数据创建培训数据集。