Libsvm学习笔记

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)

#iter = 257                                   #iter  迭代次数
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_exegnuplot_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.outheart_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())









  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值