如何使用新数据更新 SVM 模型

Posted

技术标签:

【中文标题】如何使用新数据更新 SVM 模型【英文标题】:How to update an SVM model with new data 【发布时间】:2016-05-31 06:34:03 【问题描述】:

我有两个不同大小的数据集。

1) 数据集 1 具有高维度 4500 个样本(草图)。

2) 数据集 2 是低维 1000 个样本(真实数据)。 我认为“两个数据集具有相同的分布”

我想在第一个数据集上使用sklearn 训练一个非线性SVM 模型(作为预训练),然后我想在第二个数据集的一部分上更新模型(到拟合模型)。 如何在 sklearn 上开发一种更新。如何更新 SVM 模型?

【问题讨论】:

【参考方案1】:

在sklearn中,只有线性内核和使用SGDClassifier(通过估计丢失/罚款的选择,损失应该是铰链和罚款l2)。 partial_fit 方法支持增量学习,SVCLinearSVC 均未实现。

不幸的是,在实践中,以增量方式为如此小的数据集拟合 SVM 是相当无用的。 SVM 具有易于获得的全局解决方案,因此您不需要任何形式的预训练,事实上它应该根本不重要,如果您是考虑神经网络意义上的预训练。如果正确实施,SVM 应该完全忘记以前的数据集。为什么不一次性学习整个数据呢?这就是 SVM 应该做的。除非您正在对 SVM 进行一些非凸修改(那么预训练才有意义)。

总结一下:

从理论和实践的角度来看,预训练 SVM 没有意义。您可以仅在第二个数据集上学习,也可以同时在两个数据集上学习。对于遭受局部最小值(或任何类型的硬收敛)的方法,预训练是合理的,因此需要从接近实际解决方案开始才能找到合理的模型(如神经网络)。 SVM 不是其中之一。 出于效率原因,您可以使用增量拟合(尽管在 sklearn 中它非常有限),但对于如此小的数据集,您一次就可以很好地拟合整个数据集。

【讨论】:

如果您的假设是第一个数据集包含一个好的模型所需的 50% 的信息,而较小的数据集每个都包含一些额外的未知百分比怎么办?我想从第一天开始就使用第一个模型(50%)进行预测,因为它达到了标准,比如“自主决策”,但我也想在新数据到来时更新模型。我的更新包括“砍掉坏分支”或“完全重新训练”。你知道这样的算法实现吗?

以上是关于如何使用新数据更新 SVM 模型的主要内容,如果未能解决你的问题,请参考以下文章

机器学习 - 支持向量机

如何在android中实现svm模型?

用新数据更新 SVM 分类器

如何使用 Matlab 的 quadprog 实现软边距 SVM 模型?

如何在 R 中使用 libsvm 加载 SVM 模型拟合/集成

当我在另一个视图中使用 CoreData 保存新数据时如何更新模型的另一个实例