• 以前接触过libsvm,现在算在实际的应用中学习

  • LIBSVM 使用的一般步骤是:

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

参数认识

  • LIBSVM使用的数据格式该软件使用的训练数据和检验数据文件格式如下:
  1. [label] [index1]:[value1] [index2]:[value2] ...
  2. [label] [index1]:[value1] [index2]:[value2] ...
  • 考虑选用RBF 核函数,训练数据形成模型(model),实质是算出了wx+b=0中的w,b. Svmtrain的用法:svmtrain [options] training_set_file [model_file];其中options涵义如下:
  1. -s svm类型:设置SVM 类型,默认值为0,可选类型有:
  2. 0 -- C- SVC
  3. 1 -- nu - SVC
  4. 2 -- one-class-SVM
  5. 3 -- e - SVR
  6. 4 -- nu-SVR
  7. -t 核函数类型:设置核函数类型,默认值为2,可选类型有:
  8. 0 -- 线性核:u'*v
  9. 1 -- 多项式核:(g*u'*v+ coef0)degree
  10. 2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)
  11. 3 -- sigmoid 核:tanh(g*u'*v+ coef 0)
  12. -d degree:核函数中的degree设置,默认值为3;
  13. -g r(gama):核函数中的函数设置(默认1/ k);
  14. -r coef 0:设置核函数中的coef0,默认值为0;
  15. -c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;
  16. -n nu :设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值0.5;
  17. -p e :核宽,设置e - SVR的损失函数中的e ,默认值为0.1;
  18. -m cachesize:设置cache内存大小,以MB为单位(默认40):
  19. -e e :设置终止准则中的可容忍偏差,默认值为0.001;
  20. -h shrinking:是否使用启发式,可选值为0 或1,默认值为1;
  21. -b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;
  22. -wi weight:对各类样本的惩罚系数C加权,默认值为1;
  23. -v n:n折交叉验证模式。
  • 其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

  • 举个例子如下:

  1. *
  2. optimization finished, #iter = 162
  3. nu = 0.431029
  4. obj = -100.877288, rho = 0.424462
  5. nSV = 132, nBSV = 107
  6. Total nSV = 132
  7. 现简单对屏幕回显信息进行说明:
  8. #iter为迭代次数,
  9. nu 与前面的操作参数-n nu 相同,
  10. objSVM文件转换为的二次规划求解得到的最小值,
  11. rho 为判决函数的常数项b
  12. nSV 为支持向量个数,
  13. nBSV为边界上的支持向量个数,
  14. Total nSV为支持向量总个数。
  15. 训练后的模型保存为文件*.model,用记事本打开其内容如下:
  16. svm_type c_svc % 训练所采用的svm类型,此处为C- SVC
  17. kernel_type rbf %训练采用的核函数类型,此处为RBF
  18. gamma 0.0769231 %设置核函数中的g ,默认值为1/ k
  19. nr_class 2 %分类时的类别数,此处为两分类问题
  20. total_sv 132 %总共的支持向量个数
  21. rho 0.424462 %决策函数中的常数项b
  22. label 1 -1%类别标签
  23. nr_sv 64 68 %各类别标签对应的支持向量个数
  24. SV %以下为支持向量
  25. 1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1
  26. 0.5104832128985164 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5
  27. 1 1:0.333333 2:1 3:-1 4:-0.245283 5:-0.506849 6:-1 7:-1 8:0.129771 9:-1 10:-0.16129 12:0.333333 13:-1
  28. 1 1:0.208333 2:1 3:0.333333 4:-0.660377 5:-0.525114 6:-1 7:1 8:0.435115 9:-1 10:-0.193548 12:-0.333333 13:1

采用交叉验证选择最佳参数C与g

  • 通常而言,比较重要的参数是 gamma (-g) 跟 cost (-c) 。而 cross validation (-v)的参数常用5。那么如何去选取最优的参数c和g呢?libsvm 的 python 子目录下面的 grid.py 可以帮助我们。

采用的方法

  • 网格参数寻优函数(分类问题):SVMcgForClass
  1. [bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
  2. 输入:
  3. train_label:训练集的标签,格式要求与svmtrain相同。
  4. train:训练集,格式要求与svmtrain相同。
  5. cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
  6. gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
  7. v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3CV过程。
  8. cstep,gstep:进行参数寻优是cg的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1
  9. accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5
  10. 输出:
  11. bestCVaccuracy:最终CV意义下的最佳分类准确率。
  12. bestc:最佳的参数c
  13. bestg:最佳的参数g
  • 网格参数寻优函数(回归问题):SVMcgForRegress
  1. [bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)其输入输出与SVMcgForClass类似,这里不再赘述。
  2. 而当你训练完了model,在用它做classificationregression之前,应该知道model中的内容,以及其含义。
  3. 用来训练的是libsvm自带的heart数据
  4. model =
  5. Parameters: [5x1 double]
  6. nr_class: 2
  7. totalSV: 259 % 支持向量的数目
  8. rho: 0.0514 % b
  9. Label: [2x1 double] % classification中标签的个数
  10. ProbA: []
  11. ProbB: []
  12. nSV: [2x1 double] % 每类支持向量的个数
  13. sv_coef: [259x1 double] % 支持向量对应的Wi
  14. SVs: [259x13 double] % 装的是259个支持向量
  15. model.Parameters参数意义从上到下依次为:
  16. -s svm类型:SVM设置类型(默认0)
  17. -t 核函数类型:核函数设置类型(默认2)
  18. -d degree:核函数中的degree设置(针对多项式核函数)(默认3)
  19. -g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)
  20. -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
  1. function [mse,bestc,bestg] = SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
  2. %SVMcg cross validation by faruto
  3. %% 若转载请注明:
  4. % faruto and liyang , LIBSVM-farutoUltimateVersion
  5. % a toolbox with implements for support vector machines based on libsvm, 2009.
  6. % Software available at http://www.ilovematlab.cn
  7. %
  8. % Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for
  9. % support vector machines, 2001. Software available at
  10. % http://www.csie.ntu.edu.tw/~cjlin/libsvm
  11. %% about the parameters of SVMcg
  12. if nargin < 10
  13. msestep = 0.06;
  14. end
  15. if nargin < 8
  16. cstep = 0.8;
  17. gstep = 0.8;
  18. end
  19. if nargin < 7
  20. v = 5;
  21. end
  22. if nargin < 5
  23. gmax = 8;
  24. gmin = -8;
  25. end
  26. if nargin < 3
  27. cmax = 8;
  28. cmin = -8;
  29. end
  30. %% X:c Y:g cg:acc
  31. [X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
  32. [m,n] = size(X);
  33. cg = zeros(m,n);
  34. eps = 10^(-4);
  35. %% record acc with different c & g,and find the bestacc with the smallest c
  36. bestc = 0;
  37. bestg = 0;
  38. mse = Inf;
  39. basenum = 2;
  40. for i = 1:m
  41. for j = 1:n
  42. cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) ),' -s 3 -p 0.1'];
  43. cg(i,j) = svmtrain(train_label, train, cmd);
  44. if cg(i,j) < mse
  45. mse = cg(i,j);
  46. bestc = basenum^X(i,j);
  47. bestg = basenum^Y(i,j);
  48. end
  49. if abs( cg(i,j)-mse )<=eps && bestc > basenum^X(i,j)
  50. mse = cg(i,j);
  51. bestc = basenum^X(i,j);
  52. bestg = basenum^Y(i,j);
  53. end
  54. end
  55. end
  56. %% to draw the acc with different c & g
  57. [cg,ps] = mapminmax(cg,0,1);
  58. figure;
  59. [C,h] = contour(X,Y,cg,0:msestep:0.5);
  60. clabel(C,h,'FontSize',10,'Color','r');
  61. xlabel('log2c','FontSize',12);
  62. ylabel('log2g','FontSize',12);
  63. firstline = 'SVR参数选择结果图(等高线图)[GridSearchMethod]';
  64. secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
  65. ' CVmse=',num2str(mse)];
  66. title({firstline;secondline},'Fontsize',12);
  67. grid on;
  68. figure;
  69. meshc(X,Y,cg);
  70. % mesh(X,Y,cg);
  71. % surf(X,Y,cg);
  72. axis([cmin,cmax,gmin,gmax,0,1]);
  73. xlabel('log2c','FontSize',12);
  74. ylabel('log2g','FontSize',12);
  75. zlabel('MSE','FontSize',12);
  76. firstline = 'SVR参数选择结果图(3D视图)[GridSearchMethod]';
  77. secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
  78. ' CVmse=',num2str(mse)];
  79. title({firstline;secondline},'Fontsize',12);
  • 分类问题,简单易用,且有可视化
  1. function [bestacc,bestc,bestg] = SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
  2. %SVMcg cross validation by faruto
  3. %% 若转载请注明:
  4. % faruto and liyang , LIBSVM-farutoUltimateVersion
  5. % a toolbox with implements for support vector machines based on libsvm, 2009.
  6. % Software available at http://www.ilovematlab.cn
  7. %
  8. % Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for
  9. % support vector machines, 2001. Software available at
  10. % http://www.csie.ntu.edu.tw/~cjlin/libsvm
  11. %% about the parameters of SVMcg
  12. if nargin < 10
  13. accstep = 4.5;
  14. end
  15. if nargin < 8
  16. cstep = 0.8;
  17. gstep = 0.8;
  18. end
  19. if nargin < 7
  20. v = 5;
  21. end
  22. if nargin < 5
  23. gmax = 8;
  24. gmin = -8;
  25. end
  26. if nargin < 3
  27. cmax = 8;
  28. cmin = -8;
  29. end
  30. %% X:c Y:g cg:CVaccuracy
  31. [X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
  32. [m,n] = size(X);
  33. cg = zeros(m,n);
  34. eps = 10^(-4);
  35. %% record acc with different c & g,and find the bestacc with the smallest c
  36. bestc = 1;
  37. bestg = 0.1;
  38. bestacc = 0;
  39. basenum = 2;
  40. for i = 1:m
  41. for j = 1:n
  42. cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) )];
  43. cg(i,j) = svmtrain(train_label, train, cmd);
  44. if cg(i,j) <= 55
  45. continue;
  46. end
  47. if cg(i,j) > bestacc
  48. bestacc = cg(i,j);
  49. bestc = basenum^X(i,j);
  50. bestg = basenum^Y(i,j);
  51. end
  52. if abs( cg(i,j)-bestacc )<=eps && bestc > basenum^X(i,j)
  53. bestacc = cg(i,j);
  54. bestc = basenum^X(i,j);
  55. bestg = basenum^Y(i,j);
  56. end
  57. end
  58. end
  59. %% to draw the acc with different c & g
  60. figure;
  61. [C,h] = contour(X,Y,cg,70:accstep:100);
  62. clabel(C,h,'Color','r');
  63. xlabel('log2c','FontSize',12);
  64. ylabel('log2g','FontSize',12);
  65. firstline = 'SVC参数选择结果图(等高线图)[GridSearchMethod]';
  66. secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
  67. ' CVAccuracy=',num2str(bestacc),'%'];
  68. title({firstline;secondline},'Fontsize',12);
  69. grid on;
  70. figure;
  71. meshc(X,Y,cg);
  72. % mesh(X,Y,cg);
  73. % surf(X,Y,cg);
  74. axis([cmin,cmax,gmin,gmax,30,100]);
  75. xlabel('log2c','FontSize',12);
  76. ylabel('log2g','FontSize',12);
  77. zlabel('Accuracy(%)','FontSize',12);
  78. firstline = 'SVC参数选择结果图(3D视图)[GridSearchMethod]';
  79. secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
  80. ' CVAccuracy=',num2str(bestacc),'%'];
  81. title({firstline;secondline},'Fontsize',12);

