sklearn中的SVM支持增量(在线)学习吗?
我现在正在设计一个推荐系统,用来推荐文本文章(简单来说,就是判断一篇文章是“有趣”还是“没趣”)。我的一个要求是,这个系统要能不断更新,以适应变化的趋势。
根据我的了解,最好的办法是使用一种支持增量学习或在线学习的机器学习算法。在线学习就是指算法可以在新数据到来时不断学习,而不是一次性处理所有数据。
像感知机(Perceptron)和Winnow这样的算法支持在线学习,但我对支持向量机(Support Vector Machines)是否支持这一点不太确定。请问scikit-learn这个Python库支持在线学习吗?如果支持,支持向量机是否也是可以使用的算法之一?
我并不是非要使用支持向量机,但它们通常是二分类问题的首选算法,因为表现比较全面。最终我会根据实际情况选择最合适的算法。
6 个回答
要让支持向量机(SVM)处理大数据集,可以把你的大数据集分成几个小批次,这样每个批次都能被SVM算法安全地处理。然后,分别为每个批次找到支持向量,最后把所有批次找到的支持向量合在一起,构建一个新的SVM模型。
为了跟上最新的趋势,你可以在每次运行训练流程时保持一个时间窗口。比如,如果你每天进行一次训练,而你有一个月的历史数据,那么就可以用最近30天的历史数据来创建你的训练数据集。
在批量学习任务中,随机梯度下降(SGD)通常会使用逐渐减小的学习率,并且会多次遍历训练数据集。所以,如果你想进行纯在线学习,记得在使用sklearn.linear_model.SGDClassifier()时,把学习率设置为'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)
技术方面
简单来说,答案是不可以。Sklearn这个库(还有其他大多数类似的库)不支持在线训练支持向量机(SVM)。虽然可以以增量的方式训练SVM,但这并不是一件简单的事情。
如果你只想处理线性情况,那么答案是可以,因为sklearn提供了随机梯度下降(SGD)的方法,这个方法可以用来最小化SVM的标准。
你也可以试试pegasos这个库,它支持在线训练SVM。
理论方面
趋势适应的问题在机器学习(ML)圈子里现在非常热门。正如@Raff所说,这个现象被称为概念漂移,有很多种方法来处理这个问题,这些方法通常是一些元模型,它们会分析“趋势是如何变化的”,并改变底层的机器学习模型(比如强制它在数据的一个子集上重新训练)。所以这里有两个独立的问题:
- 在线训练的问题,这纯粹是技术上的,可以通过SGD或其他非sklearn的库来解决。
- 概念漂移,这是一个热门话题,目前没有简单有效的解决方案。虽然有很多可能性、假设和概念验证,但实际上没有一种被广泛接受的方法来处理这种现象,很多机器学习的博士论文都是围绕这个问题展开的。
也许我有点天真,但我觉得有必要提一下,当你逐步展示数据时,如何实际更新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可能无法很好地处理这个问题。使用被动攻击分类器(PassiveAggressive classifier)可能会得到更好的结果,因为它的学习速率不会随着时间的推移而降低。
假设你在训练或运行时能获得反馈,你可以尝试检测准确率是否随着时间的推移而下降,并在准确率开始下降时开始训练一个新模型(当你认为新模型更准确时再切换过去)。 JSAT 提供了两种漂移检测方法(见 jsat.driftdetectors),可以用来跟踪准确率,并在变化时提醒你。
它还提供了更多在线的线性和核方法。
(偏见说明:我是JSAT的作者)。