机器学习和生物信息学实验室联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 13375|回复: 12
打印 上一主题 下一主题

libsvm学习笔记

  [复制链接]
跳转到指定楼层
楼主
发表于 2012-7-10 21:19:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小疯纸一枚 于 2012-7-10 21:25 编辑

菜青虫学libsvm ,果然是艰难困苦哦……一开始都不知道基本概念……记了些入门笔记,怕自己忘了


软件: libsvm , python ,gnuplot

gnuplot (解压,不需安装)
Libsvm(解压,不需安装)
Python(从75  /share/软件  下载,安装)  

文档目录:
一、基本概念
二、libsvm 操作简介
三、步骤总结

一  基本概念:
    训练集,测试集,SVM,svmtrain,svmpredict,svmscale,数据格式,
     参数,交叉验证 cross validation

    训练集、测试集:训练集用于建立模型,测试集评估模型的预测等能力。
                        (好吧,通俗易懂不知道准不准确)
    SVM:(support vector machine)现在最常拿来做分类,也就是说有一堆已经分好类的东西(分类依据是未知的),
                当收新的东西,SVM可以预测新的数据分到哪一类。
     数据格式:[label]   [Index1]:[value1]  [index2]:[value2]  [index3]:[value3]
                      [label]:类别(通常是整数)[index n]: 有顺序的索引 [value n]: 用来train的数据
                    为什么用这种格式?
                   Support vector machine ,vector(向量)也就是一排的x1,x2,x3…。x[n]中的n即为index n , 值为value n。
                   这种格式的最大好处就是可以使用spare matrix(稀疏矩阵),即有些data 的属性值可以不存在。

      Svmtrain:train 会接受特定格式的输入,产生一个model 文件,这个model可以想象成是svm 的内部文件,
                  因为predict要   model 才能预测,而不能直接使用原始文件。
      Svmtrain语法:svmtrain  [option]  train_file  [model_file]

      Svmpredict:依照已经train好的model ,输入新的数据,并输出预测新数据的类别。
      Svmpredict语法:svmpredict     test_file       mode_file    output_file
                                                       要预测的数据     规则文件    输出结果
                                predict 完后,会顺便拿predict出来的值跟test_file 里面写的值去做比对,
                               这就是说,假设当test_file 中的  label 是真正的分类结果,
                               拿出来跟predict的结果比对,就可以知道predict 有没有猜 对,即显示预测的准确率。

      Svmscale: 因为原始数据特征可能范围过大或过小,svmscale可以先将数据重新scale(缩放)到适当范围。
                      适当的scale 有助    于参数的选择,还有解svm 的速度。
                      Svmscale 会对每个attribute 做scale ,通常是范围[0,1] 或[-1,1],并且测试数据和训练数据要一起scale。
      交叉验证(cross validation)
                      1、把数据集分开轮流做训练集和测试集;
                      2、用某组参数去train并predict别组看正确率;
                      3、正确率不够的话,换参数再重复train/predict;
                      4、找到一组不错的参数后,拿这组参数建model 并用来对最后知数据的predict;
                     n 重交叉验证法(n-fold cross validation):可用svmtrain内置的cross validation功能 -v n
                     n是拆分的组数:比如n=3,首先拿1,2来train 并predict 3;
                                                                 其次拿2,3来train 并predict 1;
                                                                 最后拿1,3来train 并predict 2;
       参数:比较重要的参数是gamma(-g)和cost (-c) ,
                  cost 的预设值是1,gamma预设值是1/k , k 是输入数据的数据的记录数(??)
       参数的获取:自己try 出来??!!!这样啊!!
                  Try 参数过程常用指数变化的方式来增加与减少参数的数值,因为有两组参数所以等于要try n*n=n^2次,
                  这个过程是离散的,可以想象成假设在x,y平面上指定的范围内有一群格点(grid),
                 每个格点的x,y经过换算(2^x , 2^y)就拿去当cost 和gamma的值来cross validation 。
               (libsvm的python 目录下有个grid.py 既是自动执行上述过程)。