Reference

libsvm参数选择的更多相关文章

  1. libSVM 参数选择

    libSVM 参数选择  [预测标签,准确率,决策值]=svmpredict(测试标签,测试数据,训练的模型);    原文参考:http://blog.csdn.net/carson2005/art ...

  2. libsvm交叉验证与网格搜索(参数选择)

    首先说交叉验证.交叉验证(Cross validation)是一种评估统计分析.机器学习算法对独立于训练数据的数据集的泛化能力(generalize), 能够避免过拟合问题.交叉验证一般要尽量满足:1 ...

  3. libsvm的安装,数据格式,常见错误,grid.py参数选择,c-SVC过程,libsvm参数解释,svm训练数据,libsvm的使用详解,SVM核函数的选择

    直接conda install libsvm安装的不完整,缺几个.py文件. 第一种安装方法: 下载:http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm. ...

  4. Libliner 中的-s 参数选择:primal 和dual

    Libliner 中的-s 参数选择:primal 和dual LIBLINEAR的优化算法主要分为两大类,即求解原问题(primal problem)和对偶问题(dual problem).求解原问 ...

  5. 支持向量机SVM 参数选择

    http://ju.outofmemory.cn/entry/119152 http://www.cnblogs.com/zhizhan/p/4412343.html 支持向量机SVM是从线性可分情况 ...

  6. paper 127:机器学习中的范数规则化之(二)核范数与规则项参数选择

    机器学习中的范数规则化之(二)核范数与规则项参数选择 zouxy09@qq.com http://blog.csdn.net/zouxy09 上一篇博文,我们聊到了L0,L1和L2范数,这篇我们絮叨絮 ...

  7. adaboost 参数选择

    先看下ababoost和决策树效果对比 import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection ...

  8. 支持向量机(SVM)利用网格搜索和交叉验证进行参数选择

    上一回有个读者问我:回归模型与分类模型的区别在哪?有什么不同,我在这里给他回答一下 : : : : 回归问题通常是用来预测一个值,如预测房价.未来的天气情况等等,例如一个产品的实际价格为500元,通过 ...

  9. 机器学习中的范数规则化 L0、L1与L2范数 核范数与规则项参数选择

    http://blog.csdn.net/zouxy09/article/details/24971995 机器学习中的范数规则化之(一)L0.L1与L2范数 zouxy09@qq.com http: ...

