支持向量机:http://scikit-learn.org/stable/modules/svm.html#classification

新加坡元:http://scikit-learn.org/stable/modules/sgd.html#classification

在我看来,他们写的是“SGD实现了线性模型”,这在我看来几乎是一样的。有人可以解释它们之间的区别吗?

最佳答案

SVM 是一个 support-vector machine 其中 是一个特殊的线性模型 。从理论角度来看,这是一个 凸优化问题 ,我们可以在多项式时间内获得全局最优。 有许多不同的优化方法

过去人们使用通用的 Quadratic Programming 求解器。现在使用像 SMO 和其他专门方法。

sklearn 的专用 SVM 优化器基于 liblinearlibsvm 。如果您对算法感兴趣,有很多文档和研究论文。

请记住,SVC (libsvm) 和 LinearSVC (liblinear) 对优化问题做出了不同的假设,这导致在同一任务上的性能不同(线性内核:LinearSVC 通常比 SVC 效率高得多;但有些LinearSVC 无法处理任务)。

SGD 是一个基于 Stochastic Gradient Descent(这是一种通用的优化方法!)优化器,它可以优化许多不同的凸优化问题( 实际上:这或多或少与所有深度学习方法中使用的方法相同;所以人们使用它在非凸设置中;扔掉理论保证 )。

sklearn 说: 随机梯度下降 (SGD) 是一种简单但非常有效的方法,用于在凸损失函数 下对线性分类器进行判别学习。现在它实际上更加通用,但是在这里足以说明它包含(某些)SVM,逻辑回归等。

现在基于 SGD 的优化与 QP 等非常不同。如果以 QP 为例, 没有超参数来调整 。这有点简化,因为可以进行调整,但不需要保证收敛和性能! (QP 求解器的理论,例如 Interior-point method 更加健壮)

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

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

  • 专门的 SVM 方法
  • 随样本数量的增加而变差
  • 不需要超参数调整
  • 基于 SGD 的方法
  • 可以更好地扩展一般
  • 中的海量数据
  • 需要超参数调整
  • 仅解决上述可解决的任务的一个子集(无内核方法!)

  • 我的意见是:考虑到您的时间预算,使用(更容易使用的)LinearSVC,只要它工作正常!

    简单说一下:我强烈建议获取一些数据集(例如从 sklearn 中)并在这些候选者之间进行一些比较。参数调整的需要不是理论上的问题!您将很容易在 SGD 案例中看到非最佳(目标/损失)结果!

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

    关于python - scikit-learn:SVC 和 SGD 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48022187/

    10-12 20:10