二、libsvm 操作简介   
        过程:写程序输出正确格式的数据 -> 归一化(可选)-> 训练 -> 预测 -> 获得结果

         这里的软件都安装解压在E盘(习惯了)
         1、获得数据(没有现成数据可以先这样玩玩)
         点击E:\libsvm\libsvm-2.86\windows\svm-toy.exe
        (也可以在cmd 中进入E:\libsvm\libsvm-2.86\windows>svm-toy.exe 运行过程如图5)跳出如下图1,
          点击左下方的change 改变点的颜色,然后随便乱点啦,图2 .点击run 获得 图3(根据点的颜色不同分类)
         
         
         
          点击sava 把数据导出 存为test ,获得如下图所示数据
         
          Cmd 中运行 svm-toy.exe (从C盘到E盘直接 > E: 就ok了,开始我还真不懂,心虚ing)
         
          2、归一化(跳过)
          3、训练:E:\libsvm\libsvm-2.86\windows\svm-train.exe  test ,目录下生成.moedel 文件
         
          4、预测:E:\libsvm\libsvm-2.86\windows>svm-predict.exe test test.model test.out , 目录下生成,
                test.out 文件就 是预测结果
           
         打开,就是分类后的结果
         
          4、用grid 优化 libsvm
                <1>、把 E:\libsvm\libsvm-2.86\tools 目录下的 grid.py 复制到E:\libsvm\libsvm-2.86\windows
                <2>、编辑gird.py  在else 的地方
            
                <3>、进入pythoon 的安装目录
                          cd  E:\python
            
            前面两个分别是c 跟g , 再用这组参数train 一下看看效果:
            回到libsvm 的 windows 目录
            
            之后再 predict 一下
            
            在grid 之前是52.9412% 很明显有很大的提升哦!!!!!!!
            
            从图上的效果看……也比之前的精确了一些些……
            补充: scale 用法
            Svmscale 用来调整特征的大小范围,如果的特征变化范围不大,尽量不要归一化。
            训练数据和测试数据要一起归一化,
            同时归一化test data 和 train data 的方法(目前还没用到,没试过,心虚ing)
            E:\libsvm\libsvm-2.86\windows>svm-scale.exe  –s  scale  train_data  >  train_data .scale
            E:\libsvm\libsvm-2.86\windows>svm-scale.exe  –r  scale  test_data  >  test_data.scale
三 步骤总结
         获得特定格式的数据
         xfz_test 为测试集,xfz_train 为训练集
         E:\libsvm\libsvm-2.86\windows\svm-scale.exe –s scale xfz_test>xfz_test.scale
         E:\libsvm\libsvm-2.86\windows\svm-scale.exe –r scale xfz_train>xfz_train.scale
         E:\python>phthon E:\……\windows\grid.py E:\……\windows\xfz_test.scale
         获得  c g
         E:\libsvm\libsvm-2.86\windows>svm-train –c XXX –g  XXX  xfz_test.scale
         E:\libsvm\libsvm-2.86\windows>svm-predict  xfz_train.scale xfz_test.scale.model  xfz_test.scale.out
         Accuracy=XXXXX.XXXXXXXXXXX%

         上述过程也可以直接用一行指令
          E:\python>python  (路径名)\easy.py  (路径名)\xfz_test  (路径名)\xfz_train
         前提是:把libsvm 中tool 目录下的easy.py 复制到指定目录,打开并修改参数:
         
         
                                                                                                                 --------by MYZ   xiaofengzi

参考文献:http://datamining.xmu.edu.cn/bbs/forum.php?mod=viewthread&tid=115&extra=page%3D1
                  
                        
软件:
         

libsvm学习笔记:
         


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

沙发
发表于 2012-7-11 14:45:06 | 只看该作者
提示: 该帖被管理员或版主屏蔽
回复 支持 反对

使用道具 举报

板凳
发表于 2012-10-25 10:12:33 | 只看该作者
本帖最后由 cwc 于 2012-10-25 10:15 编辑

楼主貌似把训练集跟测试集搞反了。。。
现在只能得到训练集的最佳参数,不知能不能得到以测试集为基准的的最佳参数

点评

如果以测试集为基准的最佳参数,那就相当于作弊了,测试集就没有价值了。 如果只用测试集的特征数据,不用测试集的类别标签数据,这种称为直推式学习。  发表于 2015-11-5 23:11
回复 支持 反对

使用道具 举报