随机推荐

  1. Shell常见用法小记

    shell的简单使用 最近发现shell脚本在平常工作中简直算一把瑞士军刀,很多场景下用shell脚本能实现常用的简单需求,而之前都没怎么学习过shell,就趁机把shell相关的语法和常见用法总结了 ...

  2. 学习smart gwt 的一些好的网站

    最近在学smart gwt,这个框架和我们比较熟悉的SSH实现思路上有点不一样,因为技术是外国的,所以好多东西都是英文的,正因为是英文的,我们学到的东西才是最多最好的,好了,网站如下: gwt api ...

  3. 转载linux c语言程序的Makefile编写

    对于程序设计员来说,makefile是我们绕不过去的一个坎.可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓.毕竟工具本身已经帮我们做好了全部的编译流程.但是在Linux上 ...

  4. 动态代理的两种实现方式(JDK/Cglib)

    =========================================== 原文链接: 动态代理的两种实现方式(JDK/Cglib) 转载请注明出处! ================== ...

  5. Java进阶之多线程

    多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式. 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令.单线程好像是一个只有一个队长指挥的小队,整个小队 ...

  6. ecshop SQL注入漏洞导致代码执行

    漏洞名称:ecshop SQL注入漏洞导致代码执行补丁编号:11208761补丁文件:/includes/libinsert.php补丁来源:云盾自研漏洞描述:ecshop的/includes/lib ...

  7. SQL Server-基础-经典SQL语句

    经典SQL语句 基础 .说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server - ...

  8. poj 1721 CARDS (置换群)

    题意:给你一个数列,第i号位置的数位a[i],现在将数列进行交换,交换规则为a[i]=a[a[i]]:已知交换s次之后的序列,求原先序列 思路:置换的问题必然存在一个循环节,使一个数列交换n次回到原来 ...

  9. jdk动态代理与cglib代理、spring aop代理实现原理

    原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...

  10. Unity Android路径及注意事项

    Application.temporaryCachePath==/storage/emulated/0/Android/data/com.***.***/cache Application.persi ...