SVM分类和训练

一. LIBSVM 软件包简介
  LIBSVM 是台湾大学林智仁(Chih-Jen Lin)博士等开发设计的一个操作简单、易于使用、快速有效的通用SVM 软件包,可以解决分类问题(包括C- SVC、 n - SVC )、回归问题(包括e - SVR、n - SVR )以及分布估计(one-class-SVM 
一类SVM等问题,提供了线性、多项式、径向基和S形函数四种常用的核函数供选择,可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权(-w)、多类问题的概率估计等。

http://blog.tianya.cn/blogger/post_show.asp?BlogID=302961&PostID=6667238

二.LIBSVM 使用的一般步骤
  1) 按照LIBSVM软件包所要求的格式准备数据集;
  2) 对数据进行简单的缩放操作;
  3) 考虑选用RBF 核函数2 K(x,y) e x y = -g - ;
  4) 采用交叉验证选择最佳参数C与g ;
  5) 采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;
  6) 利用获取的模型进行测试与预测。

.SVM函数

1.svmtrain

model= svmtrain(train_label, train_matrix, ['libsvm_options']);
其中:
train_label表示训练集的标签。
train_matrix表示训练集的属性矩阵。
libsvm_options是需要设置的一系列参数,各个参数可参见《libsvm 参数说明.txt》,里面介绍的很详细,中英文都有的。如果用回归的话,其中的-s参数值应为3。

        -s 设置svm类型:  
         0 – C-SVC  ;1 – v-SVC  ; 2 – one-class-SVM  ; 3 – ε-SVR  ;  4 – n - SVR
        -t 设置核函数类型,默认值为2
         0 -- 线性核:u'*v  ;                     1 -- 多项式核: (g*u'*v+ coef 0)degree  
         2 -- RBF 核:exp(-γ*||u-v||2)       3 -- sigmoid 核:tanh(γ*u'*v+ coef 0) 
        -d degree: 设置多项式核中degree的值,默认为3 
        -gγ: 设置核函数中γ的值,默认为1/k,k为特征(或者说是属性)数;  
        -r coef 0:设置核函数中的coef 0,默认值为0;  
        -c cost:设置C-SVC、ε-SVR、n - SVR中从惩罚系数C,默认值为1;  
        -n v :设置v-SVC、one-class-SVM 与n - SVR 中参数n ,默认值0.5;  
        -p ε :设置v-SVR的损失函数中的e ,默认值为0.1;  
        -m cachesize:设置cache内存大小,以MB为单位,默认值为40;  
        -e ε :设置终止准则中的可容忍偏差,默认值为0.001;  
        -h shrinking:是否使用启发式,可选值为0 或1,默认值为1;  
        -b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;  
        -wi weight:对各类样本的惩罚系数C加权,默认值为1; 
        -v n:n折交叉验证模式;  


model:是训练得到的模型,是一个结构体(如果参数中用到-v,得到的就不是结构体,对于分类问题,得到的是交叉检验下的平均分类准确率;对于回归问题,得到的是均方误差)。
http://bbs.pinggu.org/thread-3539405-1-1.html
http://blog.csdn.net/zy_zhengyang/article/details/45009431关于参数的设置介绍的很详细
2.svmpredict
(2)[predicted_label, accuracy/mse, decision_values]=svmpredict(test_label, test_matrix, model, ['libsvm_options']);
其中:
test _label表示测试集的标签(这个值可以不知道,因为作预测的时候,本来就是想知道这个值的,这个时候,随便制定一个值就可以了,只是这个时候得到的mse就没有意义了)。
test _matrix表示测试集的属性矩阵。
model是上面训练得到的模型。
libsvm_options是需要设置的一系列参数。
predicted_label表示预测得到的标签。
accuracy/mse是一个3*1的列向量,其中第1个数字用于分类问题,表示分类准确率;后两个数字用于回归问题,第2个数字表示mse;第三个数字表示平方相关系数(也就是说,如果分类的话,看第一个数字就可以了;回归的话,看后两个数字)。
decision_values表示决策值(一般好像不怎么用)。
3.svmclassify

Group = svmclassify(SVMStruct,Sample)

Group = svmclassify(SVMStruct,Sample,'Showplot',true)

eg.

svmStruct = svmtrain(xdata,group,'showplot',true);

species = svmclassify(svmStruct,[5 2],'showplot',true)  % 对[5 2]进行分类
hold on;plot(5,2,'ro','MarkerSize',12);hold off         %将[5 2]这个样本在图中标记出来

%二维特征向量的分类问题可以画图表示

四.交叉验证(CV cross validation)

1.hold-out method(合作的方法)

将所有的样本分为两部分,一部分作为训练集,一部分作为测试集,分别对SVM进行训练和测试。

优点:实现简单

缺点:这种分类方法实际上并没有用到交叉验证的思想,所得结果的说服力并不是很强的;准确率易受分组的影响。

分类器的性能指标:验证所得的分类器的准确率

具体实现:

[train,test]=crossvalind('holdout',groups);  %随机分割数据集

返回值train和test均为代表不同样本的逻辑值

2.K-fold cross validation(K-CV)

将样本分为K组,每组都作为一次测试集,其余的K-1为训练集对SVM进行训练,然后进行测试;最后会得到K个模型、K个验证集的分类准确率的值,计算这些准确率的平均值,变化K的值,将准确率平均值最低的那个K作为最佳的分组,所得的model为最佳的分类器。交叉验证重复K次,每子样本证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。

在样本数目比较少的时候K一般从开始,实际操作更多的是从3开始。

优点:有效避免过学习以及欠学习的情况,所得的结果也比较有说服力。

具体实现:在训练的时候用到参数 -v

-v n : n-fold cross validation mode

当svm-train使用-v参数时,此时svm-train返回的不再是一个结构体model,而是交叉验证的精度,对于分类问题,返回的是交叉检验下的平均分类准确率;回归问题,返回的是交叉检验下的平均均方根误差(MSE)。

-v 交叉验证后会返回一个效率值,你找到这个效率最大的c和g


3.leave-one-out cross validation(留/缺一交叉验证法)

每次留一个样本作为测试集,其余的作为训练集进行训练,最后会得到N个model以及分类准确率,将这N个验证集的分类准确率的均值作为该留一验证法的性能指标

优点:所有的样本都参与训练,结果可靠;不受随机因素的影响,确保实验过程是可以被复制的。

缺点:计算成本高。

  

发布了29 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/best_scenery/article/details/51209949
今日推荐