libsvm的使用方法(python)

本文讲使用台湾大学林智仁(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工具使用的格式,

<label1> <index1>:<value1> <index2>:<value2>     .....  <index L>:<valueL>

<label2> ......................

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格式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容