libsvm学习——windows环境下libsvm-3.23在Python的安装过程
一.libsvm简介
libsvm是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归。由于libsvm程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。
libsvm包含的内容:
(1)java文件夹 ,主要应用于java平台;
(2)python文件夹,是用来参数优选的工具;
(3)tools文件夹,主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy), 数据检查(checkdata);
(4)windows文件夹 , 包含libsvm四个exe程序包,我们所用的库就是他们,里面还有个heart_scale,是一个样本文件,可以用记事本打开,用来测试用的;
(5)svm-toy文件,一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows文件夹下;
(6)heart_scale文件,是测试用的训练文件;
(7)其他.h和.cpp文件都是程序的源码,可以编译出相应的.exe文件。其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数,编译后就是windows下相应的四个exe程序。另外,里面的 README 跟 FAQ 是很好的帮助文件。
二.下载libsvm和gnuplot
1.libsvm(3.23)下载地址:https://www.csie.ntu.edu.tw/~cjlin/libsvm/
下载完成后解压缩得到如下文件:我的路径是D:\libsvm-3.23
2.对libsvm.dll进行适配处理
首先确定本机的python版本,我的python是64位
打开Visual Studio x64 Win64 Command Prompt(2010),输入如下代码:
cd D:\libsvm-3.23
nmake -f Makefile.win clean all
将新生成的D:\libsvm-3.23\windows下的libsvm.dll拷贝到C:\windows\system32目录下。
3.配置path环境变量
将解压的libsvm文件夹下的tools和windows所在的路径D:\libsvm-3.23\tools和D:\libsvm-3.23\windows添加到path的环境变量中。
4.下载并安装gnuplot
gnuplot下载地址:https://sourceforge.net/projects/gnuplot/
下载完成如下图所示,根据提示即可完成安装
gnuplot下载及基本使用,参见https://blog.****.net/weixin_42014622/article/details/82962634
5.修改easy.py和grid.py
打开D:\libsvm-3.23\tools,找到grid.py文件,用记事本打开,修改svm-train.exe和gnuplot.exe的路径
6.验证能否使用libsvm
在cmd中输入python,打开python命令行, 输入如下代码:
>>>import os
>>>os.chdir('D:\libsvm-3.23\python')
>>>from svmutil import *
>>>y, x = svm_read_problem('D:\libsvm-3.23\heart_scale')
>>>m = svm_train(y[:200], x[:200], '-c 4')
>>>p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)
会计算出一个准确率数值,这时你的libsvm就安装成功了!
7.grid.py参数优化
运行cmd,进入dos环境,定位到D:\libsvm-3.23\tools文件夹,输入:
python grid.py heart_scale
会看到dos窗口中飞速乱串的[local]数据,以及一个gnuplot的动态绘图窗口,如下图所示:
大约过10秒钟,就会停止,直接看最后一行:
其意义表示:C = 2048.0;γ=0.0001220703125;交叉验证精度CV Rate = 84.0741%,这就是最优结果。
然后,打开目录D:\libsvm-3.23\tools,我们可以看到新生成了两个文件:heart_scale.out和heart_scale.png,第一个文件就是搜索过程中的[local]和最优数据,第二个文件就是gnuplot图像。
现在grid.py已经运行完了,可以把最优参数输入到svm-train中进行训练了。定位到D:\libsvm-3.23下,输入:
svm-train -c 2048.0 -g 0.0001220703125 heart_scale trainagain1.model
其中-c和-g就是优化后的参数。
优化之前的结果如下:
可以看出,迭代次数从162次上升到了1046次,边界上的支持向量个数从107下降到了91,说明在优化以前边界向量有10多个错误分类,同时,总支持向量个数从132减到了103。
其中,
#iter为迭代次数,nu 是你选择的核函数类型的参数,obj为SVM文件转换为的二次规划求解得到的最小值,rho为判决函数的偏置项b,nSV 为标准支持向量个数(0<a<c),nBSV为边界上的支持向量个数(a=c),Total nSV为支持向量总个数(对于两类来说,因为只有一个分类模型Total nSV = nSV,但是对于多类,这个是各个分类模型的nSV之和)。