交叉对比
svm-train.exe -v 5 -c 2048.0 -g 5.0 mytdata.scale
1、制作要用来训练的数据文件。
2、用svm-scale.exe缩放
对训练数据和预测数据同时进行缩放的方法:
svm-scale.exe -s scale tdata >tdata.scale //将待训练数据tdata缩放,结果保存在tdata.scale,缩放时使用的参数保存在scale文件
svm-scale.exe -r scale pdata >pdata.scale //这是要预测的文件,以上面输出的那个scale文件中的参数,来对 待预测 文件内容进行缩放
如果这时直接训练,不带参数
svm-train.exe tdata.scale
会得到tdata.scale.model,这是训练完毕的模型
预测,以tdata.scale.model为模型,对tdata.scale进行预测,在这里,我们用tdata.scale,是训练时用的源文件,是为了检验该模型的准确率,它最后将预测结果输出到tdata.out中
svm-predict.exe tdata.scale tdata.scale.model tdata.out
会出现这样的提示:Accuracy = 98.5185% (133/135) (classification) //准确率98.5185%
所以一般缩放后,不直接训练,而是进入第3步!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3、python.exe grid.py tdata.scale
暴力尝试参数 c 和 g,能很大程度提高准确率,运行结束之后,在最后一行有类似这样的数据:
2.0 8.0 100.0
前两个数分别是c和g,后面那个不用管。
现在加上这两个参数,再次训练
svm-train.exe -c 2.0 -g 8.0 tdata.scale
会得到tdata.scale.model,这是训练完毕的模型
会出现这样的提示:Accuracy = 100% (135/135) (classification) //准确率100%,准确率提高了,但不是每次都这么高
4、现在我们已经该数据文件所对应的较优的参数,就可以进行预测了
svm-predict.exe pdata.scale tdata.scale.model pdata.out
这样,我们要的结果,就在pdata.out文件中,该文件每行只有一个数,预测文件有多少行,pdata.out就有多少行
更详细用法,看《libSVM 简易入门》,原作:林弘德
软件python.exe,会用到pgnuplot.exe,关于grid.py文件中,怎样配置pgnuplot.exe的路径,也参考《libSVM 简易入门》
=================================================
试参数.bat
libSVM 简易入门
原作:林弘德
为什么写这个指南
我一直觉得 SVM 是个很有趣的东西,不过一直沒办法去听林智仁老師 的 Data mining与SVM的课,后来看了一些Internet上的文件,后来听 kcwu 讲了一下 libsvm 的用法后,就想整理一下,算是对于并不需要知道完整 SVM 理论的人提供使用 libsvm 的入门。 原始 libsvm 的README跟FAQ也是很好的文件, 不过你可能要先对 svm 跟流程有点了解后才看得懂 (我在看时有这样的感觉); 这篇入门就是为了从零开始的人而写的。
不过请记得底下可能有些说法不一定对,但是对于只是想用 SVM 的人来说我觉得这样说明会比较易懂。这篇入门原则上是给会写基本程序的人看的,也是给我自己一个备忘, 不用太多数学底子,也不用对 SVM 有任何预备知识。
SVM:什么是SVM,它能为我们做什么?
SVM, Support Vector Machine , 简而言之它是个起源与人工神经网络有点像的东西,現今最常拿来就是做分类。也就是说,如果我有一堆已经分好类的东西(可是分类的依据是未知的),那当收到新的东西时,SVM可以預测新的数据要分到哪一堆去。听起来是很神奇的事(如果你觉得不神奇,请重想一想这句话代表什么:分类的依据是未知的!,还是不神奇的话就请你写个程序,解解上面的问題),不过 SVM 基于统计学习理论的,可以在合理的时间內漂亮的解决这个问題。
以图形化的例子来说明,假定我在空间中标了一堆用顏色分类的点, 点的顏色就是它的类別, 位置就是它的数据, 那 SVM 就可以找出区隔这些点的程序, 依此就可以分出一个个的区域; 拿到新的点(数据) 时, 只要对照该位置在哪一区就可以找出它应该是哪一顏色(类別)了。当然 SVM 不是真的只有分区那么简单, 不过看上面的例子应该可以了解 SVM 大概在作什么. 要对 SVM 再多懂一点点,可以参考 cjlin 在 data mining 课的 slides: pdf 或 ps 。我们可以把 SVM 当个黑盒子, 数据丟进去让他处理然后我们再来用就好了.
哪里得到SVM?
libsvm 当然是最完美的工具.下載处:libsvm.zip 或者 libsvm.tar.gz
.zip 跟 .tar.gz 基本上是一样的, 只是看你的操作系统; 习惯上 Windows 用 .zip 比较方便 (因为有WinZIP, 也有WinRAR), UNIX 则是用 .tar.gz
编译libsvm
解开来后, 假定是UNIX 系统, 直接打 make 就可以了; 编不出来的话请详读说明和运用常识. 因为这是指南, 所以我不花时间细谈, 而且编不出来的情形真是少之又少, 通常一定是你的系统有问題。 其他的子目录可以不管, 只要 svm-train, svm-scale, svm-predict 三个执行文件有就可以了. Windows 的用戶要自己重编当然也是可以, 不过已经有编好的执行文件在里面了: 请检查 windows 子目录, 应该会有 svmtrain.exe, svmscale.exe, svmpredict.exe, svmtoy.exe.
SVM的使用
libsvm 有很多种用法, 这篇指南只打算讲简单的部分.
程序
svmtrain
训练数据. 跑SVM被戏称为 "开火車" 也是由于这个程序名而来. train会接受特定格式的输入, 产生一个 "Model" 文件. 这个 model 你可以想像成SVM的內部数据,因为预测要model才能预测, 不能直接吃原始数据.想想也很合理,假定 train 本身是很耗时的动作, 而 train可以以某种形式存起內部数据,那下次要预测时直接把那些內部数据载入就快多了.
svmpredict
依照已经训练好的 model, 再加上给定的输入(新值), 输出預测新值所对应的类別.
svmscale
扫描数据. 因为原始数据可能范围过大或过小, svmscale 可以先将数据重新 scale (縮放) 到适当范围使训练与预测速度更快。
文件格式
文件格式要先交代一下. 你可以参考 libsvm 里面附的 "heart_scale": 这是SVM 的输入文件格式.
[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
label
或说是class, 就是你要分类的种类,通常是一些整数。
index
是有順序的索引,通常是连续的整数。
value
就是用来 train 的数据,通常是一堆实数。
每一行都是如上的結构, 意思就是: 我有一排数据, 分別是 value1, value2, .... value, (而且它们的順序已由 index 分別指定),这排数据的分类結果就是label。
或許你会不太懂,为什么会是 value1,value2,.... 这样一排呢? 这牵涉到 SVM 的原理。 你可以这样想(我沒说这是正确的), 它的名字就叫 Support "Vector" Machine, 所以输入的训练数据是 "Vector"(向量), 也就是一排的 x1, x2, x3, ... 这些值就是 value,而 x[n] 的n就是由index 指定。 这些东西又称为 "(属性)attribute"。
真实的情况是,大部份时候我们给定的数据可能有很多 "特征(feature)" 或说 "属性(attribute)",所以输入会是一组的。 举例来说,以前面点分区的例子来说,我们不是每个点都有 X 跟 Y 的坐标吗? 所以它就有两种属性。 假定我有两个点: (0,3) 跟 (5,8) 分別在 label(class) 1 跟 2 ,那就会写成
1 1:0 2:3
2 1:5 2:8
同理,空间中的三維坐标就等于有三组属性。这种文件格式最大的好处就是可以使用稀疏矩阵(sparse matrix), 或说有些 数据的属性可以有缺失。
运行libsvm
下来解释一下libsvm 的程序怎么用。 你可以先拿 libsvm 附的heart_scale 来做输入,底下也以它为例:
看到这里你应该也了解,使用 SVM 的流程大概就是:
1. 准备数据并做成指定格式 (有必要时需 svmscale)
2. 用svmtrain 来训练成 model
对新的输入,使用 svmpredic来预测新数据的类别.
svmtrain
svmtrain 的语法大致就是:
svmtrain [options] training_set_file [model_file]
training_set_file 就是之前的格式,而 model_file 如果不给就会 叫 [training_set_file].model。 options 可以先不要给。
下列程序执行結果会产生 heart_scale.model 文件:(螢幕输出不是很重要,沒有错誤就好了)
./svmtrain heart_scale
optimization finished, #iter = 219
nu = 0.431030
obj = -100.877286, rho = 0.424632
nSV = 132, nBSV = 107
Total nSV = 132
svmpredict
svmpredict 的语法是 :
svmpredict test_file model_file output_file
test_file 就是我们要预测的数据。它的格式跟 svmtrain 的输入,也就是 training_set_file 是一样的, 不过每行最前面的 label 可以省略 (因为预测就是要预测那个 label)。 但如果 test_file 有 label 的值的话, predict 完会順便拿 predict 出来的值跟 test_file 里面写的值去做比对,这代表: test_file 写的label是真正的分类結果,拿来跟我们预测的結果比对就可以知道预测的效果。所以,我们可以拿原 training set 当做 test_file再丟给 svmpredict 去预测(因为格式一样),看看正确率有多高,方便后面调参数。其它参数就很好理解了: model_file就是 svmtrain 出来的文件, output_file是存输出結果的文件案。 输出的格式很简单,每行一个 label,对应到你的 test_file 里面的各行。下列程序执行結果会产生 heart_scale.out:
./svm-predict heart_scale heart_scale.model heart_scale.out
Accuracy = 86.6667% (234/270) (classification)
Mean squared error = 0.533333 (regression)
Squared correlation coefficient = 0.532639(regression)
我们把原输入丟回去 predict, 第一行的 Accuracy 就是預测的正确率了。如果输入沒有label 的话,那就是真的预测了。看到这里,基本上你应该已经可以利用 svm 来作事了: 你只要写程序输出正确格式的数据,交给 svm 去 train, 后来再 predict 并读入結果即可。
Advanced Top
libSVM使用方法及配套软件
4星 · 超过85%的资源 需积分: 9 189 浏览量
2012-05-27
23:34:13
上传
评论
收藏 17.3MB ZIP 举报
zybird71
- 粉丝: 2
- 资源: 10