地板
发表于 2012-10-30 10:31:00 | 只看该作者
提示: 该帖被管理员或版主屏蔽
回复 支持 反对

使用道具 举报

5#
发表于 2012-10-30 11:03:30 | 只看该作者
本帖最后由 chenwq 于 2012-10-30 11:04 编辑

"当收新的东西,SVM可以预测新的数据分到哪一类"
误会了~ 我以为libsvm什么时候支持incremental/online learning了。

下面两篇文章里有实现:
Gert Cauwenbergh's 2000 NIPS paper (with code) http://www.isn.ucsd.edu/svm/incremental/
SVM Heavy http://people.eng.unimelb.edu.au/shiltona/svm/

两种方法分别是:KNN和Storing counts ,额,现在看貌似都是这么做的。已经成为一个显然的trick了。(待考证)
回复 支持 反对

使用道具 举报

7#
发表于 2015-5-31 15:22:07 | 只看该作者

libSVM的参数优化

本帖最后由 guojiasheng 于 2016-5-26 13:48 编辑

附件是自己用python写的采用粒子群算法寻找libSVM参数的代码,大家参考参考~~~~~~~
解压附件后包括几个.py文件。


这个可能之前没有注意到,就是这边我们还是采用libsvm的库,所以使用之前还是需要安装相应的libsvm包,然后才可以在python中调用libsvm。
不同的python版本还不太一样,有32位,64位的,主要看你安装的libsvm是多少位的,否则会出现libsvm.dll not find问题。其实路径是对的,但是可能libsvm.dll 是32位,你运行的python又是64位,会造成版本不一致。 我这边把自己本地使用的libsvm一起打包上传了。我的python环境是32位,libsvm
也是32位的。libsvm.dll的路径可以到svm.py里面配置,而且是支持window和linux(c)的



1.arff2svm.py是将.arff文件转换为libsvm支持的格式。
   使用方法:
   进入相应的目录,敲如下命令
   python arff2svm.py -i inputfile -o outpufile
   
   inputfile:需要转换的.arff文件
   outputfile:转换后的,libsvm可支持的文件

2.pso.py 需找svm的最优参数:
   使用方法:
   进入相应的目录,敲如下命令
   python pso.py -i inputfile -n psoNum -t iterationNum

  inputfile:训练文件
  posNum:粒子群个数
  iterationNum:迭代次数

测试数据bupa.arff
实用libsvm自带的grid.py的寻找结果为:


