[关闭]
@hshustc 2015-09-22T03:35:49.000000Z 字数 1768 阅读 4266

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

  1. 凡是确定适用线性分类器的场景,一定是使用liblinear而不是libsvm
  2. 如果样本量较大,比如达到10万以上的规模,这时libsvm已经很难处理了。如果线性分类器的效果实在不好,只能采用人工构造特征+linlinear的方式,或者采用其他的分类器,如神经网络、随机森林等
  3. 对于高维稀疏数据,典型的如文本的向量空间表示,一般都采用线性分类器。
  4. 对于样本量和维度都不算是太大的问题,且没有对预测的效率有很高的要求,都可以用libsvm尝试一下kernel SVM的分类器,很多情况下kernel SVM比直接用liblinear SVM还是能达到更高的精度

liblinear的数学模型

参考orangeprince的博客——LIBSVM与LIBLINEAR(二)
简单来讲,线性SVM的目标函数为

argminwΩ(w)+Ci=1l(yi,wTxi)

其中作为误差函数,用来度量预测值与目标值的损失。
在线性SVM中,有
(yi,wTxi)=max(0,1yiwTxi)
(Hinge Loss)
在Logistic Regression中,有
(yi,wTxi)=log(1+eyiwTxi)

Ω为正则化项,常用有2norm, 写作wTw, 也可以写作||w||2, 即向量w中所有元素的平方和。另外还有1norm. 大量的监督学习模型都可以写成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中负样本数量要远远高于正样本)。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注