如何利用python使用libsvm

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用python使用libsvm相关的知识,希望对你有一定的参考价值。

    准备工具

    libsvm软件包;

    电脑;

    步骤操作

    把包解压在C盘之中,如:C:\\libsvm-3.18;

    用libsvm自带的脚本grid.py和easy.py,需要去官网下载绘图工具gnuplot,解压到c盘;

    进入c:\\libsvm\\tools目录下,用文本编辑器(记事本,edit都可以)修改grid.py和easy.py两个文件,找到其中关于gnuplot路径的那项,根据实际路径进行修改,并保存;

    例子举例

    常用接口

    提高预测的准确率


参考技术A

一:libsvm包下载与使用:

LIBSVM是台湾大学林智仁(Lin Chih-Jen)副教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进

1.

把包解压在C盘之中,如:C:\\libsvm-3.18

2.

因为要用libsvm自带的脚本grid.py和easy.py,需要去官网下载绘图工具gnuplot,解压到c盘

3.

进入c:\\libsvm\\tools目录下,用文本编辑器(记事本,edit都可以)修改grid.py和easy.py两个文件,找到其中关于gnuplot路径的那项,根据实际路径进行修改,并保存

4python与libsvm的连接(参考SVM学习笔记(2)LIBSVM在python下的使用 )


