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

Mic*_*ina 42 python machine-learning svm scikit-learn

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

据我所知,最好的方法是利用支持增量/ 在线学习的机器学习算法.

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

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

Raf*_*ard 32

虽然SVM的在线算法确实存在,但是指定是否需要内核或线性SVM变得很重要,因为已经为线性SVM的特殊情况开发了许多有效的算法.

对于线性情况,如果您在scikit中使用SGD分类器 - 学习铰链损失和L2正则化,您将获得可在线/递增更新的SVM.您可以将其与接近内核的特征变换结合起来,以类似于在线内核SVM.

我的一个规格是它应该不断更新以适应不断变化的趋势.

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

假设您在训练/跑步时获得反馈,您可以尝试检测精确度随时间的降低,并在准确度开始下降时开始训练新模型(当您认为准确性变得更准确时切换到新模型).JSAT有两种漂移检测方法(参见jsat.driftdetectors),可用于跟踪准确性并在变化时提醒您.

它还有更多的在线线性和内核方法.

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


Jar*_*ani 21

也许这是我天真但我认为值得一提的是当你逐步呈现数据时如何实际更新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)
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚检查了网站的缓存版本,并且有一个重要的实现注意事项:“对于分类,需要注意的一点是,尽管无状态特征提取例程可能能够处理新的/看不见的属性,但是增量学习者本身可能无法应付新的/看不见的目标类。在这种情况下,您必须使用classes =参数将所有可能的类传递给第一个partial_fit调用。” (2认同)
  • 这个其他答案可能有助于解决这些问题..使用“warm_start=True”来组合“fit()”和“partial_fit()”:/sf/ask/3444603221/未显示准确的结果/51027226#51027226 (2认同)

lej*_*lot 9

技术方面

简短的回答是否定的.Sklearn实施(以及大多数现有的其他)不支持在线SVM培训.可以以递增的方式训练SVM,但这不是那么简单的任务.

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

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

理论方面

趋势适应问题目前在ML社区非常流行.正如@Raff所说,它被称为概念漂移,并且有许多方法,这些方法通常是各种元模型,分析"趋势如何表现"并改变基础ML模型(例如通过强制它重新训练子集的数据).所以你有两个独立的问题:

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


Ala*_* Rz 5

用于批量学习任务的 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)
Run Code Online (Sandbox Code Playgroud)