是否可以将训练数据附加到现有的SVM模型?


14

我正在使用libsvm,并且注意到每次调用svmtrain()时,我都会创建一个新模型,并且似乎没有选择将数据放入现有模型中。但是可以这样做吗?我只是在libsvm中看不到这方面吗?


我不确定“将数据放入现有模型中”是什么意思?您能否举例说明一些其他技术(而不是SVM)来执行此操作?以逻辑回归为例;如果添加新数据,则将在现有数据集上重新训练一组新的系数,而无需参考哪些数据是“新”或“旧”数据,而这全都是训练数据。我想如果您使用的是梯度下降型求解器,则可以通过初始化为先前优化的值来节省时间,该值可能与新的解决方案接近。你是这个意思吗?
Bogdanovist 2012年

Answers:


17

听起来您正在寻找“增量”或“在线”学习算法。这些算法使您可以使用新示例更新分类器,而无需从头开始重新训练整个过程。

支持向量机绝对有可能,尽管我相信libSVM目前尚不支持它。值得一看的是其他提供此功能的软件包,其中包括

PS:@Bogdanovist:关于这一点,有很多文献。kNN显然是微不足道的。通过存储计数而不是概率,人们可以将(某些)贝叶斯分类器变成增量分类器。STAGGER,AQ *和ID *系列的决策树算法中的某些(但不是全部)也都是增量式的,超出了我的脑海。


1
有趣,感谢大家的注意。我以前曾见过“在线”一词,但并没有意识到其技术意义(我认为它的字面意思是“可以上网”)。
Bogdanovist

乐意效劳!我应该在上面提到这一点,但是实际上某些在线/增量算法确实对“最新”示例给予了更多重视,具体取决于您的应用(例如,对于预测Twitter主题非常有用,对癌症的影响较小),这些例子可能有用也可能没有用研究)。
马特·克劳斯

12

大多数在线/增量式SVM实用程序都适用于线性内核,我想它的难度不如非线性内核那么难。

当前可用的一些著名的在线/增量SVM工具:
+ Leon Bottous的LaSVM:它支持线性和非线性内核。C ++代码
+ Bordes的LaRank:它支持线性和非线性内核。C ++代码。似乎链接现在已断开:-(
+ + Gert Cauwenberghs的代码递增和递减:支持线性和非线性内核Matlab代码。
+ Chris Diehl的Incremental SVM学习:支持线性和非线性内核Matlab代码。
+ Alistair Shilton的SVMHeavy:仅二进制分类和回归C ++代码
+ Francesco Parrella的OnlineSVR:仅回归。Matlab和C ++。
+ Pegasos:线性和非线性。C和Matlab代码。java接口
+ Langford的Vowpal Wabbit:不确定:-(
+ Koby Crammer的MCSVM:线性和非线性C代码

在我的Quora答案中可以找到更多更新的列表。


(+1)欢迎光临本站。那是一个非常详尽的清单!:)
红衣主教

4

另一种可能性是alpha播种。我不知道libSVM是否支持它。这个想法是将大量的训练数据分成多个块。然后,在第一个块上训练SVM。由于产生的支持向量不过是数据的一些样本,因此您将这些样本作为样本,然后使用它们来训练下一个块的SVM。同样,您使用该SVM为下一次迭代(种子)计算alpha值的初始估计。因此,好处是双重的:每个问题都较小,并且通过智能初始化,它们收敛得更快。这样,您可以将一个巨大的问题简化为依次解决一系列更简单的步骤。


有没有使用这种方法的图书馆?
d.putto 2013年

显然libsvm已经做到了,或者至少是算法工作的
〜htlin / program /

1

如果您正在寻找“增量”解决方案,则可以在这里找到另一种选择。

线性增量

LIBLINEAR的扩展,允许增量学习。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.