scikit-learn:SVC和SGD有什么区别?

6
2个回答

23

SVM是一种支持向量机,它是一种特殊的线性模型。从理论上讲,它是一个凸优化问题,我们可以在多项式时间内获得全局最优解。有许多不同的优化方法

过去人们使用通用的二次规划求解器。现在使用专门的方法,如SMO和其他方法。

sklearn的专门SVM优化器基于liblinearlibsvm。如果您对算法感兴趣,可以查阅许多文献和研究论文。

请记住,SVC(libsvm)和LinearSVC(liblinear)在优化问题方面做出了不同的假设,这导致在相同任务上表现不同(线性核:LinearSVC通常比SVC更有效,但某些任务无法由LinearSVC处理)。

SGD是基于随机梯度下降(这是一种通用的优化方法!)的优化器,可优化许多不同的凸优化问题(实际上:所有这些深度学习方法中使用的方法都差不多,因此人们也在非凸设置中使用它,放弃理论保证)。

sklearn说:随机梯度下降(SGD)是一种简单而非常有效的方法,可以在凸损失函数下进行线性分类器的判别式学习。现在它甚至更加多才多艺,但在这里足以注意到它包含了(一些)SVM、逻辑回归和其他方法。

现在,基于SGD的优化与QP等其他方法非常不同。例如,如果以QP为例,没有需要调整的超参数。这有点简化了,因为可以进行调整,但不需要保证收敛和性能!(QP求解器的理论,例如内点法要更加鲁棒)

基于SGD的优化器(或一般的一阶方法)非常难以调整!并且它们需要调整!学习率或学习计划通常是要关注的参数,因为收敛取决于这些参数(理论和实践)!

这是一个非常复杂的话题,但有一些简化规则

  • 专门的SVM方法

    • 随着样本数量的增加,规模变得更大
    • 不需要超参数调整
  • 基于SGD的方法

    • 一般来说可以更好地处理海量数据
    • 需要超参数调整
    • 只解决上述方法中可解决的子集(没有核方法!)

我的意见是:在时间预算内,尽可能使用更易于使用的LinearSVC!

只是为了明确起见:我强烈建议抓取一些数据集(例如从sklearn中获取)并在这些候选项之间进行比较。超参数调整的需要不是一个理论问题!在SGD情况下,你很容易看到非最优(目标/损失)结果!

并且永远记住:随机梯度下降对特征缩放敏感docs。这或多或少是一阶方法的结果。


你能解释一下哪些任务是LinearSVC无法处理的特征吗? - Ulu83
@Ulu83 你试图优化的损失函数是非线性的。 - erip
@Ulu83,无法使用非线性核。另请参见:核技巧 - sascha

1

SVC(SVM)使用基于核的优化,其中输入数据被转换为复杂数据(展开),从而扩展了类别之间更复杂的边界。SVC可以执行线性和非线性分类。

SVC可以通过将内核参数设置为“linear”来执行线性分类 svc = SVC(kernel='linear')

SVC可以通过将内核参数设置为“poly”,“rbf”(默认)来执行非线性分类 svc = SVC(kernel='poly') svc = SVC(kernel='rbf')

SGDClassifier使用梯度下降优化技术,通过迭代过程确定最佳系数。SGDClassifier只能执行线性分类。

当参数loss设置为'hinge'时,SGDClassifer可以使用Linear SVC(SVM)模型,即SGDClassifier(loss='hinge')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接