码迷,mamicode.com
首页 > 编程语言 > 详细

使用libsvm进行分类之python版本

时间:2015-05-30 12:14:45      阅读:1146      评论:0      收藏:0      [点我收藏+]

标签:nlp   python   libsvm   ubuntu   

preface: 最近在做一个多分类的问题,数据格式要求跟libsvm接受的格式很像,为图方便,试着用下libsvm, 习惯用python, 那就用python版本的吧。

工欲擅其事,必先利其器。Libsvm下载:http://www.csie.ntu.edu.tw/~cjlin/libsvm/,Download LIBSVM那一栏,下载libsvm包。也可以从网盘下载:http://pan.baidu.com/s/1bnk5Hr5,本人用的是ubuntu 15.04版本的,python用了自带的,另外安装了anaconda

解压后,看README即可。有个python文件夹,这里介绍python部分的,看python文件夹下README即可。里面有详细的介绍。

在该文件夹下打开终端,make,编译下,然后输入ipython或python,进入python交互式界面,按照README文件的说明,运行一个已经处理好的LIBSVM数据格式的心脏数据heart_scale,进行分类。

<span style="font-size:18px;">>>> from svmutil import *
# Read data in LIBSVM format
>>> 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)
</span>
以上只是一个小demo.关键还在于各个函数以及参数用法。

首先,svm_read_problem()函数,顾名思义可以看出,用来读取数据的函数,数据格式需要是libsvm能够接受的格式,并且此函数返回两个值,y为第一列label, 即哪个类别。x为后面的特征列。数据格式,有博友说的很清楚:

#=====================================

1)LIBSVM使用的数据格式

    该软件使用的训练数据和检验数据文件格式如下:

[label] [index1]:[value1] [index2]:[value2] ...

[label] [index1]:[value1] [index2]:[value2] ...

一行一条记录数据,如下(可参看libsvm-3.1/heart_scale):

+1 1:0.708 2:1 3:14:-0.3205:-0.105 6:-1

注意:由于程序设计的原因,每行数据的最后一个value后面,

还必须加一个空格 ‘ ‘ 或Tab ‘\t‘ 才能回车换到下一行继续输入下一条数据。

最后一行数据也是必须在最后一个value后面加一个空格 ‘ ‘ 或Tab ‘\t‘ 的!!! 

这里(x,y) -> ((0.708,1,1, -0.320, -0.105, -1), +1)         ( ps: 这话什么意思?  没弄明白!!  )

label 或说是class, 就是你要分类的种类,通常是一些整数。

index 是有順序的索引,通常是连续的整数。

value 就是用来 train 的数据,通常是一堆实数。

#=======================================================

其次,svm_train()函数。最好的文档莫过于help(svm_train):

Help on function svm_train in module svmutil:

svm_train(arg1, arg2=None, arg3=None)
    svm_train(y, x [, options]) -> model | ACC | MSE
    svm_train(prob [, options]) -> model | ACC | MSE
    svm_train(prob, param) -> model | ACC| MSE
    
    Train an SVM model from data (y, x) or an svm_problem prob using
    'options' or an svm_parameter param.
    If '-v' is specified in 'options' (i.e., cross validation)
    either accuracy (ACC) or mean-squared error (MSE) is returned.
    options:
        -s svm_type : set type of SVM (default 0)
            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)
            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)
以上是英文文档。中文文档有博友也写得很清楚,直接转载过来:

#=================================

其中options涵义如下:

-s svm类型:设置SVM 类型,默认值为0,可选类型有:

0 -- C- SVC

1 -- nu - SVC

2 -- one-class-SVM

3 -- e - SVR

4 -- nu-SVR

-t 核函数类型:设置核函数类型,默认值为2,可选类型有:

0 -- 线性核:u‘*v

1 -- 多项式核:(g*u‘*v+ coef0)degree

2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)

3 -- sigmoid 核:tanh(g*u‘*v+ coef 0)

-d degree:核函数中的degree设置,默认值为3;

-g r(gama):核函数中的函数设置(默认1/ k);

-r coef 0:设置核函数中的coef0,默认值为0;

-c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;

-n nu :设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值0.5;

-p e :核宽,设置e - SVR的损失函数中的e ,默认值为0.1;

-m cachesize:设置cache内存大小,以MB为单位(默认40):

-e e :设置终止准则中的可容忍偏差,默认值为0.001;

-h shrinking:是否使用启发式,可选值为0 或1,默认值为1;

-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;

-wi weight:对各类样本的惩罚系数C加权,默认值为1;

-v n:n折交叉验证模式。

 

其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

#==================================

再次,关键的特征问题,本人做NLP的战五渣研究僧一枚,数据格式及文本有如下所例:

<span style="font-size:18px;">同为校花    杨幂    郑爽    杨幂赵薇唐嫣章子怡郑爽谁是当之无愧最美校花
昔日情敌    周慧敏    张茆    周慧敏情敌张茆嫁外籍男
朋友    玲花    曾毅    曾毅和玲花介于友情与爱情之间</span>
同仁的盆友应该能看出卤主要干什么了,是的,没错,你猜对了:对新闻标题抽取出明星名字并对名人1和名人2之间的关系进行分类。去停用词,找出该类的特征词,用卡方特征量等等什么的。暂时还在做,有空再贴出来。~,~///。

最后,待续。。。

#==============================

参考:

1.http://www.csie.ntu.edu.tw/~cjlin/libsvm/

2.http://blog.csdn.net/meredith_leaf/article/details/6714144

3.http://shiyanjun.cn/archives/548.html

使用libsvm进行分类之python版本

标签:nlp   python   libsvm   ubuntu   

原文地址:http://blog.csdn.net/u010454729/article/details/46271677

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!