Libsvm在windows下使用细节汇总

0.下载Libsvm

Libsvm官网 https://www.csie.ntu.edu.tw/~cjlin/libsvm/
下载后将其解压到本地,这里,我的本地路径为:
C: \Anaconda3\Lib\sit-packages\libsvm

1.准备数据

  • 一种方法是通过svm_read_peoblem方法直接读取libsvm格式的文件,返回分类 标签([ ])和数据([[ ]])。如:labels, datas = svm_read_problem(‘filename’)
  • 另一种方法是直接使用python的格式的,这种方法适用于在程序执行过程中动态产生的data。分为两种:一种是特征值连续的不用手动表明各个属性值的index,例如labels,datas = [1,-1], [[1,2,3],[-1,-2,–3]],还有一种是带index的,适合处理那些数据比较稀疏的,即好多特征值没有,label, datas = [{1:1, 3:1}, {1:-1, 3:-1}]

2. 通过训练集training得到模型

使用svm_train方法,传入labels, datas必要的参数,返回model.也有两种方案:

  • 直接调用model = svm_train(label, data, ‘-h 0’),将必要的参数’-h 0’传入。
  • 先labels和datas作为一个整体prob传入,整体构成用过**svm_problem(labels, datas)得到,再调用svm_train(prob, param)训练得到model,这里的param可以直接以’-h -0’字符串形式,也可以通过param=svm_parameter(‘-c 4 –b 1’)**得到。

3. 利用model进行预测

这里的model可以是上一步返回的model,或者从外部文件导入的model,预测的方法是svm_predict(testClassfier, testSeqVector,model),参数集分别是测试集实际labels,测试数据特征向量,训练模型,当然还有一个可选的参数就是predict的是否需要评估概率的参数-b 0 or 1, 默认为0.例如p_label, p_acc, p_val = svm_predict(y, x, m, ‘-b 1’),这里返回了3个值,分别是预测的label列表([]),准确率p_acc()用于分类的准确率,回归的mean-squared erro 和squared correlation coefficient.

4. 常用接口

  • svm_train() # train a mdoel 训练
  • svm_predict() # predict testing data 预测
  • svm_read_problem() #read the data from a LIBSVM-format file 读取libsvm格式数据
  • svm_load_model() #load a LIBSVM model
  • svm_save_model #save model to a file
  • evaluations() #evaluate prediction results

Function: avm_train #三种训练写法
There are three ways to call svm_train()

  • model = svm_train(y, x, [‘training_options’])
  • model = svm_train(prob, [‘training_options’])
  • model = svm_train(prob, param)

5. 有关参数的设置(可查看read me 文件夹中说明)

Usage; svm-train[options] training_set_file[model_file]
options:

  • -s svm_type : set type of SVM (default 0) #选择哪一种svm
    0 :C-SVC(multi-class classification):使用乘法因子(cost)的处理噪声的多分类器
    1 :nu-SVC (multi-class classification):按照错误样本比例处理噪声的多分类器
    2 :one-class SVM:一类支持向量机
    3:epsilon-SVC(regression)epsilon-支持向量回归
    4 :nu-SVC (multi-regression)

  • -t kernel_type: set type of kernel function(default 2) #核函数类型
    0 – linear : u’v 线性核
    1 – polynomial: (gamma
    uv +coef0)^degree 多项式核
    2 – radial basis function : exp(-gamma
    |u-v|^2) RBF 径向基核/高斯核
    3 – sigmoid: tanh(gamma*u’*v +coef0) S型核
    4 – precomputed kernel (kernel values in training_set_file) 预计算核

  • -d degree : set degree in kernel function (default 3)

  • -g gamma : set gamma in kernel function (default 1/ num_features)

  • - r coef0 :set coef0 in kernel function (default 0)

  • -c cost: set the parameter C of C-SVC, epsilon-SVR, and nu-SVR(default 1)

  • -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR(default 0.5)

  • -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)

  • -m cachesize : set cache memory size in MB (default 100)调整内缓冲区大小以MB为单位

  • -e epasilon : set tolerance of termination criterion (default 0.001)

  • -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)是否使用收缩启发式算法

  • -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1(default 1)是否估算正确概率,取值为0或者-1

  • -wi weight : set the parameter C of class i to weight*C for C-SVC (default 1) 调整C-SVC中第i个特征的Cost参数

  • v n : n-fold cross validation mode 交叉验证

  • q : quiet mode (no outputs) 静默模式

