本文讲使用台湾大学林智仁(Lin Chih-Jen)教授等开发设计开发设计的一个简单、易用的SVM模式识别与回归的软件包,本文将使用svmlib在python下的版本对其使用方法进行总结:
libsvm下载地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
通过上一篇博文转载了python下载libsvm的教程,在python32位环境下使用libsvm
libsvm在python版本提供了两个模块,svmutil.py为高层次版本,svm.py为低层次版本
在低层次版本svm.py中,没有对python内置库ctypes类型进行封装,而svmutil.py则提供了简单易用的函数可以直接使用
libsvm使用的步骤为:
1)将数据转化为libsvm工具使用的格式,
: : ..... :
......................
label可以为int或double类型
2)进行数据变化,常用的数据变化为归一化,同时将training data 和 test data通过放缩在[-1,1]区间
【待定】
3)选择核函数:优先考虑使用RBF核函数
4)用cross-validation(交叉验证)和grid-search得到最优的c和g
方法一:cross-validation(交叉验证):
m = svm_train(y, x, '-v 2')
如果option参数-v为确切值,则svm_train返回model为一个数值,如果是svm分类则返回交叉验证的准确率,-v 的值要大于等于2,一般选用5.若为svm回归则返回结果与真实值的差异值平均方差
方法二:grid-search:
libsvm提供了几个小工具包,其中包括了tools中的grid.py,能够快速选择最优参数c和g
$ python grid.py svmguide1.scale
2.0 2.0 96.8922
(Best C=2.0, γ=2.0 with five-fold cross-validation rate=96.8922%)
5)使用最优参数C和g去训练training set
6)测试:
在svmutil.py,可使用函数svm_predict获得分类准确率
p_label, p_acc, p_val = svm_predict(y, , m)
#p_labels: a list of predicted labels,预测类别
#p_acc: a tuple including accuracy (for classification), mean squared error, and squared correlation coefficient (forregression),准确率,误差的均方差,和相关系数平方
#p_val:a list of decision values or probability estimates
下面介绍一下livsvm在python中的具体使用方法:
主要介绍svmutil.py函数使用
>>>from svmutil import *
#读取LIBSVM数据,分别存入y,x列表,其中y为类别,x为训练样本
>>>y, x = svm_read_problem(r'E:\Projects\Python\svmlib\heart_scale')
#使用前200个数据进行训练,svm_train返回的是model类,表示通过训练产生的model
>>>m = svm_train(y[:200], x[:200], '-c 4' )
#使用后70个数据对训练的model m进行检验
>>>p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)
#能够将训练产生的model保留成为文件
>>> svm_save_model('heart_scale.model', m)
#读取保存的model
>>> m = svm_load_model('heart_scale.model')
>>> p_label, p_acc, p_val = svm_predict(y, x, m, '-b 1')
#得到训练检验结果
>>> ACC, MSE, SCC = evaluations(y, p_label)
svmtuil.py中含有下列主要函数
svm_train() : 训练SVM模型
svm_predict() : 预测测试数据结果
svm_read_problem() : 读取数据.
svm_load_model() : 加载SVM模型
svm_save_model() :保存SVM模型.
evaluations() : 检验预测结果.
还有下列函数
svm_problem(y, x):返回一个problem类,作用等同于记录y,x列表
svm_parameter('training_options'):返回一个parameter类,作用是记录参数选择
下面介绍下使用过程中涉及到的一些参数函数:
Options:可用的选项即表示的涵义如下
-s svm类型:SVM设置类型(默认0)
0 -- C-SVC
1 -- v-SVC
2–一类SVM
3 -- e -SVR
4 -- v-SVR
-t 核函数类型:核函数设置类型(默认2)
0–线性:u'v
1–多项式:(r*u'v + coef0)^degree
2–RBF函数:exp(-gamma|u-v|^2)
3–sigmoid:tanh(r*u'v + 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-fold交互检验模式,n为fold的个数,必须大于等于2
其中-g选项中的k是指输入数据中的属性数。option -v随机地将数据剖分为n部
1)如果你要输出类的概率,一定要有-b参数
2)C一般可以选择为:10^t , t=- 4..4就是0.0001到10000
选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合
在LIBSVM中-t用来指定核函数类型(默认值是2)。
3)与核函数相对应的libsvm参数:
(1)对于线性核函数,没有专门需要设置的参数
(2))对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
(3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
(4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
运行结果中显示的几个参数含义为:
rho 为判决函数的常数项b#iter为迭代次数,nu 与前面的操作参数-n n 相同,obj为SVM文件转换为的二次规划求解得到的最小值,nSV 为支持向量个数,nBSV为边界上的支持向量个数,Total nSV为支持向量总个数。
下面介绍下LIBSVM提供的几个工具包
svm-scale:
这是能够放缩输入数据的工具
grid.py:
放缩后的数据进行最优参数选择
subset.py
自动选择子集减少训练量
checkdata.py
检查是否符合LIBSVM格式