SVM分类与回归

时间:2022-02-23 07:04:06

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没有用,其实这个值越小越好。

SVM分类与回归

根据搜索到的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. 判断密文加密类型hash-identifier

    判断密文加密类型hash-identifier   在安全领域中,加密数据随处可见.而在这些数据中,重要的数据往往采用哈希算法进行加密.例如,Linux密码使用sha512,Windows密码采用LM ...

  2. Spring+SpringMVC+MyBatis+easyUI整合基础篇

    基础篇 Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简介 Spring+SpringMVC+MyBatis+easyUI整合基础篇(二)牛刀小试 Spring+S ...

  3. vue命名视图实现经典布局

    vue命名视图实现经典布局 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  4. php 连接 数据库

    $mysql_server_name='localhost'; //改成自己的mysql数据库服务器 $mysql_username='root'; //改成自己的mysql数据库用户名 mysql默 ...

  5. js el jstl list 循环

    需要在js中获取从Controller传过来的list集合,通过循环遍历找到对应的值,赋值到指定input框中 刚开始做法: for (var h = 0; h < gradesize; h++ ...

  6. js判断类型的方法

    //判断类型 var arr=[]; Object.prototype.toString.call(arr)=='[object Array]' //判断是否是包含关系 function elCont ...

  7. MyEclipse 智能提示设置

    在实际的开发当中,编译器没有智能提示,确实是效率很低,下面我就给大家讲一下在MyEclipse中设置智能提示,方便大家的开发,希望能帮到大家. 方法一:首先,在MyEclipse的菜单栏中找到wind ...

  8. &lbrack;zabbix&rsqb; zabbix从内部检测web页面

    环境说明: 两台机器各运行一个tomcat实例,通过阿里云slb到后端,假设后端服务挂了一个,从外部访问整个服务还是可用的,所以需要从内部检测web页面. zabbix自带的web场景都是从外部检测w ...

  9. 【洛谷 P4568】 &lbrack;JLOI2011&rsqb;飞行路线 (分层最短路)

    题目链接 分层图最短路. 把每个点拆成\(k+1\)个点,表示总共有\(k+1\)层. 然后每层正常连边, 若\((u,v)\)有边,则把每一层的\(u\)和下一层的\(v\).每一层的\(v\)和下 ...

  10. mysql数据操作

    了解:Mysql 账号相关 创建账号: 权限:user(所有库的权限)-->db(某个库的权限)-->table_priv(某张表的权限) -->columns_oriv(某个字段的 ...