a.打开IDLE(python GUI),输入 
>>>import sys 
>>>sys.version 
如果你的python是32位,将出现如下字符: 
‘2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]’ 
这个时候LIBSVM的python接口设置将非常简单。在libsvm-3.16文件夹下的windows文件夹中找到动态链接库libsvm.dll,将其添加到系统目录,如`C:\\WINDOWS\\system32\\’,即可在python中使用libsvm

b.如果你是64位的请参考文献,请参考上述连接。

5.执行一个小例子

import os

os.chdir('C:\\libsvm-3.18\\python')#请根据实际路径修改from svmutil import *y, x = svm_read_problem('../heart_scale')#读取自带数据m = svm_train(y[:200], x[:200], '-c 4')

p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)

##出现如下结果,应该是正确安装了

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

二几个简单的例子

从cjlin/papers/guide/data/下载实验数据集。并且将数据集拷贝到C:\\libsvm-3.18\\windows下(因为之后我们需要利用该文件夹下的其他文件,这样比较方便,当然之后你用绝对地址也可以了)

建立一个py文件,写下如下代码:

例1:

import os


os.chdir('C:\\libsvm-3.18\\windows')#设定路径from svmutil import *y, x = svm_read_problem('train.1.txt')#读入训练数据yt, xt = svm_read_problem('test.1.txt')#训练测试数据m = svm_train(y, x )#训练svm_predict(yt,xt,m)#测试

执行上述代码,精度为:Accuracy = 66.925% (2677/4000) (classification)

常用接口

svm_train()        : train an SVM model#训练

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: svm_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)

有关参数的设置(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)

1 -- nu-SVC (multi-class classification)

2 -- one-class SVM

3 -- epsilon-SVR (regression)

4 -- nu-SVR (regression)

-t kernel_type : set type of kernel function (default 2)#是否用kernel trick

0 -- linear: u'*v

1 -- polynomial: (gamma*u'*v + coef0)^degree

2 -- radial basis function: exp(-gamma*|u-v|^2)

3 -- sigmoid: tanh(gamma*u'*v + coef0)

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)

-e epsilon : 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 0)

-wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)

-v n: n-fold cross validation mode

-q : quiet mode (no outputs)

三提高预测的准确率:

通过一定的过程,可以提高预测的准确率(在文献2中有详细介绍):

a.转换数据为libsvm可用形式.(可以通过下载的数据了解格式)

b.进行一个简单的尺度变换

c.利用RBF kernel,利用cross-validation来查找最佳的参数 C 和 r

d.利用最佳参数C 和 r ,来训练整个数据集

e.测试

再看例子1:

1.进入cmd模式下,输入如下代码,将现有数据进行适度变换,生成变换后的数据文件train.1.scale.txt

参数说明:

-l 变换后的下限

-u 变换后的上限

-s 参考上文

2执行以下代码

import os


os.chdir('C:\\libsvm-3.18\\windows')#设定路径from svmutil import *y, x = svm_read_problem('train.1.scale.txt')#读入训练数据yt, xt = svm_read_problem('test.1.scale.txt')#训练测试数据m = svm_train(y, x )#训练svm_predict(yt,xt,m)#测试

精确度为Accuracy = 95.6% (3824/4000) (classification)。

可见我们只是做了简单的尺度变换后,预测的正确率大大提升了。

3通过选择最优参数,再次提高预测的准确率:(需要把tools文件下的grid.py拷贝到'C:\\libsvm-3.18\\windows'下)

import os
os.chdir('C:\\libsvm-3.18\\windows')#设定路径from svmutil import *from grid import *rate, param = find_parameters('train.1.scale.txt', '-log2c -3,3,1 -log2g -3,3,1')

y, x = svm_read_problem('train.1.scale.txt')#读入训练数据yt, xt = svm_read_problem('test.1.scale.txt')#训练测试数据m = svm_train(y, x ,'-c 2 -g 4')#训练p_label,p_acc,p_vals=svm_predict(yt,xt,m)#测试

执行上面的程序,find_parmaters函数,可以找到对应训练数据较好的参数。后面的log2c,log2g分别设置C和r的搜索范围。搜索机制是以2为底指数搜索,如 –log2c –3 , 3,1 就是参数C,从2^-3,2^-2,2^-1…搜索到2^3.

搜索到较好参数后,在训练的时候加上参数的设置。

另外,读者可以自己试试数据集2,3.

如何在 python 中使用 libSVM 计算精度、召回率和 F 分数

【中文标题】如何在 python 中使用 libSVM 计算精度、召回率和 F 分数【英文标题】:How to calculate precision, recall and F-score with libSVM in python 【发布时间】:2013-05-31 10:43:44 【问题描述】:

我想在 Python 中使用 libsvm 计算 precisionrecallf-score,但我不知道如何。我找到了this site,但我不明白如何调用该函数,如果你能通过示例帮助我。

【问题讨论】:

【参考方案1】:

您可以利用 scikit-learn,它是 Python 中机器学习的最佳软件包之一。它的 SVM 实现使用libsvm,您可以计算出精度、召回率和 f-score,如下面的 sn-p 所示:

from sklearn import svm
from sklearn import metrics
from sklearn.cross_validation import train_test_split
from sklearn.datasets import load_iris

# prepare dataset
iris = load_iris()
X = iris.data[:, :2]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# svm classification
clf = svm.SVC(kernel='rbf', gamma=0.7, C = 1.0).fit(X_train, y_train)
y_predicted = clf.predict(X_test)

# performance
print "Classification report for %s" % clf
print
print metrics.classification_report(y_test, y_predicted)
print
print "Confusion matrix"
print metrics.confusion_matrix(y_test, y_predicted)

这将产生类似这样的输出:

Classification report for SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.7,
kernel=rbf, max_iter=-1, probability=False, shrinking=True, tol=0.001,
verbose=False)

             precision    recall  f1-score   support

          0       1.00      1.00      1.00         9
          1       0.90      0.69      0.78        13
          2       0.64      0.88      0.74         8

avg / total       0.86      0.83      0.84        30


Confusion matrix
[[9 0 0]
 [0 9 4]
 [0 1 7]]

当然,您可以使用您提到的libsvm tools,但它们仅适用于二进制分类,而scikit允许您使用多类。

【讨论】:

您正在加载什么数据集?例如,如果我的数据集在文本文件中,如何使用它们? 在示例中,我使用了一个名为 iris 的预定义数据集,它带有 scikit-learn。对于特定数据集,您需要将文本数据转换为 numpy 矩阵。

以上是关于如何利用python使用libsvm的主要内容,如果未能解决你的问题,请参考以下文章

黑科技编程开发,利用Python使图片完美去除水印

利用这10个工具,你可以写出更好的Python代码

如何使表格布局中的列均匀分布,最大限度地利用可用空间

如何使 Hive 查询利用存储在 Metastore 中的统计信息

可视化实验八:利用Python绘制柱状图条形图

可视化实验八:利用Python绘制柱状图条形图