SVM:http://scikit-learn.org/stable/modules/svm.html#classification
SGD:http://scikit-learn.org/stable/modules/sgd.html#classification
似乎对我的眼睛几乎一样,因为他们写的是“SGD实现了一个线性模型”。有人可以解释它们之间的差异吗?
答案 0 :(得分:10)
SVM 是support-vector machine,是一种特殊的线性模型。从理论上看,它是凸优化问题,我们可以在多项式时间内得到全局最优。 有许多不同的优化方法。
过去,人们使用普通Quadratic Programming求解器。如今,使用了SMO等其他专门方法。
sklearn的专业SVM优化工具基于liblinear和libsvm。如果您对算法感兴趣,那么有很多文档和研究论文。
请记住,SVC(libsvm)和LinearSVC(liblinear)对优化问题做出了不同的假设,这导致了同一任务的不同性能(线性内核:LinearSVC一般比SVC更有效;但是某些任务无法由LinearSVC解决。
SGD是基于Stochastic Gradient Descent的(这是一种通用优化方法!)优化器,可以优化许多不同的凸优化问题(实际上:这或多或少与所有这些中使用的方法相同)深度学习方法;所以人们也在非凸面设置中使用它;抛弃理论保证)。
现在基于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)模型