如何使用libsvm进行分类
这帖子就是初步教教刚接触libsvm(svm)的同学如何利用libsvm进行分类预测,关于参数寻优的问题在这里姑且不谈,另有帖子详述。
其实使用libsvm进行分类很简单,只需要有属性矩阵和标签,然后就可以建立分类模型(model),然后利用得到的这个model进行分类预测了。
那神马是属性矩阵?神马又是标签呢?我举一个直白的不能在直白的例子:
说一个班级里面有两个男生(男生1、男生2),两个女生(女生1、女生2),其中
男生1 身高:176cm 体重:70kg;
男生2 身高:180cm 体重:80kg;
女生1 身高:161cm 体重:45kg;
女生2 身高:163cm 体重:47kg;
如果我们将男生定义为1,女生定义为-1,并将上面的数据放入矩阵data中,即
- data = [176 70;
- 180 80;
- 161 45;
- 163 47];
- label = [1;1;-1;-1];
Remark:这里有一点废话一些(因为我看到不止一个朋友问我这个相关的问题):
上面我们将男生定义为1,女生定义为-1,那定义成别的有影响吗?
这个肯定没有影响啊!(用脚趾头都能想出来,我不知道为什么也会有人问),这里面的标签定义就是区分开男生和女生,怎么定义都可以的,只要定义成数值型的就可以。
比如我可将将男生定义为2,女生定义为5;后面的label相应为label=[2;2;5;5];
比如我可将将男生定义为18,女生定义为22;后面的label相应为label=[18;18;22;22];
为什么我说这个用脚趾头都能想怎么定义都可以呢?学过数学的应该都会明白,将男生定义为1,女生定义为-1和将男生定义为2,女生定义为5本质是一样的,应为可以找到一个映射将(2,5)转换成(1,-1),so所以本质都是一样的,后面的18、22本质也是一样的。
这里要多说一些,如果你原本的数据集合的标签不是数值型的(比如a、b、c)那么你完全可以通过某种转换映射将不是数值型的标签转换成数值型的。
现在回归正题,有了上面的属性矩阵data,和标签label就可以利用libsvm建立分类模型了,简要代码如下:
- model =svmtrain(label,data);
身高190cm,体重85kg
我们想通过上面这些信息就给出其标签(想知道其是男【1】还是女【-1】)
比如 令 testdata = [190 85];由于其标签我们不知道,我们假设其标签为-1(也可以假设为1)
Remark:这里又有一点废话一些(因为我看到不止一个朋友问我这个相关的问题):
如果测试集合的标签没有怎么办?测试集合的标签就应该没有,否则测试集合的标签都有了,还预测你妹啊!?没有是正确的,就像上面一样,新来的学生其标签咱不应知道,就想通过其属性矩阵来预测其标签,这才是预测分类的真正目的。
之所以平时做测试时,测试集合的标签一般都有,那是因为一般人们想要看看自己的分类器的效果如何,效果的评价指标之一就是分类预测的准确率,这就需要有测试集的本来的真实的标签来进行分类预测准确率的计算。
话归正传,即
testdatalabel = -1;
然后利用libsvm来预测这个新来的学生是男生还是女生,代码如下:
- [predictlabel,accuracy] =svmpredict(testdatalabel,testdata,model)
- data = [176 70;
- 180 80;
- 161 45;
- 163 47];
- label =[1;1;-1;-1];
- model =svmtrain(label,data);
- testdata = [19085];
- testdatalabel =-1;
- [predictlabel,accuracy] =svmpredict(testdatalabel,testdata,model);
- predictlabel
- Accuracy = 0% (0/1)(classification)
- predictlabel =
- 1
好,通过上面的讲解,不知道诸位看官对于利用libsvm进行分类是否有了一定了解【谁要是这么通俗的例子还搞不清楚怎么使用libsvm进行分类,那我真无语啦】,下面使用libsvm工具箱本身带的测试数据heart_scale来实际进行一下测试:
- %%HowToClassifyUsingLibsvm
- % by faruto @ faruto'sStudio~
- %http://blog.sina.com.cn/faruto
- %Email:faruto@163.com
- %http://www.matlabsky.com
- %http://www.mfun.la
- %http://video.ourmatlab.com
- % last modified by2010.12.27
- %% a litte cleanwork
- tic;
- close all;
- clear;
- clc;
- format compact;
- %%
- % 首先载入数据
- load heart_scale;
- data =heart_scale_inst;
- label =heart_scale_label;
- %选取前200个数据作为训练集合,后70个数据作为测试集合
- ind = 200;
- traindata =data(1:ind,:);
- trainlabel =label(1:ind,:);
- testdata =data(ind+1:end,:);
- testlabel =label(ind+1:end,:);
- % 利用训练集合建立分类模型
- model =svmtrain(trainlabel,traindata,'-s 0 -t 2 -c 1.2 -g 2.8');
- % 分类模型model解密
- model
- Parameters =model.Parameters
- Label =model.Label
- nr_class =model.nr_class
- totalSV =model.totalSV
- nSV =model.nSV
- %利用建立的模型看其在训练集合上的分类效果
- [ptrain,acctrain] =svmpredict(trainlabel,traindata,model);
- % 预测测试集合标签
- [ptest,acctest] =svmpredict(testlabel,testdata,model);
- %%
- toc;
- model=
- Parameters: [5x1 double]
- nr_class:2
- totalSV:197
- rho:0.0583
- Label: [2x1double]
- ProbA:[]
- ProbB:[]
- nSV: [2x1double]
- sv_coef:[197x1 double]
- SVs: [197x13double]
- Parameters =
- 0
- 2.0000
- 3.0000
- 2.8000
- 0
- Label =
- 1
- -1
- nr_class =
- 2
- totalSV =
- 197
- nSV =
- 89
- 108
- Accuracy = 99.5% (199/200)(classification)
- Accuracy = 68.5714% (48/70)(classification)
- Elapsed time is 0.040873seconds.
- >>
只是说一下参数输入的意义:
-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(-r|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
更多关于libsvm 参数的说明请看
libsvm 参数说明【中英文双语版本】
http://www.matlabsky.com/thread-12380-1-1.html
还有关于建立的分类模型model
- model=
- Parameters: [5x1 double]
- nr_class:2
- totalSV:197
- rho:0.0583
- Label: [2x1double]
- ProbA:[]
- ProbB:[]
- nSV: [2x1double]
- sv_coef:[197x1 double]
- SVs: [197x13double]
分类模型model解密详解中说明
利用libsvm-mat建立分类模型model参数解密【by faruto】
http://www.matlabsky.com/thread-12649-1-1.html
所以也希望诸位看官尤其是对svm感兴趣的朋友多多关注我。O(∩_∩)O~
如果对于标签设置问题您还没有搞懂可以再看看这个:
【转】Matlab中使用libsvm进行分类预测时的标签问题再次说明
http://www.matlabsky.com/thread-12396-1-1.html
更多关于SVM的东西请看:
关于SVM的那点破事[长期更新整理 by faruto]
http://www.matlabsky.com/thread-10966-1-1.html