Libsvm网格参数寻优教程

2023-05-16

原文:http://endual.iteye.com/blog/1262010

首先下载Libsvm、Python和Gnuplot:

l         libsvm的主页http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下载libsvm (我自己用2.86版本)

l         python的主页http://www.python.org下载 python (我自己用2.5版本)

l         gnuplot的主页http://www.gnuplot.info/下载gnuplot  (我用4.0版本)

LIBSVM 使用的一般步骤是:

1)按照LIBSVM软件包所要求的格式准备数据集;                                   

2)对数据进行简单的缩放操作;                                  

3)首要考虑选用RBF 核函数;

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

5)采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;

6)利用获取的模型进行测试与预测。

1)LIBSVM使用的数据格式

    该软件使用的训练数据和检验数据文件格式如下:

[label] [index1]:[value1] [index2]:[value2] ...

[label] [index1]:[value1] [index2]:[value2] ...

一行一条记录数据,如:

+1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1

这里(x,y)à((0.708,1,1, -0.320, -0.105, -1), +1)

label 或说是class, 就是你要分类的种类,通常是一些整数。

index 是有順序的索引,通常是连续的整数。

value 就是用来 train 的数据,通常是一堆实数。

2)对数据进行简单的缩放操作

    扫描数据. 因为原始数据可能范围过大或过小, svmscale可以先将数据重新scale (縮放) 到适当范围使训练与预测速度更快。

    svmscale.exe的用法:svmscale.exe feature.txt feature.scaled

默认的归一化范围是[-1,1],可以用参数-l和-u分别调整上界和下届,feature.txt是输入特征文件名 输出的归一化特征名为feature.scaled

3) 考虑选用RBF 核函数

训练数据形成模型(model),实质是算出了wx+b=0中的w,b.

Svmtrain的用法:svmtrain [options] training_set_file [model_file]

其中options涵义如下:

-s svm类型:设置SVM 类型,默认值为0,可选类型有:

0 -- C- SVC

1 -- nu - SVC

2 -- one-class-SVM

3 -- e - SVR

4 -- nu-SVR

-t 核函数类型:设置核函数类型,默认值为2,可选类型有:

0 -- 线性核:u'*v

1 -- 多项式核:(g*u'*v+ coef0)degree

2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)

3 -- sigmoid 核:tanh(g*u'*v+ coef 0)

-d degree:核函数中的degree设置,默认值为3;

-g r(gama):核函数中的函数设置(默认1/ k);

-r coef 0:设置核函数中的coef0,默认值为0;

-c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;

-n nu :设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值0.5;

-p e :核宽,设置e - SVR的损失函数中的e ,默认值为0.1;

-m cachesize:设置cache内存大小,以MB为单位(默认40):

-e e :设置终止准则中的可容忍偏差,默认值为0.001;

-h shrinking:是否使用启发式,可选值为0 或1,默认值为1;

-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;

-wi weight:对各类样本的惩罚系数C加权,默认值为1;

-v n:n折交叉验证模式。

其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据 集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。举个例子如下:

C:\libsvm-2.85\windows>svmtrain heart_scale

*

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

现简单对屏幕回显信息进行说明:

#iter为迭代次数,

nu 与前面的操作参数-n nu 相同,

obj为SVM文件转换为的二次规划求解得到的最小值,

rho 为判决函数的常数项b,

nSV 为支持向量个数,

nBSV为边界上的支持向量个数,

Total nSV为支持向量总个数。

训练后的模型保存为文件*.model,用记事本打开其内容如下:

svm_type c_svc % 训练所采用的svm类型,此处为C- SVC

kernel_type rbf %训练采用的核函数类型,此处为RBF核

gamma 0.0769231 %设置核函数中的g ,默认值为1/ k

nr_class 2 %分类时的类别数,此处为两分类问题

total_sv 132 %总共的支持向量个数

rho 0.424462 %决策函数中的常数项b

label 1 -1%类别标签

nr_sv 64 68 %各类别标签对应的支持向量个数

SV %以下为支持向量

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

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

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

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

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

    通常而言,比较重要的参数是 gamma (-g) 跟 cost (-c) 。而 cross validation (-v)

的参数常用5。那么如何去选取最优的参数c和g呢?libsvm 的 python 子目录下面的 grid.py 可以帮助我们。 此时。其中安装python2.5需要(一般默认安装到c:\python25

下),将gnuplot解压。安装解压完毕后,进入\libsvm\tools目录下,用文本编辑器(记事

本,edit都可以)修改grid.py文件,找到其中关于gnuplot路径的那项(其默认路径为

gnuplot_exe=r"c:\tmp\gnuplot\bin\pgnuplot.exe"),根据实际路径进行修改,并保存。然

后,将grid.py和C:\Python25目录下的python.exe文件拷贝到libsvm\windows目录下,键入以下命令:$ python grid.py train.1.scale 执行后,即可得到最优参数c和g。

    另外,至于下libsvm和python的接口的问题,在libsvm2.86中林老师已经帮助我们解决,在\libsvm\windows\python目录下自带了svmc.pyd这个文件,将该文件文件复制到

libsvm\python目录下,同时,也将python.exe文件复制到该目录下,键入以下命令以检验效

果(注意:.Py文件中关于gnuplot路径的那项路径一定要根据实际路径修改):

python svm_test.py

    如果能看到程序执行结果,说明libsvm和python之间的接口已经配置完成,以后就可以直接在python程序里调用libsvm的函数了!

5) 采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型

   $ svmtrain –c x –g x –v x training_set_file [model_file]

   x为上述得到的最优参数c和g的值,v的值一般取5。

