我的libsvm回归 matlab多分类预测效果不好,怎么办

22 条评论分享收藏感谢收起赞同 1 条评论分享收藏感谢收起libsvm 多标签分类 怎么解决_百度知道
libsvm 多标签分类 怎么解决
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
这帖子就是初步教教刚接触libsvm(svm)的同学如何利用libsvm进行分类预测,关于参数寻优的问题在这里姑且不谈,另有帖子详述。 其实使用libsvm进行分类很简单,只需要有属性矩阵和标签,然后就可以建立分类模型(model),然后利用得到的这个mo...
采纳率:88%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。欲将心事付machine
libsvm处理多分类的问题
SVM作为判别模型(discriminative model)中所使用的典型方法,其产生是为2分类问题设计的
svm多分类效果不佳,目前是svm研究的热点之一。libsvm用的是one- versus-one法。简介:.一对一法(one-versus-one,简称OVO SVMs或者pairwise)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本 进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。还是假设有四类A,B,C,D 四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D;C,D所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结 果。投票是这样的.A=B=C=D=0;(A, B)-classifier 如果是A win,则A=A+1;otherwise,B=B+1;(A,C)-classifer 如果是A win,则A=A+1;otherwise, C=C+1;...(C,D)-classifer 如果是A win,则C=C+1;otherwise,D=D+1;The decision is the Max(A,B,C,D)
没有更多推荐了,SVM解决多分类问题的方法
SVM解决多分类问题的方法
SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。
a.一对多法(one-versus-rest,简称1-v-r
SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
b.一对一法(one-versus-one,简称1-v-1
SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得
票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。
c.层次支持向量机(H-SVMs)。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。
对c和d两种方法的详细说明可以参考论文《支持向量机在多类分类问题中的推广》(计算机工程与应用。2004)
d.其他多类分类方法。除了以上几种方法外,还有有向无环图SVM(Directed Acyclic Graph
SVMs,简称DAG-SVMs)和对类别进行二进制编码的纠错编码SVMs。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。使用libsvm进行分类预测
使用libsvm进行分类预测
使用libsvm,首先需要将实际待分类的内容或数据(训练数据,或预测数据)进行量化,然后通过libsvm提供的功能实现分类和预测。下面介绍使用libsvm的基本步骤。
准备训练数据
数据格式:
&label1& &index1&:&value11& &index2&:&value12&.
使用libsvm,首先需要将实际待分类的内容或数据(训练数据,或预测数据)进行量化,然后通过libsvm提供的功能实现分类和预测。下面介绍使用libsvm的基本步骤。
准备训练数据
数据格式:
&label1& &index1&:&value11& &index2&:&value12&...
&label2& &index1&:&value21& &index2&:&value22&...
&label3& &index1&:&value31& &index2&:&value32&...
每一行,表示以已定义的类别标签,以及属于该标签的各个属性值,每个属性值以“属性索引编号:属性值”的格式。一行内容表示一个类别属性以及与该类别相关的各个属性的值。属性的值,一般可以表示为“该属性隶属于该类别的程度”,越大,表示该属性更能决定属性该类别。
上面的数据必须使用数字类型,例如类别,可以通过不同的整数来表示不同的类别。
准备的原始训练样本数据存放在文件raw_data.txt中,内容如下所示:
1 1:0...1987
2 1:0...3999
3 1:0...7633
这一步对应于libsvm的缩放操作,即将量化的数据缩放到某一范围之内。首先,需要把原始的训练数据存放到文件中作为输入,如果实际应用中不需要从文件输入,可以根据需要修改libsvm的代码,来满足需要。
上面准备的文件raw_data.txt定义了三个类别,分别为1,2,3,其中有三个属性。正常情况下,每个属性值范围可能并不一定是在0到1之间,比如实际的温度数据,销售额数据,等等。
libsvm通过使用svm_scale来实现归一化,下面是svm_scale的使用说明:
用法:svmscale [-l lower] [-u upper] [-y y_lower y_upper] [-s save_filename] [-r restore_filename] filename
缺省值: lower = -1,upper = 1,没有对y进行缩放
-l:数据下限标记;lower:缩放后数据下限;
-u:数据上限标记;upper:缩放后数据上限;
-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值;(回归需要对目标进行缩放,因此该参数可以设定为 –y -1 1 )
-s save_filename:表示将缩放的规则保存为文件save_filename;
-r restore_filename:表示将缩放规则文件restore_filename载入后按此缩放;
filename:待缩放的数据文件(要求满足前面所述的格式)
我们输入如下参数,来执行数据的缩放操作:
-l 0 -u 1 -s src/s_rules.txt src/raw_data.txt
数据缩放的区间为[0, 1],生成的缩放规则的文件存放到文件src/s_rules.txt中,最后面的文件src/raw_data.txt就是我们进行分类的训练数据文件。
输入上面参数执行后,可以看到归一化的数据,如下所示:
1.0 1:0..0
2.0 1:1.0 3:0.3946
3.0 2:0.:1.0
使用Eclipse的话,控制台输出的就是上面的内容,也就是我们可以直接用来训练的训练数据,将其存为文件train.txt。执行svm_scale命令,还输出一个规则文件(src/s_rules.txt):
0.000 1.000
训练分类模型
训练分类模型的过程,就是够呢局前面归一化的样本数据,建立一个分类模型,然后根据这个分类模型就能够进行分类的预测,这也是最终的目的。
我们看一下libsvm提供的训练模型的命令:
用法: svmtrain [options] training_set_file [model_file]
其中, options(操作参数):可用的选项即表示的涵义如下所示
-s svm类型:设置SVM 类型,默认值为0,可选类型有(对于回归只能选3或4):
0 -- C- SVC
1 -- n - SVC
2 -- one-class-SVM
3 -- e - SVR
4 -- n - SVR
-t 核函数类型:设置核函数类型,默认值为2,可选类型有:
0 -- 线性核:u'*v
1 -- 多项式核: (g*u'*v+ coef 0)deg ree
2 -- RBF 核:e( u v 2) g -
3 -- sigmoid 核:tanh(g*u'*v+ coef 0)
-d degree:核函数中的degree设置,默认值为3;
-g g :设置核函数中的g,默认值为1/k,其中k是指输入数据中的属性数;
-r coef 0:设置核函数中的coef 0,默认值为0;
-c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;
-n n :设置n - SVC、one-class-SVM 与n - SVR 中参数n ,默认值0.5;
-p e :设置n - SVR的损失函数中的e ,默认值为0.1;
-m cachesize:设置cache内存大小,以MB为单位,默认值为40;
-e e :设置终止准则中的可容忍偏差,默认值为0.001;
-h shrinking:是否使用启发式,可选值为0 或1,默认值为1;
-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;
-wi weight:对各类样本的惩罚系数C加权,默认值为1;
-v n:n折交叉验证模式,随机地将数据剖分为n部分并计算交叉检验准确度和均方根误差。
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。
针对上面归一化操作得到的训练数据,我们通过输入如下参数并执行svmtrain命令进行训练:
src/train.txt src/model.txt
输入出的src/model.txt就是分类模型,模型数据的内容,如下所示:
svm_type c_svc
kernel_type rbf
gamma 0.3333
nr_class 3
total_sv 3
rho 0.0 0.0 0.0
label 1 2 3
nr_sv 1 1 1
1.0 1.0 1:0..0
-1.0 1.0 1:1.0 3:0.3946
-1.0 -1.0 2:0.:1.0
根据得出的分类模型,就可以进行分类预测了。
有关训练分类模型的优化,从参考链接中引用一段,有兴趣可以实际操作一下:
本实验中的参数-s取3,-t取2(默认)还需确定的参数是-c,-g,-p。
另外,实验中所需调整的重要参数是-c 和 –g,-c和-g的调整除了自己根据经验试之外,还可以使用gridregression.py对这两个参数进行优化。
该优化过程需要用到Python(2.5),Gnuplot(4.2),gridregression.py(该文件需要修改路径)。然后在命令行下面运行:
python.exe gridregression.py -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -s 3 –t 2 -v 5 -svmtrain E:/libsvm/libsvm-2.86/windows/svm-train.exe -gnuplot E:/libsvm/libsvm-2.86/gnuplot/bin/pgnuplot.exe E:/libsvm/libsvm-2.86/windows/train.txt & gridregression_feature.parameter
以上三个路径根据实际安装情况进行修改。
-log2c是给出参数c的范围和步长
-log2g是给出参数g的范围和步长
-log2p是给出参数p的范围和步长
上面三个参数可以用默认范围和步长。
-s选择SVM类型,也是只能选3或者4
-t是选择核函数
-v 10 将训练数据分成10份做交叉验证,默认为5
为了方便将gridregression.py是存放在python.exe安装目录下,trian.txt为训练数据,参数存放在gridregression_feature.parameter中,可以自己命名。
搜索结束后可以在gridregression_feature.parameter中最后一行看到最优参数。其中,最后一行的第一个参数即为-c,第二个为-g,第三个为-p,最后一个参数为均方误差。前三个参数可以直接用于模型的训练。然后,根据搜索得到的参数,重新训练,得到模型。
验证分类模型
预测分类的命令,说明如下所示:
用法:svmpredict [options] test_file model_file output_file
options(操作参数):
-b probability_estimates:是否需要进行概率估计预测,可选值为0 或者1,默认值为0。
model_file 是由svmtrain 产生的模型文件;
test_file 是要进行预测的数据文件;
output_file 是svmpredict 的输出文件,表示预测的结果值。
这个命令有两个主要的作用:
这里,只有通过一组已经知道类别的数据来做验证,才能知道分类器(基于分类模型数据)的精度如何。如果分类器精度脚底,完全可以进行额外的参数寻优来调整模型。
准备验证分类器的数据(已知类标签,存为文件test.txt),如下所示:
1 1:0...1987
3 1:0...6999
2 1:0...7633
上面的数据是和训练数据属于同一类型的,即已经知道类别,通过将其作为模拟的待预测数据来验证分类模型的准确度。
输入如下参数,进行模拟预测:
src/test.txt src/model.txt src/predict.txt
结果会输出分类预测的精度:
Accuracy = 33.33% (1/3) (classification)
使用Eclipse的话会直接输出到控制台。然后看一下预测的结果,保存在文件src/predict.txt中,内容如下所示:
可见,模型的精度不是很高,只有一个预测与实际分类相符。我们这里只是举个例子,数据又很少。实际分类过程中,如果出现这种精度特别低的情况,需要对分类模型进行调整,达到一个满意的分类精度。
实际上预测分类的数据是类别未知的,我们通过训练得出的分类器要做的事情就是确定待预测数据的类别。使用libsvm默认是以文件的方式输入数据,而且预测要求的数据格式必须和训练时相同,所以数据文件中第一列的类标签可以是随便给出的,分类器会处理数据,得出类别,然后输出到指定的文件中。
预测分类和前面的“验证分类模型”中的执行过程是一样的。
如果有其他需要,可以适当修改libsvm程序,使其支持你想要的输入输出方式。
用云栖社区APP,舒服~
【云栖快讯】云栖社区技术交流群汇总,阿里巴巴技术专家及云栖社区专家等你加入互动,老铁,了解一下?&&
用于实时预测用户对物品偏好,支持企业定制推荐算法,支持A/B Test效果对比
服务底层使用经国家密码管理局检测认证的硬件密码机,通过虚拟化技术,帮助用户满足数据安全方面的...
一种适用于大规模并行批处理作业的分布式云服务。可支持海量作业并发规模,系统自动完成资源管理,...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效...}

我要回帖

更多关于 matlab安装libsvm 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信