关于libsvm

20140909

对应的引导文档是:http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
数据去这里下:http://www.csie.ntu.edu.tw/~cjlin/papers/guide/data/ (注意到train.1对应于下面的呃svmguide1,如此类推)

样例1

一,直接训练和测试svm:

1
2
./svm-train svmguide1
./svm-predict svmguide1.t svmguide1.model

出来结果是66.925%

二,使用了归一化后:

1
2
3
4
./svm-scale -l -1 -u 1 -s range1 svmguide1 > svmguide1.scale
./svm-scale -r range1 svmguide1.t > svmguide1.t.scale
./svm-train svmguide1.scale
./svm-predict svmguide1.t.scale svmguide1.scale.model svmguide1.t.predict

准确率提高到了96.15%!
解释:

  • 其中归一化的方法是线性归一化,上例是将训练集的上界对应到1,下界对应到-1
  • 具体参数的含义在命令行输入无参数的可执行文件后可以输出来。上面四个命令是说:
    • 对svmguide1进行下界为-1上界为1的scale,结果输出到svmguide1.scale,并且将scale的参数存到range1
    • 对svmguide1.t,读取range1的参数进行scale,结果输出到svmguide1.t.scale
    • 训练
    • 测试

三,使用grid-search来finetuning参数
可视化的话需要安装gnuplot,不过,不装也是能够计算参数的。

1
2
3
python grid.py svmguide1.scale
# 如果要调用gnuplot,加上-gnuplot并指定好位置:
python grid.py -gnuplot /C/Program Files/gnuplot/bin/gnuplot.exe svmguide1.scale

guide里面说最佳的参数应该是C=2,r=2,不过我运行出来的结果是c=8192,r=0.03125 ..囧
还是按照C=2,r=2设置参数

1
2
./svm-train -c 2 -g 2 svmguide1.scale
./svm-predict svmguide1.t.scale svmguide1.scale.model svmguide1.t.predict

结果提高了一点,到96.875%

四,一步到位
作者还给了一个整合了上面一到三步的“一步到位”的脚本:

1
2
# 主要要修改easy.py里面line 25的路径为对应的gnuplot位置,笔者的是:gnuplot_exe = r"C:\Program Files\gnuplot\bin\gnuplot.exe"
python easy.py svmguide1 svmguide1.t

结果类似:

样例2、样例3

跟样例1都差不多。也是可以一步到位地解决:

1
2
python easy.py svmguide2              #从56.5%升到85.9% ...
python easy.py svmguide3 svmguide3.t #从2.4%升到87.8% ...

又及,在我的机器上跑出来的grid的结果跟guide上的略有不同。不知道是不是新代码修改了搜索的范围。不过上面数据量都太少貌似也说明不了什么问题。

很久没有更新网站,发现多了不少评论和问题,无法一一回复,如果现在仍有问题请再次留言 :) 2016.03.29