6)利用获取的模型进行测试与预测

使用Svmtrain训练好的模型进行测试。输入新的X值,给出SVM预测出的Y值

$ Svmpredict  test_file  model_file  output_file

如:./svm-predict heart_scale heart_scale.model heart_scale.out

Accuracy = 86.6667% (234/270) (classification)

这里显示的是结果

一个具体使用的例子。

    以libsvm中的heart_scale作为训练数据和测试数据,同时已经将python安装至c盘,并将grid.py文件中关于gnuplot路径的默认值修改为实际解压缩后的路径,将

heart_scale、grid.py和python.exe拷贝至\libsvm\windows文件夹下。

./svm-train heart_scale

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

此时,已经得到heart_scale.model,进行预测:

./svm-predict heart_scale  heart_scale.model  heart_scale.out

Accuracy = 86.6667% (234/270) (classification)

正确率为Accuracy = 86.6667%。

./python grid.py heart_scale

得到最优参数c=2048,g=0.0001220703125.

./svm-train -c 2048 -g 0.0001220703125 heart_scale得到model后,由./svm-predict heart_scale  heart_scale.model heart_scale.out得到的正确

率为Accuracy = 85.1852%.这块还有点迷惑?为什么正确率降低了?


当然也可以结合subset.py 和 easy.py 实现自动化过程。

如果要训练多次,可以写个批处理程序省好多事。

这里举个例子:

::@ echo off
cls
:: split the data and output the results
for /L %%i in (1,1,1000) do python subset.py b59.txt 546 b59(%%i).in8 b59(%%i).out2

for /L %%i in (1,1,1000) do python easy.py b59(%%i).in8 b59(%%i).out2 >> result89.txt


这段批处理代码首先调用subset.py对文件b59.txt执行1000次分层随机抽样(对数据进行80-20%分割)然后调用easy.py 进行1000次参数寻优,把记录结果写到result89.txt中

(包括1000次训练的分类准确率和参数对)。

