libsvm/libliner运用经验

libsvm/libliner使用经验

首先,一定要先读完libsvm和libliner的guide。

公司用libsvm做的分类。忙了这么久了,整理下经验。(不包含特定领域,涉及到商业机密任何信息)

svm估计懂些人工智能的都知道啦。不过除非你是搞科研的,要不我估计你也不会去推导它。。。。太tmd恐怖了。

其实原理很简单。就是把不同类的向量在坐标系上标点,然后用低一维的形把点线性分开

如果你深入研究过一些svm的话,肯定会听说核函数,核函数用在线性不可分时,把点映射到高维空间去,就可分了。(到底可不可分,发明核函数的人也不知道,核函数把向量映射到了什么空间,上帝也不知道。)所以,这里面有个核心思想,就是svm思想是作用在线性可分坐标系的。


如果你不是学术帝,那该想到了一点,就是svm的输入维数越多越好。这意味着,不需要使用核函数,就可以线性可分。真的要记住这句话,具体的数我不能写出来。但好好想想,这么用,就会发现,线性不可分?no。这个世界没有东西是线性不可分的(做适当预处理)。所以,实际工程中,让核函数见鬼去吧。那是学术帝们玩的东西。不用核函数,而拓展维度(怎么拓展,自己想啦),你会发现,速度提高十多倍。。。。精度呢,维度控制好了,也是可以提高不少滴。


*的教授哥哥真给力,写的libsvm和libliner,是福音呐。做大数据的时候,一般得用matlab(当然,你要是硬要用C++也没人反对,真的慢很多的)。这两个库都有matlab接口,用mex编译下就可以当成matlab函数用了。


使用流程,easy.py不推荐用,先自己用grid.py找C(最重要的参数,guide里有介绍),用train的-v 5做交叉训练,得出一个精度,基本可信的(注意,一般都用-v 5的,经验数据,效果最好)。然后不用-v,直接训练出model文件,然后调用predict(都在windows文件夹下),就得出训练的质量了。


如果你的数据可以拓展的多维,或者本身就有很多维,推荐用libliner(1k维以上),否则libliner的精度不高,但快,秒杀级的快。


其实,把svm看成是黑盒的工具,最重要的反倒不是算法上怎么改进,而是你的输入向量。如果你在相关工作中遇到了精度瓶颈,一定要从输入向量上入手,切记不要尝试“改善”算法。(除非是学术帝)


另外,libsvm有个cuda加速版本。俩字:坑爹。不要用。代价太大,大部分情况下是减速,而不是加速。而且,他只实现了交叉训练(必须得-v参数),不交叉的话还是调用的原程序。


关于grid.py的使用方法,改local_woker部分,具体在libliner的FAQ上有。(谷歌 libliner grid.py)

还有,libsvm的scale那个应用,尽量不要用。它是整个全体scale的,通常不会满足你的需求的,不信你研究下,看它背着你干了什么坑爹的事。用libsvmread把数据读到matlab,然后在matlab里用mapminmax基本能搞定大部分的scale需求了,libsvmwrite写入到文件。对了,mex编译的时候记得加-largeArrayDims