SVM(支撑向量机模型)是二(多)分类问题中经常使用的方法,思想比较简单,但是具体实现与求解细节对工程人员来说比较复杂,如需了解SVM的入门知识和中级进阶可点此下载。本文从应用的角度出发,使用Libsvm函数库解决SVM模型的分类与回归问题。

说明:libsvm是实现svm的便捷开源工具,应用广泛,由国立台湾大学Chih-Chung Chang和Chih-Jen Lin编写,可以实现基于SVM的分类和回归。

1.分类

在Matlab下下载测试数据heart_sacle
运行程序:

load heart_scale;
train_data = heart_scale_inst(:,:);
train_label = heart_scale_label(:,:);
test_data = heart_scale_inst(:,:);
test_label = heart_scale_label(:,:);
train_data=sparse(train_data);
test_data=sparse(test_data);
libsvmwrite('traindata',train_label,train_data);
libsvmwrite('testdata',test_label,test_data);

这样得到的traindata和testdata中的数据结构和heart_scale_c相同。
训练部分:

[xlabel,xdata]=libsvmread('traindata');
xdata=full(xdata);
model=svmtrain(xlabel,xdata);%%具体参数可以参见svmtrain.c

返回模型的参数:
结构[Parameters, nr_class, totalSV, rho, Label, ProbA, ProbB, nSV, sv_coef, SVs]

model.Parameters参数意义从上到下依次为:

-s svm类型:SVM设置类型(默认0)

-t 核函数类型:核函数设置类型(默认2)

-d degree:核函数中的degree设置(针对多项式核函数)(默认3)

-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)

-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)

model.nr_class表示数据集中有多少类别;= 2 for regression/one-class svm

model.Label表示数据集中类别的标签都是什么

model.totalSV代表总共的支持向量的数目

model.nSV表示每类样本的支持向量的数目

model.ProbA和model.ProbB

使用-b参数时才能用到,用于概率估计。

-b probability_estimates: whether to train a SVC or SVR model for probability estimates,0 or 1 (default 0)

可以参见A note on Platt’s probabilistic outputs for support vector machines》论文

model.sv_coef是一个totalSV*1的矩阵,承装的是totalSV个支持向量在决策函数中的系数

model.SVs是一个totalSV×维度的稀疏矩阵,承装的是totalSV个支持向量

model.rho是决策函数中的常数项的相反数

测试部分:

[clabel,cdata]=libsvmread('testdata');
cdata=full(cdata);
[predict_label, accuracy, dec_values] = svmpredict(clabel, cdata, model);

返回参数:
predict_label是预测标签向量

accuracy从上到下依次的意义分别是:

-分类准率(分类问题中用到的参数指标)

-平均平方误差(MSE (mean squared error))[回归问题中用到的参数指标]

-平方相关系数(r2 (squared correlation coefficient))[回归问题中用到的参数指标]

dec_values是一个包含decision值或概率估计(-b 1)的矩阵,如果k个类,对于decision值,每行包含k(k-1)/2个二分类问题的结果;对于概率,每列包含k个属于每类的概率值

改变参数后:

model2=svmtrain(xlabel,xdata,'-c 1024 -g 0.001953125');
[predict_label2, accuracy2, dec_values2] = svmpredict(clabel, cdata, model2);

model2=svmtrain(xlabel,xdata,'-c 8 -g 0.03125 -b 1');
[b_label, b_accuracy, prob_estimates] = svmpredict(clabel, cdata, model2, '-b 1');

附加注意事项:
1.缩放训练和测试数据(上例Matlab数据已缩放)

应用SVM之前,缩放是非常重要的。缩放的最主要优点是能够避免大数值区间的属性过分支配了小数值区间的属性。另一个优点能避免计算过程中数值复杂度。因为关键值通常依赖特征向量的内积(inner products),例如,线性核和多项式核力,属性的大数值可能会导致数值问题。我们推荐将每个属性线性缩放到区间[-1,+1]或者[0, 1]。