还可以调用fselect.py进行特征选择,调用plotroc.py进行roc曲线绘制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Libsvm网格参数寻优教程 的相关文章

  • 简述PHP执行流程

    目的 xff1a 本文主要介绍PHP执行流程 目的是梳理php代码是如何最终转换成为机器二进制指令而被执行的 参考文章 xff1a https blog csdn net diavid article details 81035188 PH
  • Java为啥比PHP快?

    一直都说php比java要慢 今天从理论跟实际测试看看php是否真的慢 慢在哪里 一 运行模式对比 java 一般用java 语言开发的网站项目都是以命令行模式运行 部分可能以可执行文件 xff08 exe xff09 的形式运行 php
  • PHP微服务 hyperf+nacos使用

    PHP微服务 hyperf 43 nacos使用 这里简单说下微服务 及架构方面东西 1 微服务对php 43 fpm 模式意义不是很大 原因就是php 43 fpm 天生支持模块拆分 热更新 如果只是性能上的考虑 那php 43 fpm
  • PHP项目临时拓容Nginx负载均衡实操记录

    项目域名 test baidu com 服务器A 127 0 0 1 内网ip 原有服务器 服务器B 172 30 228 254 内网ip 需求 项目本在服务器A中正常运行 现在临时搞活动 需要拓容一台 多台服务器 在最小成本跟改动下完成
  • layui templet中html标签获取js全局变量方法

    开发中涉及layui中 xff0c 在使用到table的模板方法时templet xff0c 会遇到其内部除了使用table field xff08 此处通过d 来获取 xff0c 就不啰嗦了 xff09 然后如果想获取某个外部js中的全局
  • PHP分布式部署代码同步Git实现

    PHP 分布式部署后 代码自动同步实现 项目架构如下 需要更新代码时我们只需要把代码传到主服务器后通过定时任务主服务器自动push 代码到Git服务端 之后其他从服务器则自动从Git云端拉取最新的代码即可 需要用到 expect 软件 安装
  • nginx 负载均衡502问题

    项目架构 nginx 43 php fpm 负载均衡 负载均衡关键配置如下 引入负载均衡配置 include proxy conf 负载均衡 upstream test balance server 172 28 196 xxx 80 we
  • 用Android 动画 演示冒泡排序

    之前面试遇到的一道机试题 当时时间不够没有调出来 有时间把它整了一下 代码 public class MainActivity extends ActionBarActivity implements OnClickListener pri
  • 教你怎么阅读外文文献

    转载自 http www douban com group topic 14551517 NO 1 中科院大博士是如何进行文献检索和阅读的 xff08 好习惯受益终生 xff09 一 如何进行文献检索 我是学自然科学的 xff0c 平时确实
  • webpack打包时提示Invalid configuration object错误

    初学者如果是通过网上教程来学习webpack xff0c 第一次用webpack打包时通常会遇到下面这样的问题 xff1a 实际上出错信息已经说明了问题原因 xff1a Invalid configuration object Webpac
  • Maven核心概念(1)--坐标

    注 xff1a 转载时请注明原作者 lreis2010 及出处 http blog csdn net lreis2010 xff01 作者初次接触Maven是希望有一种方式能够自动化地管理项目中使用的Jar包 随着对于Maven的学习 xf
  • 【UML】四种关系

    一 在学习UML中的时候含有的四种关系是 xff1a 关联Association xff1a 是一种结构化的关系 xff0c 指一种对象和另一种对象有联系 xff0c 给定关联的两个类 xff0c 可以从其中的一个类的对象访问到另一个类的相
  • vnc,在windows系统上安装vnc,操作教程

    VNC是一款可以实现远程桌面控制 方面很实用的小工具 xff0c 今天给大家分享如何在在windows系统上安装vnc的操作方法 xff1a 小编在这里用到了 xff1a IIS7服务器管理工具来操作的 具体操作的如下 xff1a 一 首先
  • 51单片机手动自动智能窗户窗帘控制系统手动自动定时

    实践制作DIY GC 00 45 智能窗户窗帘控制系统 一 功能说明 xff1a 基于 51 单片机设计 智能窗户窗帘控制系统 二 功能介绍 xff1a STC89C52 AT89C52 系列最小系统板 43 5VUSB电源 43 ULN2
  • linux下 bash-completion 离线安装(Ubuntu或centos )

    bash completion 安装 实现k8s命令自动补全 xff0c 我们需要安装bash completion 在github下载离线包 下载地址解压 tar xvJf bash completion 2 11 tar xz 命令补全
  • ROS自定义地图(CAD、手绘等)

    0x00 概述 在前面的文章中 xff0c 我们介绍如何自动导航时 xff0c 都是基于使用gmapping或者hector mapping创建的地图 当然使用其他的建图方法创建的地图也可以 xff0c 但是目前为止 xff0c 无论使用哪
  • STM32 控制蜂鸣器播放音乐的原理和实例

    STM32 控制蜂鸣器播放音乐的原理和实例 本文通过将乐谱里的每个音符的声音频率和声音时长保存在两个数组里面 1 使用通用定时器TIM4实现无中断的微秒级延时函数 xff0c 控制每个音符的发声时长 2 使用系统滴答时钟Systick实现带
  • 影响力最大化——CELF算法的简介与python实现

    CELF算法是Leskovecl等人利用IC模型的子模特性对爬山贪心算法进一步改进得到的优化算法 子模函数的定义为 任意函数f 将有限集合映射为非负实数集并且满足收益递减特性即为子模函数 设集合s T xff0c 任意元素v添加到集合S中获
  • Qos队列调度算法(SP/WRR/DWRR)

    本文重点分析sonic中支持的三种Qos队列调度算法 xff1a 1 SP xff08 Strict Priority xff0c 严格优先级 xff09 也称为PQ xff08 Priority Queuing xff09 调度 xff0
  • python的MapReduce的应用案例

    在学习这个项目中用到许多数学公式 xff0c 有的自己不太懂 xff0c 所以上传上来进行实地应用 参考资料 generate train feature map py usr bin env python encoding 61 UTF

随机推荐