一、LIBSVM软件包的下载及配置
首先,在该网站下载相应的LIBSVM压缩包文件:https://www.csie.ntu.edu.tw/~cjlin/libsvm/
下载解压后,将该文件复制到对应的python环境下的 .../Lib/site-packages/ 目录下。然后,在目录libsvm和目录libsvm/python/下,新建一个空文件,命名为 __init__.py。
此时,在python环境下,已经可以调用libsvm库里面相关的函数功能。
二、libsvm的使用
相关功能的使用非常简单,只要将数据的格式转成其要求的固定格式,直接调用相关的接口即可。
下面给出一些代码例子:
from libsvm.python.svmutil import *
y, x = [1,-1], [{1:1, 2:1}, {1:-1,2:-1}] # 输入的数据
options = '-t 0 -c 4 -b 1' # 训练参数设置
model = svm_train(y,x,options) # 进行训练
yt = [1]
xt = [{1:1, 2:1}]
p_label, p_acc, p_val = svm_predict(yt, xt, model) # 使用得到的模型进行预测
print(p_label)
首先对于输入数据的格式进行解释说明:
y: 输入的数据样本对应的标签
x: 输入的样本的属性值,其中每一个样本的格式是一个字典类型,键值对中键是一个索引值,值是对应的数据属性值
options: 训练的一些参数设置,主要有以下的一些设置
-s
SVM的类型(svm_type)
0 -- C-SVC(默认) 使用惩罚因子(Cost)的处理噪声的多分类器
1 -- nu-SVC(多分类器) 按照错误样本比例处理噪声的多分类器
2 -- one-class SVM 一类支持向量机,可参见"SVDD"的相关内容
3 -- epsilon-SVR(回归) epsilon支持向量回归 (也就是使用 E-不敏感损失函数进行回归)
4 -- nu-SVR(回归)
-t
核函数类型(kernel_type)
0 -- linear(线性核): u'*v
1 -- polynomial(多项式核): (gamma*u'*v + coef0)^degree
2 -- radial basis function(RBF,径向基核/高斯核): exp(-gamma*|u-v|^2)
3 -- sigmoid(S型核): tanh(gamma*u'*v + coef0)
4 -- precomputed kernel(预计算核): 核矩阵存储在training_set_file
中
下面是调整SVM或核函数中参数的选项:
-d
调整核函数的degree参数,默认为3
-g
调整核函数的gamma参数,默认为1/num_features
-r
调整核函数的coef0参数,默认为0
-c
调整C-SVC, epsilon-SVR 和 nu-SVR中的Cost参数,默认为1(就是优化问题中的那个C)
-n
调整nu-SVC, one-class SVM 和 nu-SVR中的错误率nu参数,默认为0.5
-p
调整epsilon-SVR的loss function中的epsilon参数,默认0.1
-m
调整内缓冲区大小,以MB为单位,默认100
-e
调整终止判据,默认0.001
-wi
调整C-SVC中第i个特征的Cost参数
调整算法功能的选项:
-b
是否估算正确概率,取值0 - 1,默认为0
-h
是否使用收缩启发式算法(shrinking heuristics),取值0 - 1,默认为0
-v
交叉校验
-q
静默模式
其次,libsvm还可以通过读入文件进行训练预测,并可以保存和导入相应的模型,如下代码示例所示:
from libsvm.python.svmutil import *
from libsvm.python.svm import *
y, x = svm_read_problem('train1.txt') # 读入训练数据
yt, xt = svm_read_problem('test1.txt') # 读入测试数据
options = '-t 0'
model = svm_train(y, x ,options) # 训练
svm_save_model('model_file', model) # 保存训练的模型
model_ = svm_load_model('model_file') # 根据保存的模型的名字导入训练所得到的模型
p_labs, p_acc, p_vals = svm_predict(y, x, model [,'predicting_options']) # 进行预测
读入数据文件的格式应该符合格式的要求,可以参考该网址文件的格式:https://www.csie.ntu.edu.tw/~cjlin/papers/guide/data/
接下来介绍一下训练得到的模型里面的内容:
svm_type c_svc # svm类型
kernel_type linear # 核函数类型
nr_class 2 # 类别数量
total_sv 16 # 总共的支持向量个数
rho 1.1789020076394081 # 决策函数中的常数项的相反数 -b
label 1 -1 # 类别对应的标签
probA 2.0363482382399485 # 该参数是用于概率估计的,不做详细介绍
probB -0.17262694040752455
nr_sv 8 8 # 每个类别的支持向量个数
SV # 所有的支持向量
1 1:0.697 2:0.46 # 第一列是每个支持向量的权值(alpha*y),后面的是输入的样本数据,也就是支持向量
1 1:0.774 2:0.376 # 参见西瓜书中用来求 w 的式6.9中的参数意义
1 1:0.634 2:0.264
1 1:0.608 2:0.318
1 1:0.556 2:0.215
1 1:0.403 2:0.237
1 1:0.481 2:0.149
1 1:0.437 2:0.211
-1 1:0.666 2:0.091
-1 1:0.243 2:0.267
-1 1:0.343 2:0.099
-1 1:0.639 2:0.161
-1 1:0.657 2:0.198
-1 1:0.36 2:0.37
-1 1:0.593 2:0.042
-1 1:0.719 2:0.103
关于训练过程中的屏幕回显信息解释:
optimization finished, #iter = 7 # 迭代次数
nu = 0.857143 # 含义和之前options中的 -n nu 意义一样
obj = -44.836966, # SVM转换成二次规划问题求解得到的最小值
rho = 0.761871 # 常数项的相反数
nSV = 13, # 支持向量个数
nBSV = 11 # 边界上的支持向量个数
Total nSV = 13 # 总共支持向量个数
三、参考文章
1、http://www.cnblogs.com/Finley/p/5329417.html
2、https://www.cnblogs.com/zhizhan/p/4376137.html