SVM和logistic回归分别在什么情况下使用?

两者都是线性分类器的话,只是实现方式不同,那么各自适用于什么样的场景呢?
关注者
1,724
被浏览
234,112

21 个回答

两种方法都是常见的分类算法,从目标函数来看,区别在于逻辑回归采用的是logistical loss,svm采用的是hinge loss。这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。两者的根本目的都是一样的。此外,根据需要,两个方法都可以增加不同的正则化项,如l1,l2等等。所以在很多实验中,两种算法的结果是很接近的。

但是逻辑回归相对来说模型更简单,好理解,实现起来,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些。但是SVM的理论基础更加牢固,有一套结构化风险最小化的理论基础,虽然一般使用的人不太会去关注。还有很重要的一点,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算量。

下面一些观点几乎都在的这个talk里

csie.ntu.edu.tw/~cjlin/

如果我哪理解错了,请以slides为准。

问题是比较LR和SVM,那就首先得画好起跑线,应该比什么。

1.比Model的准确率?那么问题来了,貌似没有哪个Model可以宣称在所有data下面都能赢。所以Model的准确率本身就是data-dependent。

2.比训练Time/Space Complexity?那我觉得在Formulation可比的情况下,更多是Optimization的问题。

3.比可解释性,上面有朋友已经说到这点,两者都不错,至少都比#*&*好 XD。

下面就一些点抛砖引玉和大家讨论,

1.SVM总是让人觉得比LR结果好?SVM是不是Linear Classifier?


其实很好奇SVM为何要和Kernel Trick画上连线的,难道是因为LibSVM默认使用RBF kernel?尽管Kernel确实帮助提高Linear的结果,如同下图:


可是并不代表Kernel是SVM专有的

可是并不代表Kernel是SVM专有的

可是并不代表Kernel是SVM专有的


Kernel Logistic Regression(KLR)也很常见,(为了不引起专有名词纷争,我这里的kernel涵盖一切nonlinear的feature mapping),只是往往不同的feature mapping会让它有一个更炫酷的model名字,NN使用logistic error,或者最近在CTR比赛很有名的logistic error 的FM/FFM不也算是KRL么?如同上面的朋友所言SVM的Hinge Loss(l1/l2)或者LR的Logistic loss都是loss function罢了,和是否要用kernel或者是否linear以及使用什么regularizer没啥关系。

2. SVM跑的总是比LR慢?LR能跑出来的SVM跑不出来?SGD是万能的?

上面有说到,我们的比较要在Formulation是在可比的情况下。这里的可比主要指的是用相同的feature mapping以及相同的Regularizer等等等,拿Poly-9的SVM(别笑!Yan LeCun用过这个级别的kernel)跟纯LR的比速度我相信任何大data,LR都会更快,参数都会更少,但不能这么比不是么。当有可比性的时候剩下的问题多少都是Optimization的问题。

都是linear case的话,两者在不同Optimization方法的复杂度几乎都是相同的。无论是Features多还是Instances多,都可以通过是否导dual来解决,其实就实现的情况来看,我反倒觉得LR的问题会更多,我一直坚信目前人类目前的exp/log实现方法是logloss的optimization发展的主要障碍

我不知道online learning和batch learning做对比是否有意义,但SGD会更快这点其实也不make sense。首先你得确保你的SGD能找到能在这个data上收敛的learning rate,尽管使用一劳永逸的Adagrad。再者无论linear-SVM或者LR的dual problems使用coordinate descent methods复杂度和SGD是相同的。就算是使用复杂的Inexact Newton Method,我们最近在sub-hessian上的一些研究和实验也发现可以做到 大data下不比SGD慢同时有很好的并行/分布式的特性

3.无论LR/SVM 是不是想要好的结果就要用Kernel?想要快的速度就不能不能有好的结果?

lab的一个大二学弟最近的一篇work探讨这个

csie.ntu.edu.tw/~cjlin/

这里的kernel check可以帮你根据data选是否kernel或者如何使用linear 有更好的结果。

最后,请允许我print出来目前liblinear支持的所有solver

-s type : set type of solver (default 1)
for multi-class classification
0 -- L2-regularized logistic regression (primal)
1 -- L2-regularized L2-loss support vector classification (dual)
2 -- L2-regularized L2-loss support vector classification (primal)
3 -- L2-regularized L1-loss support vector classification (dual)
4 -- support vector classification by Crammer and Singer
5 -- L1-regularized L2-loss support vector classification
6 -- L1-regularized logistic regression
7 -- L2-regularized logistic regression (dual)
for regression
11 -- L2-regularized L2-loss support vector regression (primal)
12 -- L2-regularized L2-loss support vector regression (dual)
13 -- L2-regularized L1-loss support vector regression (dual)

其实想说的是,好吧,我上面说的都是错的,请对你的data多做实验,实验数据才能说明一切.