以下是实用pso.py的svm参数寻找结果(python pso.py -i D://bupa.txt -n 10 -t 10):

使用方法:
Libsvm使用方法:
        1.简单使用 可以参照libsvm-3.21里面的官方README
         主要包括:
          (1)svm-scale:This is a tool for scaling input data file,这步还是很关键的,就简单认为是数据pre处理吧(scale的一个范围里面).
          (2)svm-train: 可以选择不同的参数比如 g c k这样的(选择不同的核函数很关键)
          (3)svm-predict: 这个就是预测了
        这边在linux下面,所以就使用c的版本。
     
    2.参数优化是关键:
       (1)libsvm自带的的一个grid search 的python方法。其实就是一个网格搜索g c,稍微比穷举好一些而已,具体的步长大家可以自己去看。
                        这个在路径tools下面。
                        easy.py , grid.py
                        直接运行easy.py即可,它会调用grid.py去需找g c。
                        python easy.py ../heart_scale 即可
                        事实上这边应该还包括gunplot,一个画等高线的包,这边我注释掉了。一定要用也可以,我安装在libsvm-3.21/otherSoft/gnuplot下面。
          (2) pso粒子群优化,图个快呗,具体效果也还行:
                        libsvm-3.21/python
                        命令: python pso.py -i out.file -t 10 -n 10
                    -i 表示训练的文件
                        -t 表示迭代的次数
                        -n 表示粒子的个数
                        (t 和 n 当然是越大效果越好,时间就是代价了)


      LibSVM 关于参数优化问题:
          (1)如果data的数据太多,太耗时,那么我们可以选择部分数据。
               tool/subset.py:可以直接或者随机把数据分成两部分
                   eg:
                     python subset.py heart_scale 100 file1 file2
                         随机100条数据到file1剩下的到file2
          (2)easy.py 参数优化:
                        这边实际上是用了RBF核函数,采用交叉验证(CV)的方法通过评价指标accuracy来获取
                        最优参数的。
                       

            当数据不平衡的时候,Libsvm的评价指标问题:
            默认情况,在模型训练以及参数优化的过程 libsvm默认都采用交叉验证的方法,以ACC为评价指标。平衡数据集是ok的,但是有时候
     我们会遇到unbalance data。这时候Acc就不是一个很好的指标,对于不平衡数据集,我们可以采用F1评价指标(准确率和召回率的调和均值)。
    但是libsvm里面并没有支持这个指标计算。为了大家方便,我加了个F1评价指标的。

         
               
            (1)svm_train的时候
            
                      ./svm-train -v 5 heart_scale
                      会输出以下额外信息,包括precison、recall、F1、Acc:
                        
                       Cross Validation precision = 83.0357%
                       Cross Validation recall = 77.5%
                       Cross Validation F1 = 80.1724%
                       Cross Validation Accuracy = 82.963%

                   在svm_train.c 的void do_cross_validation()方法里面加入以下代码:
                                       
  1.   //F1 准确率和召回率的调和均值 :这里只能支持二分类,并且正类为的lable应该转为1 负类为-1
  2.         int tp = 0 ,fp = 0, fn = 0 , tn = 0;
  3.         for(i=0;i<prob.l;i++){
  4.                 if(prob.y[i] == 1 && target[i] == 1) tp++;    //正类判定为正类
  5.                 if(prob.y[i] == 1 && target[i] < 1) fn++;    //正类判定为负类
  6.                 if(prob.y[i] < 1 && target[i] == 1) fp++;          //负类判定为正类
  7.                 if(prob.y[i] < 1 && target[i] < 1) tn++;          //负类判定为负类
  8.         }
  9.    //precision  tp/(tp+fp)
  10.         double precision = 1.0*tp/(tp+fp);
  11.    //recall  tp/(tp+fn)
  12.         double recall = 1.0*tp/(tp+fn);
  13.    //F1
  14.         double F1 = (2.0*tp)/(2.0*tp+fp+fn);

  15.         printf("Cross Validation precision = %g%%\n",100.0*precision);
  16.         printf("Cross Validation recall = %g%%\n",100.0*recall);
  17.     printf("Cross Validation F1 = %g%%\n",100.0*F1);
复制代码


             (2)采用grib.py参数优化的时候:

                         这个自带的python脚本同样没有支持F1。可是这个如果把F1整合到原来的代码,要改动的地方太多,所以我这边单独新解了对应的py文件。
                  1)tool/grid_F1.py   2)tool/easy_F1.py
                 
                   运行命令:(可对比下方的F1指标图)
                   python easy_F1.py ../heart_scale
                       

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

点评

你这个需要特定的libsvm版本吧,我的版本里面没有libsvm.dll好像运行不了。你的这个文件夹也需要放在libsvm文件夹下面吧?和windows文件夹平行?你应该把整个libsvm文件夹都上传上来。  发表于 2016-5-3 01:04
牛逼啊,我还没注意到这么牛逼的帖子!  发表于 2016-4-22 22:36
回复 支持 反对

使用道具 举报

8#
发表于 2015-5-31 21:42:25 | 只看该作者
哈哈,牛逼!提几个建议:

1. arff和libsvm的格式转换,weka就有这个功能,只是有时候title和类标签转换的不太好。

2. 如果支持多核并行做就更完美了:)

3. 是不是把你的pso.py和grid.py放在一起,能和grid.py的用法一样?能自动调出来画等高线图的那个软件么?
回复 支持 反对

使用道具 举报

9#
发表于 2015-6-1 09:31:09 | 只看该作者
1.格式的转换还是比较好弄些~
2.pso倒是可以并行处理,我有空再捣腾捣腾,看看python的多线程。
3.我试试看可不可以调出那个画等高线的图出来~~
回复 支持 反对

使用道具 举报

10#
发表于 2019-9-14 19:39:18 | 只看该作者
注意:如果用svm-toy的load功能,务必保证所有特征都是(0,1)区间,如果不是,先用svm-scale来归一化。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

机器学习和生物信息学实验室联盟  

GMT+8, 2024-11-23 10:13 , Processed in 0.079529 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表