当然,我们必须使用同样的方法缩放训练数据和测试数据。例如,假设我们把训练数据的第一个属性从[-10, +10]缩放到[-1, +1],那么如果测试数据的第一个属性属于区间[-11, +8],我们必须将测试数据转变成[-1.1, +0.8]。

svm-scale [options] data_filename

范围用-l, -u 指定,通常是[0,1],或是[-1,1]。(文本分类一般选[0,1])。

示例程序:训练集合测试集被分别缩放到[0,1]区间

$ ../svm-scale -l  -s range4 svmguide4 > svmguide4.scale
$ ../svm-scale -r range4 svmguide4.t > svmguide4.t.scale
$ python easy.py svmguide4.scale svmguide4.t.scale rem(libsvm中tools的程序)
Accuracy = 89.4231% (/) (classification)

2.采用交叉验证选择最佳参数C与g(径向基核函数)
不同的参数(最常用的就是g和c)条件下会训练出不同的SVM,那怎么选取使SVM最好的参数呢,grid.py就是做这个的。

因此,这里要先用grid选取合适的C和g值。

Usage: grid.py [-log2c begin,end,step] [-log2g begin,end,step] [-v fold][-svmtrain pathname] [-gnuplot pathname] [-out pathname] [-png pathname][additional parameters for svm-train] dataset

一般log2c -10,10,1 ;log2g 10,-10,-1, -v 5即可

示例:

python grid.py -log2c -,, -log2g ,-,- trainset.scale

返回best-c和best-g,还同时还返回准确率。
3.上述Matlab操作在cmd命令窗口下也可完成,详见A Practical Guide to Support Vector Classi cation

2.回归

步骤:使用Libsvm中的Windows版本的工具svmscale.exe进行训练和测试数据的归一化,svmtrain.exe进行模型训练,svmpredict.exe进行预测

1.svmtrtrain.exe训练模型(归一化数据和分类问题类似)

svmtrain.exe -s  -p 0.0001 -t  -g  -c 0.53125 feature.scaled

-s用来指定的SVM的类型(default 0)
0 – C-SVC

1 – nu-SVC

2 – one-class SVM

3 – epsilon-SVR

4 – nu-SVR

对于回归来说,只能选3或者4,3表示epsilon-support vector regression, 4表示nu-support vector regression。-t是选择核函数,通常选用RBF核函数,原因在“A Practical Guide support vector classification”中已经简单介绍过了。-p尽量选个比较小的数字。需要仔细调整的重要参数是-c和-g。除非用gridregression.py来搜索最优参数,否则只能自己慢慢试了。

用gridregression.py搜索最优参数的方法如下:

python.exe gridregression.py -svmtrain H:\SVM\libsvm-2.81\windows\svmtrain.exe -gnuplot C:\gp373w32\pgnuplot.exe -log2c -,, -log2g -,, -log2p -,, -v  -s  -t  H:\SVM\libsvm-2.81\windows\feature.scaled > gridregression_feature.parameter

注意:-svmtrain是给出svmtrain.exe所在路径,一定要是完整的全路径
-gnuplot是给出pgnuplot.exe所在路径。这里要用pgnuplot.exe这种命令行形式的,不要用wgnupl32.exe,这个是图形界面的。

-log2c是给出参数c的范围和步长

-log2g是给出参数g的范围和步长

-log2p是给出参数p的范围和步长

上面三个参数可以用默认范围和步长

-s选择SVM类型,也是只能选3或者4

-t是选择核函数

-v 10 将训练数据分成10份做交叉验证。默认为5

最后给出归一化后训练数据的全路径

搜索最优参数的过程写入文件gridregression_feature.parameter(注意别少了这个>符号啊)

打开gridregression_feature.parameter,下面最后一行分别为c,g,p,mse。其中mse没有用,其实这个值越小越好。

根据搜索到的3个参数进行训练修改feature.scaled.model中的参数。

2.用svmpredict.exe进行预测

svmpredict.exe feature_test.scaled feature.scaled.model feature_test.predicted

其中feature_test.scaled是归一化后的测试特征文件名,feature.scaled.model是训练好的模型,SVM预测的值在feature_test.predicted中。
3.使用libsvm解决回归问题,入门视频详见http://www.tudou.com/programs/view/o0Xn1RzFhOw/

