1.LIBSVM 是支持向量机svm的库,支持不同版本,这里选用python接口。
在libsvm-3.22的python文件夹下主要包括了两个文件svm.py和svmutil.py。
svmutil.py接口主要包括了high-level的函数,这些函数的使用和LIBSVM的MATLAB接口大体类似。
svmutil中主要包含了以下几个函数:
svm_train() : 训练svm模型,接受特定的输入才能产生模型,才能对模型进行预测
svm_predict(): 依照已经 train 好的 model, 再加上给定的输入 ( 新值 ), 输出 predict ( 预测 ) 新值所对应的类别 (class)
svm_read_problem() : 从libsvm格式的文件读取数据
svmscale:重新调整数据,因为原始数据可能范围过大或者过小,svmscale可以将数据重新缩放到适当范围,方便使用稀疏矩阵
svm_load_model() : 加载libsvm模型
svm_save_model(): 保存模型到文件中
evaluations() : 评估预测结果
svm.py接口主要包括了一些low-level的应用。在svm.py中采用了python内置的ctypes库,由此python可以直接访问svm.h中定义的C结构和接口函数。svm.py主要运用了四个数据结构svm_node, svm_problem, svm_parameter和svm_model。
2. 使用LIBSVM的一般步骤:
1)按照LIBSVM软件包所要求的格式准备数据集;
2)对数据进行简单的缩放操作;
3)首要考虑选用RBF 核函数;
4)采用交叉验证选择最佳参数C与g ;
5)采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;
6)利用获取的模型进行测试与预测。
3.1 libsvm的数据格式:
[label] [index1]:[value1] [index2]:[value2] ... E:+1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1
[类别编号][特征1][特征值][特征2][特征值]...
label(class)要分类的种类,一般为整数,可以自己随意定,但如果是回归的话就要实事求是
index:有顺序的索引,通常是连续的整数,若value为0,序号可以不连续
value:要训练的数据,从分类的角度说就是特征值
不同数据之间用空格隔开。
3.2对数据进行简单的缩放操作
svmscale是用来对原始样本进行缩放的, 因为原始数据可能范围过大或过小,缩放到适当范围使训练与预测速度更快,范围可以自己定, 一般是[0,1]或[-1,1].
用法: svmscale [-l lower] [-u upper] [-l 数据下限值] [-u 数据上限值]
[-y y_lower y_upper] [-y 缩放的下限值 缩放的上限值]
[-s save_filename] [-s 将缩放的规则保存的文件名]
[-r restore_filename] filename [-r 将已经存在的规则文件名restore_filename进行缩放] [要缩放的文件名]
其中, []中都是可选项:
-l: 设定数据下限; lower: 设定的数据下限值, 缺省为-1
-u: 设定数据上限; upper: 设定的数据上限值, 缺省为1
-y: 是否对目标值同时进行缩放; y_lower为下限值, y_upper为上限值;
-s save_filename: 表示将缩放的规则保存为文件save_filename;
-r restore_filename: 表示将按照已经存在的规则文件restore_filename进行缩放;
filename: 待缩放的数据文件, 文件格式按照libsvm格式.
默认情况下, 只需要输入要缩放的文件名就可以了: 比如(已经存在的文件为test.txt)
svmscale test.txt
这时, test.txt中的数据已经变成[-1,1]之间的数据了. 但是, 这样原来的数据就被覆盖了, 为了让规划好的数据另存为其他的文件, 我们用一dos的重定向符>来另存为(假设为out.txt):
svmscale test.txt > out.txt
运行后, 我们就可以看到目录下多了一个out.txt文件, 那就是规范后的数据. 假如, 我们想设定数据范围[0,1], 并把规则保存为test.range文件:
svmscale –l 0 –u 1 –s test.range test.txt > out.txt
这时, 目录下又多了一个test.range文件, 可以用记事本打开, 下次就可以用-r test.range来载入了.
3.3考虑选用RBF核函数
svmtrain主要实现对训练数据集的训练, 并可以获得SVM模型
用法: svmtrain [options] training_set_file [model_file]
其中, options为操作参数, 可用的选项即表示的涵义如下所示:
-s 设置svm类型:
0 – C-SVC
1 – v-SVC
2 – one-class-SVM
3 – ε-SVR
4 – n – SVR
-t 设置核函数类型, 默认值为2
0 — 线性核: u'*v
1 — 多项式核: (γ∗μ‘∗ν+coef0)degree
2 — RBF核: exp(–γ∗∥μ−ν∥2)exp(–γ∗∥μ−ν∥2)
3 — sigmoid 核: tanh(γ∗μ‘∗ν+coef0)
-d degree: 核函数中的degree设置(针对多项式核函数)(默认3);
-g r(gama): 核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k);
-r coef0: 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0);
-c cost: 设置C-SVC, e -SVR和v-SVR的参数(损失函数)(默认1);
-n nu: 设置v-SVC, 一类SVM和v- SVR的参数(默认0.5);
-p p: 设置e -SVR 中损失函数p的值(默认0.1);
-m cachesize: 设置cache内存大小, 以MB为单位(默认40);
-e eps: 设置允许的终止判据(默认0.001);
-h shrinking: 是否使用启发式, 0或1(默认1);
-wi weight: 设置第几类的参数C为weight*C (C-SVC中的C) (默认1);
-v n: n-折交叉验证模式, n为fold的个数, 必须大于等于2;
-b 概率估计: 是否计算SVC或SVR的概率估计, 可选值0或1, 默认0;
model_file: 可选项, 为要保存的结果文件, 称为模型文件, 以便在预测时使用.
其中-g选项中的k是指输入数据中的属性数. option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差. 以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合, 如果设置的参数在函数或SVM类型中没有也不会产生影响, 程序不会接受该参数; 如果应有的参数设置不正确, 参数将采用默认值.
training_set_file是要进行训练的数据集; model_file是训练结束后产生的模型文件, 文件中包括支持向量样本数, 支持向量样本以及lagrange系数等必须的参数; 该参数如果不设置将采用默认的文件名, 也可以设置成自己惯用的文件名.
默认情况下, 只需要给函数提供一个样本文件名就可以了, 但为了能保存结果, 还是要提供一个结果文件名, 比如: test.model, 则命令为:
svmtrain test.txt test.model
使用libsvm里面自带的数据,在libtest.py中创建如下代码:
>>> import os
>>> os.chdir('D:\libsvm-3.22\python')
>>> import sys
>>> sys.path.append('D:\libsvm-3.22\python')如果不加这句话会出现ImportError: No module named svmutil 的错误,因为在引入一个module模块时要将路径导入到sys.path中,sys.path是python的搜索模块的路径集,是一个list,在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失了。
>>> from svmutil import *
>>> y,x=svm_read_problem('../heart_scale')读取libsvm数据存入y (label),x(训练样本)中
>>> m=svm_train(y[:200],x[:200],'-c 4')使用前200个数据进行训练,svm_train返回的是model类
>>> p_label,p_acc,p_val=svm_predict(y[200:],x[200:],m)利用后70个数据用来做训练数据(即200个数据以后的数据)
Accuracy = 84.2857% (59/70) (classification)
nu = 0.351161 nu与前面的操作参数-n nu 相同,设置v-SVC, 一类SVM和v- SVR的参数
obj = -225.628984, rho = 0.636110 obj为SVM文件转换为的二次规划求解得到的最小值,rho 为判决函数的常数项b
nSV = 91, nBSV = 49 nSV 为支持向量个数,nBSV为边界上的支持向量个数
Total nSV = 9 Total nSV为支持向量总个数
grid.py使用方法
设我们要对目录D:\libsvm-3.22下的样本文件heart_scale做优选,其具体用法为:
第一步:打开D:\libsvm-3.22下的tools文件夹,找到grid.py文件,将其拷贝到D:\libsvm-3.22\windows下。用python打开(不能双击,而要右键选择“Edit with IDLE”),修改svmtrain_exe和gnuplot_exe的路径。
svmtrain_exe = r"D:\libsvm-3.22\windows\svm-train.exe"
gnuplot_exe = r"D:\libsvm-3.22\tools\pgnuplot.exe"
(注:这里面还有一个是对非win32的,可以不用改,只改#example for windows下的两行就可以)
第二步:运行cmd,进入dos环境,定位到D:\libsvm-3.22\windows文件夹,这里是放置grid.py的地方。
第三步:输入以下命令:
python grid.py heart_scale
(注:还要把数据文件heart_scale放置到D:\libsvm-3.22\windows下面啊)
你就会看到dos窗口中飞速乱串的[local]数据,以及一个gnuplot的动态绘图窗口。大约过10秒钟,就会停止。Dos窗口中的[local]数据时局部最优值,这个不用管,直接看最后一行:
2048.0 0.0001220703125 84.0741
其意义表示:C = 2048.0;γ=0.0001220703125,交叉验证精度CV Rate = 84.0741%,这就是最优结果。
不过在这里遇到一个奇怪的问题,现在还没有解决,问题是:grid.py的gnuplot_exe = r"D:\libsvm-3.22\tools\gnuplot.exe"和文件名nuplot.exe保持一致的话,运行结果会出现图像,并要求安装,但事实上已经安装过了,居然还要重新安装,而且结果不显示最后一行,像是意外中断一样,如果grid.py的gnuplot_exe = r"D:\libsvm-3.22\tools\pgnuplot.exe",运行结果不显示图像,并出现gnuplot executable not found提示,但是最后一行结果正常显示,不知道到底什么原因。
(后来终于发现了问题所在,在下载gnuplot的时候我下载的是.exe文件,但其实应该下载个压缩包,这就是为什么可以运行出结果却不显示图像的原因,哈哈,经历了两天终于发现了问题,这种感觉真的有点nice~)
第四步:打开目录D:\libsvm-3.22\windows,我们可以看到新生成了两个文件:heart_scale.out和heart_scale.png,第一个文件就是搜索过程中的[local]和最优数据,第二文件就是gnuplot图像。
easy.py的使用方法:
1.打开easy.py,修改#example for windows下的几个路径,改为自己系统的相应路径
2.运行cmd,进行dos环境,定位到防止easy.py的目录D:\libsvm-3.22\tools
3.输入命令:python easy.py heart_scale heart_test
就会看到一个gnuplot的动态绘图窗口。大约20s以后停止,然后在D:\libsvm-3.22\tools下你会看到又多了7个文件,都是以前我们碰到的过程文件。
遇到的问题:在PyCharm上通过libtest.py选择最优参数,提高预测的准确率,出现“No module named 'grid'”的错误,而在idle上可以正常运行,解决方法如下:
打开PyCharm,选择file-settings-project-project interpreter,点击show All,然后添加你自己在系统中安装的pythone.exe,点击apply即可。
获取到pip支持的文件名还有版本import pip; import pip._internal; print(pip._internal.pep425tags.get_supported())