SVM:http://scikit-learn.org/stable/modules/svm.html#classification
SGD:http://scikit-learn.org/stable/modules/sgd.html#classification
在我看来,SVM和SGD似乎做的差不多,因为它们都写着“SGD实现了一个线性模型”。有人能解释一下它们之间的区别吗?
SVM:http://scikit-learn.org/stable/modules/svm.html#classification
SGD:http://scikit-learn.org/stable/modules/sgd.html#classification
在我看来,SVM和SGD似乎做的差不多,因为它们都写着“SGD实现了一个线性模型”。有人能解释一下它们之间的区别吗?
SVM是一种支持向量机,它是一种特殊的线性模型。从理论上讲,它是一个凸优化问题,我们可以在多项式时间内获得全局最优解。有许多不同的优化方法。
过去人们使用通用的二次规划求解器。现在使用专门的方法,如SMO和其他方法。
sklearn的专门SVM优化器基于liblinear和libsvm。如果您对算法感兴趣,可以查阅许多文献和研究论文。
请记住,SVC(libsvm)和LinearSVC(liblinear)在优化问题方面做出了不同的假设,这导致在相同任务上表现不同(线性核:LinearSVC通常比SVC更有效,但某些任务无法由LinearSVC处理)。
SGD是基于随机梯度下降(这是一种通用的优化方法!)的优化器,可优化许多不同的凸优化问题(实际上:所有这些深度学习方法中使用的方法都差不多,因此人们也在非凸设置中使用它,放弃理论保证)。
sklearn说:随机梯度下降(SGD)是一种简单而非常有效的方法,可以在凸损失函数下进行线性分类器的判别式学习。现在它甚至更加多才多艺,但在这里足以注意到它包含了(一些)SVM、逻辑回归和其他方法。
现在,基于SGD的优化与QP等其他方法非常不同。例如,如果以QP为例,没有需要调整的超参数。这有点简化了,因为可以进行调整,但不需要保证收敛和性能!(QP求解器的理论,例如内点法要更加鲁棒)
基于SGD的优化器(或一般的一阶方法)非常难以调整!并且它们需要调整!学习率或学习计划通常是要关注的参数,因为收敛取决于这些参数(理论和实践)!
这是一个非常复杂的话题,但有一些简化规则:
专门的SVM方法
基于SGD的方法
我的意见是:在时间预算内,尽可能使用更易于使用的LinearSVC!
只是为了明确起见:我强烈建议抓取一些数据集(例如从sklearn中获取)并在这些候选项之间进行比较。超参数调整的需要不是一个理论问题!在SGD情况下,你很容易看到非最优(目标/损失)结果!
并且永远记住:随机梯度下降对特征缩放敏感docs。这或多或少是一阶方法的结果。
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')