liblinear SVM简介
MachineLearning
linlinear与libsvm的对比
在libsvm诞生的时代,svm的核函数带来的非线性模型是SVM的主要优势之一,且当时的样本量还不是瓶颈。因此libsvm的整体框架都是针对训练kernel SVM模型来训练的。但是如果只是需要训练一个线性的SVM模型,那么算法可以简单高效的多。因此liblinear在保持基本接口和调用方式一致的情况下,采用了新的训练算法,支持了线性SVM和Logistic Regression的训练。
注:SVM之所以效果好,主要是得益于非线性核函数的引入,但基于核函数的SVM求解相对复杂,需要存储一个稠密的kernel矩阵,当样本量很大时,存储量相当可观。另外当问题涉及不同的领域知识与业务背景时,很多时候仅仅依靠常见的集中kernel函数并不能解决问题。
可以参考orangeprince的博客——LIBSVM与LIBLINEAR系列
如何选择libsvm与liblinear
- 凡是确定适用线性分类器的场景,一定是使用liblinear而不是libsvm
- 如果样本量较大,比如达到10万以上的规模,这时libsvm已经很难处理了。如果线性分类器的效果实在不好,只能采用人工构造特征+linlinear的方式,或者采用其他的分类器,如神经网络、随机森林等
- 对于高维稀疏数据,典型的如文本的向量空间表示,一般都采用线性分类器。
- 对于样本量和维度都不算是太大的问题,且没有对预测的效率有很高的要求,都可以用libsvm尝试一下kernel SVM的分类器,很多情况下kernel SVM比直接用liblinear SVM还是能达到更高的精度
liblinear的数学模型
参考orangeprince的博客——LIBSVM与LIBLINEAR(二)
简单来讲,线性SVM的目标函数为
argminwΩ(w)+C∑i=1lℓ(yi,wTxi)
其中
ℓ作为误差函数,用来度量预测值与目标值的损失。
在线性SVM中,有
ℓ(yi,wTxi)=max(0,1−yiwTxi)
(Hinge Loss)
在Logistic Regression中,有
ℓ(yi,wTxi)=log(1+e−yiwTxi)
Ω为正则化项,常用有
ℓ2−norm, 写作
wTw, 也可以写作
||w||2, 即向量
w中所有元素的平方和。另外还有
ℓ1−norm. 大量的监督学习模型都可以写成loss function + regularizer(正则化项), 而参数
C则控制了两者在最终损失函数中所占的比重。
多分类问题
libsvm是one vs one, 而liblinear是one vs all。
liblinear的参数
接触liblinear是在论文《Learning Rich Features from RGB-D Images for Object Detection and Segmentation》中,具体的调用过程可参见其代码, 其中提到的三个参数是C=0.001,B=10,w1=2.0, 此处仅解释这三个参数的意义,其他参数以后用到的时候再补充。
C=0.001:cost, 如上所述,C控制了损失函数和正则化项的比重, 选用liblinear时主要调节参数C, 从小到大调节。如果再增加C对结果改变不大时,就可以不用继续测试下去了,选择较小的C即可
B=10:bias, 如果bias>=0, 样本x变为[x;bias];如果bias<0, 则没有bias项,默认值为-1
w1=2:weight, 给不同类别的样本的损失函数赋予不同的权重。在liblinear处理多分类问题时是one vs all,实际上也是训练一个个二分类器(正负样本),这里的w1设定的是正样本的权重(>1, rcnn中负样本数量要远远高于正样本)。