两种方法都是常见的分类算法,从目标函数来看,区别在于逻辑回归采用的是logistical loss,svm采用的是hinge loss。这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。两者的根本目的都是一样的。此外,根据需要,两个方法都可以增加不同的正则化项,如l1,l2等等。所以在很多实验中,两种算法的结果是很接近的。
但是逻辑回归相对来说模型更简单,好理解,实现起来,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些。但是SVM的理论基础更加牢固,有一套结构化风险最小化的理论基础,虽然一般使用的人不太会去关注。还有很重要的一点,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算量。
在Andrew NG的课里讲到过:
1. 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
2. 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
3. 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况
Linear SVM 和 LR 有什么异同?
他们都是线性分类器,模型求解的就是一个超平面(假设问题是2类分类);以下主要谈一谈 不同点。
Linear SVM直观上是trade-off两个量
1)a large margin,就是两类之间可以画多宽的gap ;不妨说是正样本应该在分界平面向左gap/2(称正分界),负样本应该在分解平面向右gap/2(称负分界)(见下图)
2)L1 error penalty,对所有不满足上述条件的点做L1 penalty
可以看到,给定一个数据集,一旦完成Linear SVM的求解,所有数据点可以被归成两类
1)一类是落在对应分界平面外并被正确分类的点,比如落在正分界左侧的正样本或落在负分界右侧的负样本
2)第二类是落在gap里或被错误分类的点。
假设一个数据集已经被Linear SVM求解,那么往这个数据集里面增加或者删除更多的一类点并不会改变重新求解的Linear SVM平面。这就是它区分与LR的特点,下面我们在看看LR。
值得一提的是求解LR模型过程中,每一个数据点对分类平面都是有影响的,它的影响力远离它到分类平面的距离指数递减。换句话说,LR的解是受数据本身分布影响的。在实际应用中,如果数据维度很高,LR模型都会配合参数的L1 regularization。
要说有什么本质区别,那就是两个模型对数据和参数的敏感程度不同,Linear SVM比较依赖penalty的系数和数据表达空间的测度,而(带正则项的)LR比较依赖对参数做L1 regularization的系数。但是由于他们或多或少都是线性分类器,所以实际上对低维度数据overfitting的能力都比较有限,相比之下对高维度数据,LR的表现会更加稳定,为什么呢?
因为Linear SVM在计算margin有多“宽”的时候是依赖数据表达上的距离测度的,换句话说如果这个测度不好(badly scaled,这种情况在高维数据尤为显著),所求得的所谓Large margin就没有意义了,这个问题即使换用kernel trick(比如用Gaussian kernel)也无法完全避免。所以使用Linear SVM之前一般都需要先对数据做normalization,而求解LR(without regularization)时则不需要或者结果不敏感。
LR在NLP界还有另一个名字就是最大熵模型,当然我不准备花时间解释这个,有兴趣的可以看比如
http://www.win-vector.com/dfiles/LogisticRegressionMaxEnt.pdf
如果理解最大熵模型的内蕴,应该不难看出LR是不依赖数据的距离测度的。
总结一下
- Linear SVM和LR都是线性分类器
- Linear SVM不直接依赖数据分布,分类平面不受一类点影响;LR则受所有数据点的影响,如果数据不同类别strongly unbalance一般需要先对数据做balancing。
- Linear SVM依赖数据表达的距离测度,所以需要对数据先做normalization;LR不受其影响
- Linear SVM依赖penalty的系数,实验中需要做validation
- Linear SVM和LR的performance都会收到outlier的影响,其敏感程度而言,谁更好很难下明确结论。
注:不带正则化的LR,其做normalization的目的是为了方便选择优化过程的起始值,不代表最后的解的performance会跟normalization相关,如果用最大熵模型解释,实际上优化目标是和距离测度无关的,而其线性约束是可以被放缩的(等式两边可同时乘以一个系数),所以做normalization只是为了求解优化模型过程中更容易选择初始值。初学者容易把模型的建立和模型的求解混淆。
注2:查阅了一下Linear SVM和LR在UCI数据集上的表现,在小规模数据集上,Linear SVM是要略好于LR的,但差别也不是特别大,而且Linear SVM的计算复杂度受数据量限制,对海量数据LR使用更加广泛。Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?
其实这两个分类器还是很类似的,都是在最大化两类点之间的距离,但是 LR 把所有点都纳入模型考量的范围了,而 SVM 则只看 support vectors, 也就是离分类平面最近的点。所以说 SVM 的优点就在于,通过忽略已经分类正确的点,最后训练出来的模型更加稳健,对 outlier 不敏感。
具体到 loss function 上来看, LR 用的是 log-loss, SVM 用的是 hinge-loss, 两者的相似之处在于 loss 在错误分类的时候都很大,但是对于正确分类的点,hinge-loss 就不管了,而 log-loss 还要考虑进去。此外因为 log-loss 在 mis-classified 的点上是指数级增长的,而 hinge-loss 是线性增长,所以 LR 在偶尔出现 mis-label 的情况下的表现会比较糟糕。
此外还有一点就是用 SVM 来预测概率意义不大,人家模型本身就不是基于概率的。LR 则是基于 log-likelihood ratio,方便给出概率,并且向 multi-class 的扩展更加直接。(SVM 做 multi-class 也不是不可以,但是 objective function 很乱,实践中一般直接用 one-vs-all)
另外 regularization 在这里没有区别,L1/L2 两个都能用,效果也差不多。Class imbalance 的话 SVM 一般用 weight 解决,LR 因为可以预测概率,所以也可以直接对最后的结果进行调整,取不同的阈值来达到理想的效果。
实践中 LR 的速度明显更快,维度小的时候 bias 小也不容易 overfit. 相反 Kernel SVM 在大规模数据集的情况下基本不实用,但是如果数据集本身比较小而且维度高的的话一般 SVM 表现更好。