机器学习和生物信息学实验室联盟
标题:
libsvm学习笔记
[打印本页]
作者:
小疯纸一枚
时间:
2012-7-10 21:19
标题:
libsvm学习笔记
本帖最后由 小疯纸一枚 于 2012-7-10 21:25 编辑
菜青虫学libsvm ,果然是艰难困苦哦……一开始都不知道基本概念……记了些入门笔记,怕自己忘了
软件: libsvm , python ,gnuplot
[attach]812[/attach]
gnuplot (解压,不需安装)
Libsvm(解压,不需安装)
Python(从75 /share/软件 下载,安装)
[attach]813[/attach]
文档目录:
一、基本概念
二、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(根据点的颜色不同分类)
[attach]814[/attach]
[attach]815[/attach]
[attach]816[/attach]
点击sava 把数据导出 存为test ,获得如下图所示数据
[attach]817[/attach]
Cmd 中运行 svm-toy.exe (从C盘到E盘直接 > E: 就ok了,开始我还真不懂,心虚ing)
[attach]818[/attach]
2、归一化(跳过)
3、训练:E:\libsvm\libsvm-2.86\windows\svm-train.exe test ,目录下生成.moedel 文件
[attach]819[/attach]
4、预测:E:\libsvm\libsvm-2.86\windows>svm-predict.exe test test.model test.out , 目录下生成,
test.out 文件就 是预测结果
[attach]820[/attach]
打开,就是分类后的结果
[attach]821[/attach]
4、用grid 优化 libsvm
<1>、把 E:\libsvm\libsvm-2.86\tools 目录下的 grid.py 复制到E:\libsvm\libsvm-2.86\windows
<2>、编辑gird.py 在else 的地方
[attach]822[/attach]
<3>、进入pythoon 的安装目录
cd E:\python
[attach]823[/attach]
前面两个分别是c 跟g , 再用这组参数train 一下看看效果:
回到libsvm 的 windows 目录
[attach]824[/attach]
之后再 predict 一下
[attach]825[/attach]
在grid 之前是52.9412% 很明显有很大的提升哦!!!!!!!
[attach]826[/attach]
从图上的效果看……也比之前的精确了一些些……
补充: 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 复制到指定目录,打开并修改参数:
[attach]827[/attach]
[attach]828[/attach]
--------by MYZ xiaofengzi
参考文献:
http://datamining.xmu.edu.cn/bbs/forum.php?mod=viewthread&tid=115&extra=page%3D1
[attach]832[/attach]
[attach]831[/attach]
软件:[attach]830[/attach]
[attach]829[/attach]
libsvm学习笔记:[attach]833[/attach]
作者:
zouquan
时间:
2012-7-11 14:45
提示:
该帖被管理员或版主屏蔽
作者:
cwc
时间:
2012-10-25 10:12
本帖最后由 cwc 于 2012-10-25 10:15 编辑
楼主貌似把训练集跟测试集搞反了。。。
现在只能得到训练集的最佳参数,不知能不能得到以测试集为基准的的最佳参数
作者:
tangzk
时间:
2012-10-30 10:31
提示:
该帖被管理员或版主屏蔽
作者:
chenwq
时间:
2012-10-30 11:03
本帖最后由 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了。(待考证)
作者:
guojiasheng
时间:
2015-5-5 21:10
提示:
该帖被管理员或版主屏蔽
作者:
guojiasheng
时间:
2015-5-31 15:22
标题:
libSVM的参数优化
本帖最后由 guojiasheng 于 2016-5-26 13:48 编辑
[attach]2311[/attach][attach]2311[/attach][attach]2310[/attach]附件是自己用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()方法里面加入以下代码:
//F1 准确率和召回率的调和均值 :这里只能支持二分类,并且正类为的lable应该转为1 负类为-1
int tp = 0 ,fp = 0, fn = 0 , tn = 0;
for(i=0;i<prob.l;i++){
if(prob.y[i] == 1 && target[i] == 1) tp++; //正类判定为正类
if(prob.y[i] == 1 && target[i] < 1) fn++; //正类判定为负类
if(prob.y[i] < 1 && target[i] == 1) fp++; //负类判定为正类
if(prob.y[i] < 1 && target[i] < 1) tn++; //负类判定为负类
}
//precision tp/(tp+fp)
double precision = 1.0*tp/(tp+fp);
//recall tp/(tp+fn)
double recall = 1.0*tp/(tp+fn);
//F1
double F1 = (2.0*tp)/(2.0*tp+fp+fn);
printf("Cross Validation precision = %g%%\n",100.0*precision);
printf("Cross Validation recall = %g%%\n",100.0*recall);
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
作者:
zouquan
时间:
2015-5-31 21:42
哈哈,牛逼!提几个建议:
1. arff和libsvm的格式转换,weka就有这个功能,只是有时候title和类标签转换的不太好。
2. 如果支持多核并行做就更完美了:)
3. 是不是把你的pso.py和grid.py放在一起,能和grid.py的用法一样?能自动调出来画等高线图的那个软件么?
作者:
guojiasheng
时间:
2015-6-1 09:31
1.格式的转换还是比较好弄些~
2.pso倒是可以并行处理,我有空再捣腾捣腾,看看python的多线程。
3.我试试看可不可以调出那个画等高线的图出来~~
作者:
zouquan
时间:
2019-9-14 19:39
注意:如果用svm-toy的load功能,务必保证所有特征都是(0,1)区间,如果不是,先用svm-scale来归一化。
欢迎光临 机器学习和生物信息学实验室联盟 (http://123.57.240.48/)
Powered by Discuz! X3.2