使用libsvm进行分类之python版本

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

时间: 2024-10-11 01:05:47

使用libsvm进行分类之python版本的相关文章

Mac下切换Python版本

Mac下有多个版本的Python时,需要进行版本切换.我使用的是anaconda,在终端下进行包安装时,默认Python版本是MacOS自带的Python,需要进行手动的版本切换. # 将anaconda的bin目录加入PATH,根据版本不同,也可能是~/anaconda3/bin echo 'export PATH="~/anaconda2/bin:$PATH"' >> ~/.bashrc # 更新bashrc以立即生效 source ~/.bashrc 以我主机为例,切

LInux升级Python版本2.7.11所遇问题汇总

首先请原谅我使用校园网络,基本上打不开谷歌,网络搜取得帮助均来自度娘. 对于我这个linux新手 IT 新手来说,自己升级点东西好担心,万一出错,可能都要重来.... 参照度娘内容和自己摸索,今天晚上的升级以成功结束 哈哈哈 一.我需要把升级Linux里Python版本为2.7.11,度娘一艘,都是各种直接弄好的下载链接,发现了各种复制来复制去的内容,找来找去没找到2.7.11,所以转到了官网www.python.org 首页就可以看到download里最新的2.7.11,点进去,需要的就是最上

更新centos系统的python版本

因今天安装一程序需要用到python高版本,所以升级来系统自带的python. 先查询下系统的python版本是多少. #python -V 显示出来的是2.4.3,太老了,现在升级到比较稳定的版本3.3.0,大家想升级到最新版本可以参考官方网站(https://www.python.org/downloads/). 温馨提示:更新python千万不要把老版本的删除!新老版本是可以共存的,很多基本的命令.软件包都要依赖预装的老版本python的,比如yum. 现在就开始升级操作,在此之前为了防止

在centos中部署多个python版本

使用pyenv+virtualenv方式部署python多版本 pyenv vs virtualenv pyenv 是针对 python 版本的管理,通过修改环境变量的方式实现: virtualenv 是针对python的包的多版本管理,通过将python包安装到一个模块来作为python的包虚拟环境,通过切换目录来实现不同包环境间的切换. pyenv 原理 pyenv 的美好之处在于,它并没有使用将不同的 $PATH 植入不同的 shell 这种高耦合的工作方式,而是简单地在 $PATH 的最

2.将python版本改为2.7的方法

1.首先查看当前python的版本 [[email protected] ~]# python -V Python 2.6.6 2.解压2.7版本的python源码包 tar xf Python-2.7.tar.bz2 cd Python-2.7 ./configure --prefix=/usr/local/python2.7 make && make install 3.检查安装结果 [[email protected] ~]# /usr/local/python2.7/bin/pyt

Linux下切换python版本

当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件.你可以按照以下方法使用 ls 命令来查看你的系统中都有那些 Python 的二进制文件可供使用. $ ls/usr/bin/python*/usr/bin/python /usr/bin/python2 /usr/bin/python2.7/usr/bin/python3 /usr/bin/python3.4/usr/bin/python3.4

centos系统python版本2.6升级到2.7

Centos 6.x上安装的python版本是2.6,不能满足我运行软件的要求,所以对python进行升级. Python的最新版本已经是3.3,但是Python3的兼容性可能还有一定的问题,所以还是升级到2.7较为保险.Python 2.7也能够满足绝大多数的软件需求了. 安装之前需要先安装以下软件: yum install zlib zlib-devel openssl openssl-devel -y 注意:后期安装pip时,如没安装以上软件,会报错,而且安装完上面软件还需要重新编译安装p

修复升级python版本之后ibus输入法不显示控制面板和候选框的问题

因为python版本需求,通过下载python2.7.6源码包,编译安装了python2.7版本.安装完该版本后,发现ibus输入法虽然可以激活使用,但是不显示控制面板,无法更改设置,连候选词条框都没有,使用几乎瘫痪.由于ibus依赖了一些python模块,所以推测是python版本的问题. 1. 尝试打开输入法设置 #ibus-setup Traceback (most recent call last): File "/usr/share/ibus/setup/main.py",

Windows解决anaconda下双python版本安装TensorFlow

首先,就是双版本anaconda的安装: 以前安装好的是python2.7版本,而TensorFlow的安装仅支持3.5版本的.但是自己本来的2.7版本又不想遗弃.所以安装双版本的: 在anaconda的官网上下载2.7版本和3.5版本: 先安装其中一个,我是想安装的2.7.一路next就可以了. 重点来了,安装3.5版本的过程如下: 1. 我下载的版本是Anaconda3-4.3.1-Windows-x86_64.下载地址:https://repo.continuum.io/archive/