SVM分类与回归
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分类与回归的更多相关文章
- 【Todo】【转载】Spark学习 & 机器学习(实战部分)-监督学习、分类与回归
理论原理部分可以看这一篇:http://www.cnblogs.com/charlesblc/p/6109551.html 这里是实战部分.参考了 http://www.cnblogs.com/shi ...
- CART分类与回归树与GBDT(Gradient Boost Decision Tree)
一.CART分类与回归树 资料转载: http://dataunion.org/5771.html Classification And Regression Tree(CART)是决策 ...
- KNN与SVM对比&SVM与逻辑回归的对比
首先说一下两种学习方式: lazy learning 和 eager learning. 先说 eager learning, 这种学习方式是指在进行某种判断(例如,确定一个点的分类或者回归中确定 ...
- SVM-支持向量机(二)非线性SVM分类
非线性SVM分类 尽管SVM分类器非常高效,并且在很多场景下都非常实用.但是很多数据集并不是可以线性可分的.一个处理非线性数据集的方法是增加更多的特征,例如多项式特征.在某些情况下,这样可以让数据集变 ...
- SVM-支持向量机(一)线性SVM分类
SVM-支持向量机 SVM(Support Vector Machine)-支持向量机,是一个功能非常强大的机器学习模型,可以处理线性与非线性的分类.回归,甚至是异常检测.它也是机器学习中非常热门的算 ...
- 【笔记】SVM思想解决回归问题
使用svm思想解决回归问题 使用svm思想解决是如何解决回归问题,其中回归问题的本质就是找一条线,能够最好的拟合数据点 怎么定义拟合就是回归算法的关键,线性回归算法就是让预测的直线的MSE的值最小,对 ...
- SPSS数据分析—多分类Logistic回归模型
前面我们说过二分类Logistic回归模型,但分类变量并不只是二分类一种,还有多分类,本次我们介绍当因变量为多分类时的Logistic回归模型. 多分类Logistic回归模型又分为有序多分类Logi ...
- CART分类与回归树 学习笔记
CART:Classification and regression tree,分类与回归树.(是二叉树) CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成.它主要用来处理分类和回归问 ...
- 【机器学习笔记之三】CART 分类与回归树
本文结构: CART算法有两步 回归树的生成 分类树的生成 剪枝 CART - Classification and Regression Trees 分类与回归树,是二叉树,可以用于分类,也可以用于 ...
随机推荐
- CoreCLR源码探索(一) Object是什么
.Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...
- gentoo 安装
加载完光驱后 1进行ping命令查看网络是否通畅 2设置硬盘的标识为GPT(主要用于64位且启动模式为UEFI,还有一个是MBR,主要用于32位且启动模式为bois) parted -a optima ...
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- [BOT] 一种android中实现“圆角矩形”的方法
内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...
- [NodeJS] 优缺点及适用场景讨论
概述: NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. ...
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- Oracle 的基本操作符
!= 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...
- KV存储系统
现在的KV存储系统都是分布式的,首先介绍Zookeeper——针对大型分布式系统的高可靠的协调系统. 开发分布式系统是件很困难的事情,其中的困难主要体现在分布式系统的“部分失败”.“部分失败”是指信息 ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
- 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...