6.提高预测的准确率

通过一定的过程,可以提高预测的准确率

  • 转换数据为libsvm可用形式
  • 进行一个简单的尺度变化
  • 利用RBF kernel, 利用cross-validation来查找最佳的参数C和r
  • 利用最佳参数C和r,来训练整个数据集
  • 测试

7. 参数及返回值的含义

  • y 训练数据的标签
  • x 训练数据的输入向量
  • yt 测试数据的标签
  • xt 测试数据的输入向量
  • m 训练好的SVM模型
  • p_label 存储预测标签的列表
  • p_acc 存储了预测的精确度,均值和回归的平均相关系数
  • p_vals 在制定参数时返回判定系数(判定的可靠程度)

8. LIBSVM使用流程

1) 按照LIBSVM软件包所要求的格式准备数据集;LIBSVM的数据格式为: Label 1:value 2:value … Label为标签,1 2 3为第几个特征,value是对应的特征值,数据之间用空格隔开,当特征值为0时, 可以省略(即序号可以不连续,默认0)。生成libsvm所用的数据格式,一种方法是FormatDataLibsvm.xls, 第二种方法是.txt文件转换。
2) 对数据进行简单的缩放操作;
3) 考虑选用RBF 核函数 ;
4) 采用交叉验证选择最佳参数C与g ;
5) 采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;
6) 利用获取的模型进行测试与预测。

9. 如何根据实际问题选用模型

{C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR}

  • C_SVC: C代表惩罚因子,C越大表示对错误分类的惩罚越大
  • NU_SVC: 和C_SVC相同
  • ONE_CLASS: 不需要类标号,用于支持向量的密度估计和聚类
  • EPSILON_SVR:不敏感损失函数,对于样本点来说,存在着一个不为目标函数提供任何损失值得区域,即-带
  • NU_SVR: 由于EPSILON_SVR需要事先确定参数,然而在某些情况下选择合适的参数不是一件容易的事情,而NU_SVR能够自动计算参数。
    **注意:**C_SVC和NU_SVC其实采用的模型相同,但是它们的参数C的范围不同,C_SVC采用的是0到正无穷,NU_SVC是[0,1]

10. 如何选择核函数及惩罚因子C和核参数

{LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED}
即:线性、多项式、径向基、神经元的非线性作用函数、用户自定义
我们需要先选出首选的核函数,然后选择惩罚因子C和核参数。

  • 建议一般使用RBF核函数,因为其有良好的性质。这个核函数将样本非线性地映射到一个更高维的空间,与线性核不同,它能够处理分类标注和属性的非线性关系。并且,线性核是RBF的一个特例(Keerthi and Lin 2003),因此,使用一个惩罚因子C的线性核与某些参数(C,γ)的RBF核具有相同的性能。同时,Sigmoid核的表现很像一定参数的RBF核(Lin and Link 2003)。
    第二个原因,超参数(hyperparameter)的数量会影响到模型选择的复杂度(因为参数只能靠试验呀!)。多项式核比RBF核有更多的超参数。
    最后,RBF核有更少的数值复杂度(numerical difficulties)
  • 不适用RBF核的情形,例如特征维度非常大的时候,只能选用线性核。

11. 寻优

