本帖最后由 小疯纸一枚 于 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学习笔记:
|