SVM分类与回归的更多相关文章

  1. 【Todo】【转载】Spark学习 & 机器学习(实战部分)-监督学习、分类与回归

    理论原理部分可以看这一篇:http://www.cnblogs.com/charlesblc/p/6109551.html 这里是实战部分.参考了 http://www.cnblogs.com/shi ...

  2. CART分类与回归树与GBDT(Gradient Boost Decision Tree)

    一.CART分类与回归树 资料转载: http://dataunion.org/5771.html        Classification And Regression Tree(CART)是决策 ...

  3. KNN与SVM对比&SVM与逻辑回归的对比

    首先说一下两种学习方式: lazy learning  和  eager learning. 先说 eager learning, 这种学习方式是指在进行某种判断(例如,确定一个点的分类或者回归中确定 ...

  4. SVM-支持向量机(二)非线性SVM分类

    非线性SVM分类 尽管SVM分类器非常高效,并且在很多场景下都非常实用.但是很多数据集并不是可以线性可分的.一个处理非线性数据集的方法是增加更多的特征,例如多项式特征.在某些情况下,这样可以让数据集变 ...

  5. SVM-支持向量机(一)线性SVM分类

    SVM-支持向量机 SVM(Support Vector Machine)-支持向量机,是一个功能非常强大的机器学习模型,可以处理线性与非线性的分类.回归,甚至是异常检测.它也是机器学习中非常热门的算 ...

  6. 【笔记】SVM思想解决回归问题

    使用svm思想解决回归问题 使用svm思想解决是如何解决回归问题,其中回归问题的本质就是找一条线,能够最好的拟合数据点 怎么定义拟合就是回归算法的关键,线性回归算法就是让预测的直线的MSE的值最小,对 ...

  7. SPSS数据分析—多分类Logistic回归模型

    前面我们说过二分类Logistic回归模型,但分类变量并不只是二分类一种,还有多分类,本次我们介绍当因变量为多分类时的Logistic回归模型. 多分类Logistic回归模型又分为有序多分类Logi ...

  8. CART分类与回归树 学习笔记

    CART:Classification and regression tree,分类与回归树.(是二叉树) CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成.它主要用来处理分类和回归问 ...

  9. 【机器学习笔记之三】CART 分类与回归树

    本文结构: CART算法有两步 回归树的生成 分类树的生成 剪枝 CART - Classification and Regression Trees 分类与回归树,是二叉树,可以用于分类,也可以用于 ...

随机推荐

  1. setAttribute()

    ●节点分为不同的类型:元素节点.属性节点和文本节点等.   ●getElementById()方法将返回一个对象,该对象对应着文档里的一个特定的元素节点.   ●getElementsByTagNam ...

  2. AngularJS过滤器filter-保留小数,小数点-$filter

    AngularJS      保留小数 默认是保留3位 固定的套路是 {{deom | number:4}} 意思就是保留小数点 的后四位 在渲染页面的时候 加入这儿个代码 用来精确浮点数,指定小数点 ...

  3. 如何选择PHP框架?

    PHP是世界上最受欢迎的编程语言之—.最近发布的PHP7令这种服务器的编程语言比以前变得更好,更稳定了. PHP被广泛应用于重大的项目.例如Facebook就是使用PHP来维护和创建它们的内部系统的. ...

  4. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  5. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

  6. 【NLP】前戏:一起走进条件随机场(一)

    前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...

  7. windows下mongodb配置

    打开cmd(windows键+r输入cmd)命令行,进入D:\mongodb\bin目录(如图先输入d:进入d盘然后输入cd d:\mongodb\bin), 输入如下的命令启动mongodb服务: ...

  8. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  9. 【Knockout.js 学习体验之旅】(3)模板绑定

    本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...

  10. 作为前端应当了解的Web缓存知识

    缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备.对于前端开发者来说,浏览器充当了重要角色.除此外常见的还有各种各样的代理服务器也可以做缓存.当Web请求到达缓存时, ...