SVM-python libsvm解读

基础实验见前一篇博文: SVM– pycharm中libsvm基础实验 

参考文献:LibSVM for Python 使用

使用LibSVM

LibSVM的使用非常简单,只需调用有限的接口

示例1:

from libsvm322.python.svmutil import *
from libsvm322.python.svmutil import *
    
y, x =[1,-1],[{1:1,2:2},{1:1,2:0}]
prob  = svm_problem(y, x)
param = svm_parameter('-t 0 -c 4 -b 1')
model = svm_train(prob, param)
yt = [1]
xt = [{1:2,2:3}]
p_label, p_acc, p_val = svm_predict(yt, xt, model)
print(p_label)

输出结果:

*
optimization finished, #iter = 1
nu = 0.125000
obj = -0.500000, rho = 1.000000
nSV = 2, nBSV = 0
Total nSV = 2
Model supports probability estimates, but disabled in predicton.
Accuracy = 100% (1/1) (classification)
[1.0]

LibSVM可以在文件中使用svm_read_problem读取训练数据,这样便于大规模数据的使用。

示例见上一篇博文SVM– pycharm中libsvm基础实验 中实验

y,x = svm_read_problem('D:\javaTools\code\MachineLearning\libsvm-3.22\heart_scale')
m = svm_train(y[:200], x[:200], '-c 4')
print '----------------'
lable, acc, val = svm_predict(y[200:], x[200:], m)

可以看到输出:

optimization finished, #iter = 257
nu = 0.351161obj = -225.628984, 
rho = 0.636110nSV = 91, 
nBSV = 49Total nSV = 91
----------------
Accuracy = 84.2857% (59/70) (classification)

LibSVM接口

训练数据格式

libsvm的训练数据格式如下:

<label> <index1>:<value1> <index2>:<value2> ...

或:

<label> <value1> <index2> ...

主要类型

  • svm_problem

保存定义SVM模型的训练数据

  • svm_parameter

存储训练SVM模型所需的各种参数

  • svm_model

完成训练的SVM模型

  • svm_node

模型中一个特征的值,只包含一个整数索引和一个浮点值属性。

主要接口:

-svm_problem(y, x)

由训练数据y,x创建svm_problem对象

  • svm_train()

svm_train有3个重载:

model = svm_train(y, x [, 'training_options'])
model = svm_train(prob [, 'training_options'])
model = svm_train(prob, param)

用于训练svm_model模型

如:

>>>y2,x2=[1,-1],[[1,2],[2,3]]
>>>model2=svm_train(y2,x2)
*optimization finished, #iter = 1
nu = 1.000000obj = -1.367879, rho = 0.000000
nSV = 2, nBSV = 2Total nSV = 2
>>> yt2,xt2=[1,1],[[1,2],[2,3]]         
>>> v1,v2,v3=svm_predict(yt2,xt2,model2)
Accuracy = 50% (1/2) (classification)

  • svm_parameter(cmd)
创建svm_parameter对象,参数为字符串。

示例:

param = svm_parameter('-t 0 -c 4 -b 1')
  • svm_predict()

调用语法:

p_labs, p_acc, p_vals = svm_predict(y, x, model [,'predicting_options'])

参数:

y 测试数据的标签

x 测试数据的输入向量

model为训练好的SVM模型。

返回值:

p_labs是存储预测标签的列表。

p_acc存储了预测的精确度,均值和回归的平方相关系数。

p_vals在指定参数'-b 1'时将返回判定系数(判定的可靠程度)。

这个函数不仅是测试用的接口,也是应用状态下进行分类的接口。比较奇葩的是需要输入测试标签y才能进行预测,因为y不影响预测结果可以用0向量代替。

  • svm_read_problem

读取LibSVM格式的训练数据:

y, x = svm_read_problem('data.txt')
  • svm_save_model

将训练好的svm_model存储到文件中:

svm_save_model('model_file', model)

model_file的内容:

svm_type c_svc
kernel_type linear
nr_class 2
total_sv 2
rho 0
label 1 -1
probA 0.693147
probB 2.3919e-16
nr_sv 1 1
SV
0.25 1:1 2:1 
-0.25 1:-1 2:-1 
  • svm_load_model

读取存储在文件中的svm_model:

 model = svm_load_model('model_file')

调整SVM参数

LibSVM在训练和预测过程中需要一系列参数来调整控制。

svm_train的参数:

  • -s SVM的类型(svm_type)

    • 0 -- C-SVC(默认)

      使用惩罚因子(Cost)的处理噪声的多分类器

    • 1 -- nu-SVC(多分类器)

      按照错误样本比例处理噪声的多分类器

    • 2 -- one-class SVM

      一类支持向量机,可参见"SVDD"的相关内容

    • 3 -- epsilon-SVR(回归)

      epsilon支持向量回归

    • 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

  • -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 静默模式




猜你喜欢

转载自blog.csdn.net/answer100answer/article/details/80243816