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