使用pythonGnuplot来对参数进行寻优(网格搜索法Grid-Search)

  • 用网格搜索法寻找最优化参数c和g,网络搜索法的基本原理是让c和g在一定范围内划分网格并遍历网格内所有的店进行取值,对于选取的c和g,利用交叉验证法获得在此组(c,g)下训练集验证预测准确率,最终取得训练集验证预测准确率最高的那组(c,g)作为最佳的参数。
  • 选择大的搜索区间和搜索步长,并以指数形式增长顺序的C和g来训练,逐步缩小搜索的范围和步长进行fine grid search(小范围的搜索),选择k-折交叉验证检验参数,同时得到的交叉验证精确度是被正确预测数据的百分比,得到最佳参数对。
    Grid.py具体操作:
    1)下载gunplot
    2)使用grid.py,找到该py,用Spyder打开,修改class GridOption下else中svm-train.exe及pgnuplot.exe路径,保存
    3) 运行cmd,用cd定位到Anaconda3\Lib\site-packages\libsvm\tools
    4) 输入命令grid.py 空格 文件名
    5) 找最后一行数字例如2048.0 0.0001220703125 84.0741 含义是C=2048.0, =0.0001220703125,交叉验证精度为84.0741%

12. 对数据进行归一化

  • SVM-SCALE
    1)windows+R
    2)cmd进行命令窗口
    3)将当前路径定位到SVM-SCALE : cd Anaconda3\Lib\site-packages\libsvm\windows
    4)将需要进行归一化处理的文档copy到该目录下
    5) 以fun.csv.txt为例svm-scale fun.csv.txt > fun.csv.scale.txt
  • 调用MATLAB中的premnmx进行归一化,预测结果用postmnmxp(x1, min(x),max(x))进行反归一化操作。
  • 手动归一化
  • 归一化到N(0,1)
    注意: 建议将训练数据集与测试数据集放在同一个文本文件中一起归一化,然后再将归一化结果分成训练集和测试集。

13. 多分类算法有哪些可以用

SVM适用于二分类问题,若遇到多分类问题,需要采用多分类算法。

  • 一对余支持向量机(1-v-R),对于k分类问题,需要构造k个
    描述:对于第i类样本,首先标记都为正类,将其余k-1类的样本标记为负类,通过训练得到对滴i个SVM分类器,而对待测样本进行分类时,带入所有k个分类器,选取函数输出值最大的类别作为新样本的类别。
  • 一对一支持向量机(1-v-1),对于k分类问题,需要构造k(k-1)/2个分类器。
    描述:每两类之间构造SVM分类器,在判别待测样本的所属类别时,需要将该样本点依次通过每个分类器进行分类,最后统计各个类别的“得票数”,并将该样本点归于得票数最高的那个类别。
  • 有向无环图SVM算法
  • 支持向量机决策树
  • 多支持向量机分类器

14. LIBSVM提供的几个工具包

  • svm-scale:能够放缩输入数据的工具
  • grid.py: 放缩后的数据进行最优参数选择
  • subset.py:自动选择子集减少训练量
  • checkdata.py:检查是否符合LIBSVM格式

15. svmscale的用法

vmscale是用来对原始样本进行缩放的,范围可以自己定,一般是[0,1]或[-1,1]。缩放的目的主要是
1)防止某个特征过大或过小,从而在训练中起的作用不平衡;
2)为了计算速度。因为在核计算中,会用到内积运算或exp运算,不平衡的数据可能造成计算困难。
用法: svmscale [-l lower] [-u upper]
[-y y_lower y_upper]
[-s save_filename]
[-r restore_filename] 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),这时,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来载入。

16.easy.py的用法

注意: easy.py与先grid.py再输入代码结果相同
文件easy.py对样本文件做了“一条龙服务”,从参数优选,到文件预测,因此,其对grid.py、svm-train、svm-scale和svm-predict都进行了调用,因此,运行时需要保证这些文件的路径都要正确,还要样本文件和预测文件
1) 打开easy.py,修改几个路径 #example for windows(已修改)
2) 运行cmd, 使用cd,定位到easy.py的路径 cd Anaconda3\Lib\site-packages\libsvm\tools
3) 输入命令 easy.py空格+训练集+空格+测试集

17.一些使用方法说明

  • cd 进入到当前盘某个目录。
  • *cd * 进入当前盘根目录
  • cd \windows 进入到当前盘Windows目录
  • cd… 退出到上一级目录
    注意: 进入含有特殊字符目录时需要加引号 例如 cd"c:\program files"

你可能感兴趣的:(API使用)