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

时间:2017-12-29 11:49:38

标签: python scikit-learn svm

SVM:http://scikit-learn.org/stable/modules/svm.html#classification

SGD:http://scikit-learn.org/stable/modules/sgd.html#classification

似乎对我的眼睛几乎一样,因为他们写的是“SGD实现了一个线性模型”。有人可以解释它们之间的差异吗?

2 个答案:

答案 0 :(得分:10)

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。这或多或少是一阶方法的结果。

答案 1 :(得分:1)

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

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

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

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

当参数损失设置为'hinge'(这是默认值)即SGDClassifier(loss='hinge')时,SGDClassifer可以使用线性SVC(SVM)模型