学习总结分享-libSVM从零开始(1+2)

感谢林智仁教授,转载请注明出处

(一)准备工作

LibSVM是什么?就我的理解而言,LibSVM是一套工具箱,用来实现SVM的基础功能。它是开源的,可以深挖,玩转之后可以借鉴、打散、整合到自己的工程里。同时,它又非常“初学者向”,它将SVM集成化、黑箱化,对于很多不希望深入研究SVM,但是又需要使用SVM的人来说,libSVM能满足绝大多数要求。

尽管libSVM是初心者向的,但是它还是需要一些知识储备的。

如果你没有接触过机器学习,最好先了解一些基础知识,以便不至于迷失在一些名词里,如训练train,模型model,预测predict,样本samples,特征feature,标签label等。当然对大多数需要使用libSVM的人来说,这一步骤可以跳过。

如果你没有接触过SVM,可以浏览一下SVM Tutorial。这篇引导的好处是中英文双语的且直接和libSVM对接,劣势是比较浅显。个人建议多花点时间了解SVM,这也许会花费几天,或更久,但对SVM的理解越深刻,在之后使用libSVM时也会更得心应手。反之,如果很多基础概念混淆的话,在使用中很有可能会犯些愚蠢的错误(这些错误则可能会花掉更多的时间)。值得注意的是,目前SVM的入门指导大多数是以“最大间隔”的为切入点直接阐述SVM。但同时,另一条路是从logistic的角度,切入SVM。个人认为,从logistic的角度切入更好(如http://blog.csdn.net/sunlylorn/article/details/7885604),尤其是在评价置信度的时候。

如果你对SVM有一定了解了,但还没有实践过,或者第一次接触libSVM。那A Practical Guide to Support Vector Classification值得阅读,这篇引导也许会花掉你30min或一下午(根据你的英语水平),然而它能给出一个合理的使用libSVM的总纲。再次强调,有条件的话一定要阅读该指南。

另外,如果阅读该指南毫无压力的话,个人建议直接浏览林老师的网站http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 来学习libSVM,如果读英文实在捉急的话,可以先阅读本文或其他文章,最后再去读英文。

最后,libSVM提供了很多平台的版本和功能。本文基于windows 32-bit操作系统,利用libSVM做分类,语言上使用matlab+C混编。文中会零星总结、分享一些和libSVM无关,和matlab+C混编的内容,希望有所帮助。

(二)第一次使用libSVM

首先,libSVM的下载地址是zip file ,下载后解压就可以得到工具包。解压后的工具包内有一些文件夹和一些文件。之前说过,本文作者在windows下使用matlab+C,所以以后会用到windows文件夹和matlab文件夹里的内容。

我们先使用windows的exe执行程序来做个小例子。

(1)首先,我们来自己编译一下exe程序。当然,你可以用已经编译好的exe程序,但是,如果已编译好的程序是64位的,而我们的系统是32位的,那我们就不得不重新编译了(注:最新版本的liblinear1.96就是64位的)。编译方法:a)打开dos命令行窗口,定位到liblinear目录下。如果VC++的环境变量还没设置,敲入以下命令来实现: "C:\Program Files\Microsoft VisualStudio 10.0\VC\bin\vcvars32.bat" (根据具体的安装路径调整命令);b)输入nmake -f Makefile.win clean all。方法来源http://blog.csdn.net/zouxy09/article/details/10947323

编译好了exe程序,再确保你明白了一些机器学习的基础名词,然后我们可以开始了。

(2)训练阶段。例子中的训练是利用windows文件夹下的svm-train.exe,训练一个分类器。可以把这个exe看做一个函数,输入是我们标记好类别的特征文件,输出就是分类器模型文件。请用记事本打开libsvm根目录下的heart_scale文件,如果你阅读了SVM Tutorial,下面的东西应该很熟悉了。

我们仔细看看,这个文件是这样的结构 :

"+1”或"-1”  1:一个数   2:一个数   3:一个数 … 13:一个数

有些时候,1~13之间会有几个数没有,比如第一个轮回:

+1 1:0.708333 2:1 3:1 4:-0.320755 5:-0.105023 6:-1 7:1 8:-0.419847 9:-1 10:-0.225806 12:1 13:-1

它没有11:一个数,这等价于11后面的数是0,即11:0。之所以这样是为了让稀疏的特征少占点空间。

从这个例子出发,我们可以更好地理解特征文件的结构:

[label] [index1]:[value1] [index2]:[value2] …

[label] [index1]:[value1] [index2]:[value2] …

Label 就是说class(属于哪一类,刚才的+1或-1), 就是你要分类的种类,通常是一些整数。

index 是有順序的索引,通常是连续的整数。就是指特征编号(刚才的1~13),必须按照升序排列

value 就是特征值(刚才的冒号后面的小数),用来 train 的数据。

训练前我们要做的无非是选一个好特征,然后把特征按格式写好。

(3)训练。比较简便的做法是写一个bat来调用exe(因为我们要输入一些参数)。进入windows文件夹,新建一个txt,在txt里写如下内容:

svm-train.exe  ../heart_scale  ../heart_scale_model

pause

保存关闭txt后把txt后缀名改为bat,双击就可以使用了。

由于bat用的人不多,这里啰嗦一下它的意义。 第一行svm-train.exe是调用本目录(bat所在目录)下的svm-train.exe, ‘../’代表本目录的上级目录,heart_scale就是刚才看的那个乱糟糟的特征文件,’../heart_ scale _model’就是输出到上级目录的heart_scale_model文件,最后第二行的pause是运行完svm-train.exe,命令行暂停(没有这个命令的话,命令行会一闪而逝,很多东西就看不见鸟)。

至于为什么格式是svm-train.exe  +  特征文件 + 保存文件, 请阅读SVM Tutorial

(4)预测。和训练类似,我们也是写一个bat,不过此时的内容改为:

svm-predict.exe  ../heart_scale  ../heart_scale_model ../heart_scale_model_rst

pause

这个bat就是用刚才的 model,预测heart_scale,并将结果输入到heart_scale_model_rst。你发现了,我们用的是heart_sacle训练的模型,再用模型检测它自己,理论上结果应该棒棒哒,不过看一下命令行,预测程序给出的Accuracy = 86.6667% (234/270)。同时,更具体的输出结果保存为heart_scale_model_rst,用记事本打开可以看到每一行有一个数,这个数代表了预测的类别。顺便一提,这里我们预测heart_scale,就是用heart_scale里每一个样本的特征带入model,得到的预测结果heart_scale_model_rst和heart_sacle里特征对应的label作比较,看是否一致。

总结一下,libSVM的训练其实就是,搜集样本->标记label->提取特征->写特征文件->调用train.exe->得到model,这个model可以用来判断新的未知label的特征到底应该属于哪一个label。

最后,这个分类效果并不理想,至于原因和解决方法我们之后再说。

posted @ 2015-01-20 19:56  静·夜思  阅读(5427)  评论(0编辑  收藏  举报