LIBSVM 在 python 环境下的使用

一、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

猜你喜欢

转载自blog.csdn.net/qq_37691909/article/details/85623326