sklearn中的SVM是否支持增量(在线)学习?
machine-learning
python
scikit-learn
svm
5
0

我目前正在设计文本文章的推荐系统(“有趣”或“不有趣”的二进制情况)。我的规范之一是,它应该不断更新以适应不断变化的趋势。

据我所知,做到这一点的最佳方法是利用支持增量/ 在线学习的机器学习算法。

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

我显然并不完全依赖于支持向量机,但是由于它们的全面性能,它们通常是二进制分类算法。我愿意最终改变为最合适的方式。

参考资料:
Stack Overflow
收藏
评论
共 6 个回答
高赞 时间 活跃

批处理学习任务的SGD通常会降低学习率,并且会多次重复设置训练。因此,对于纯在线学习,请确保在sklearn.linear_model.SGDClassifier()中将learning_rate设置为“ constant”,并且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)
收藏
评论

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

  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

收藏
评论

技术方面

简短的答案是否定的 。 Sklearn实施(以及大多数其他现有实施)不支持在线SVM培训。可以增量方式训练SVM,但这并不是一件容易的事。

如果您想将自己限制在线性情况下,那么答案是肯定的 ,因为sklearn为您提供了随机梯度下降(SGD),可以选择最小化SVM标准。

您也可以尝试使用pegasos库,该库支持在线SVM培训。

理论方面

趋势适应问题目前在ML社区中非常流行。正如@Raff所说,它被称为概念漂移 ,它具有多种方法,通常是各种元模型,它们可以分析“趋势的表现方式”并更改底层的ML模型(例如,通过强制对子集进行重新训练)数据)。因此,这里有两个独立的问题:

  • 在线培训问题,这纯粹是技术性问题,可以由SGD或sklearn以外的其他图书馆解决
  • 概念漂移,这是目前的一个热门话题,并没有只是工作的答案有很多可能性,假设和概念proofes,虽然没有一个,generaly接受处理这种现象的方式,在ML其实很多博士论文是currenlly基于这个问题。
收藏
评论

扩展SVM的一种方法是将大型数据集拆分为可以由SVM算法安全使用的批次,然后分别为每个批次找到支持向量,然后在包含以下所有支持向量的数据集上构建最终的SVM模型:所有批次。

通过在每次运行培训管道时都保持一个时间窗口,可以更新趋势。例如,如果您每天进行一次培训,并且一个月的历史数据中包含足够的信息,请从最近30天获得的历史数据中创建交易数据集。

收藏
评论

也许是我太天真了,但我认为值得一提的是,当您逐步显示数据时如何实际更新sci-kit SGD分类器

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)
收藏
评论

尽管确实存在用于SVM的在线算法,但是指定要内核还是线性SVM变得很重要,因为针对线性SVM的特殊情况已经开发了许多有效的算法。

对于线性情况,如果在scikit-learn中将SGD分类器与铰链损耗和L2正则化配合使用,您将获得一个可以在线/增量更新的SVM。您可以将其与近似于内核的特征转换结合使用以类似于在线内核SVM。

我的规范之一是,它应该不断更新以适应不断变化的趋势。

这被称为概念漂移,不能通过简单的在线SVM很好地处理。使用PassiveAggresive分类器可能会给您带来更好的结果,因为它的学习率不会随着时间而降低。

假设您在训练/跑步时获得了反馈,则可以尝试检测准确性随时间的下降,并在准确性开始下降时开始训练新模型(并在您认为新模型变得更准确时切换到新模型)。 JSAT有2种漂移检测方法(请参阅jsat.driftdetectors ),可用于跟踪准确性并在准确性发生变化时向您发出警报。

它还具有更多在线线性和核方法。

(偏见:我是JSAT的作者)。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号