我有两个大小不同的数据集。
1)数据集1具有高维度4500个样本(草图)。
2)数据集2具有低维1000个样本(真实数据)。我想"两个数据集具有相同的分布"
我想在第一个数据集上使用sklearn
训练非线性SVM
模型(作为预训练),然后我想在第二个数据集的一部分上更新模型(以拟合模型)。我怎样才能在 sklearn 上开发一种更新。如何更新 SVM 模型?
在 sklearn 中,您只能对线性内核并使用 SGDClassifier
执行此操作(适当选择损失/惩罚项,损失应该是铰链,惩罚 L2)。通过partial_fit
方法支持增量学习,这既不适用于SVC
也不LinearSVC
。
不幸的是,在实践中,以增量方式为如此小的数据集拟合 SVM 是相当无用的。SVM 具有易于获得的全局解决方案,因此您不需要任何形式的预训练,事实上,如果您正在考虑神经网络意义上的预训练,这根本不重要。如果正确实现,SVM 应该完全忘记以前的数据集。为什么不一次性学习整个数据?这是 SVM 应该做的。除非您正在使用 SVM 的一些非凸修改(那么预训练是有意义的)。
总结一下:
- 从理论和实践的角度来看,预训练 SVM 是没有意义的。您可以只在第二个数据集上学习,也可以同时在两个数据集上学习。预训练仅对遭受局部最小值(或任何类型的硬收敛)的方法是合理的,因此需要从接近实际解决方案开始才能找到合理的模型(如神经网络)。SVM 不是其中之一。
- 出于效率原因,您可以使用增量拟合(尽管在 sklearn 中它非常有限),但对于如此小的数据集,您只需一次对整个数据集进行微调拟合。