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,进行分类。
>>>> 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)以上只是一个小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.1056:-1
注意:由于程序设计的原因,每行数据的最后一个value后面,
还必须加一个空格 ' ' 或Tab '\t' 才能回车换到下一行继续输入下一条数据。
最后一行数据也是必须在最后一个value后面加一个空格 ' ' 或Tab '\t' 的!!!
这里(x,y) -> ((0.708,1,1, -0.320, -0.105, -1), +1) ( ps: 这话什么意思? 没弄明白!! )
label 或说是class, 就是你要分类的种类,通常是一些整数。
index 是有順序的索引,通常是连续的整数。index需要从1开始?
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之间的关系进行分类。去停用词,找出该类的特征词,用卡方特征量等等什么的。暂时还在做,有空再贴出来。~,~///。
#==============================
再次,使用java对模型进行处理:
在lisvm/java文件夹下make,有了一大堆文件后:
在终端运行:java svm_train -s 0 -c 100 -g 0.1 -v 5 ../heart_scale。直接对文件进行5折交叉验证看准确率。
Examples ======== > svm-scale -l -1 -u 1 -s range train > train.scale > svm-scale -r range test > test.scale Scale each feature of the training data to be in [-1,1]. Scaling factors are stored in the file range and then used for scaling the test data. > svm-train -s 0 -c 5 -t 2 -g 0.5 -e 0.1 data_file Train a classifier with RBF kernel exp(-0.5|u-v|^2), C=10, and stopping tolerance 0.1. > svm-train -s 3 -p 0.1 -t 0 data_file Solve SVM regression with linear kernel u'v and epsilon=0.1 in the loss function. > svm-train -c 10 -w1 1 -w-2 5 -w4 2 data_file Train a classifier with penalty 10 = 1 * 10 for class 1, penalty 50 = 5 * 10 for class -2, and penalty 20 = 2 * 10 for class 4. > svm-train -s 0 -c 100 -g 0.1 -v 5 data_file Do five-fold cross validation for the classifier using the parameters C = 100 and gamma = 0.1 > svm-train -s 0 -b 1 data_file > svm-predict -b 1 test_file data_file.model output_file Obtain a model with probability information and predict test data with probability estimates在README文件中的EXAMPLE栏说得很清楚。只是这里加了个java,大同小异。java svm_train -s 0 -c 100 -g 0.1 -v 5 libsvm_data.txt > cross_validation5.txt
>为管道符号,懂linux的就不用说了。把在终端输出的结果通过管道输出到cross_validation5.txt文件中而不在终端输出。
#==============================
另外,在libsvm/tools文件夹下有三个比较有用的工具:
1. subset selection tools. 2. parameter selection tools. 3. LIBSVM format checking tools顾名思义:
子集选择工具:可用来划分训练集和测试集。
参数选择工具。
格式检查工具:检查文件格式是否有问题。libsvm数据需要升序(README文件:“see the section of precomputed kernels. Indices must be in ASCENDING order.”)
#==============================
最后,待续。。。
#==============================
参考:
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