SVM的实现多分类的几种方法以及优缺点详解

转载自:

https://www.cnblogs.com/CheeseZH/p/5265959.html

https://blog.csdn.net/rainylove1/article/details/32101113

SVM本身是一个二值分类器

  SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。

  目前,构造SVM多类分类器的方法主要有两类

  (1)直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;

  (2)间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。

一对多法(one-versus-rest,简称OVR SVMs)

  训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

  假如我有四类要划分(也就是4个Label),他们是A、B、C、D。

  于是我在抽取训练集的时候,分别抽取

  (1)A所对应的向量作为正集,B,C,D所对应的向量作为负集;

  (2)B所对应的向量作为正集,A,C,D所对应的向量作为负集;

  (3)C所对应的向量作为正集,A,B,D所对应的向量作为负集;

  (4)D所对应的向量作为正集,A,B,C所对应的向量作为负集;

  使用这四个训练集分别进行训练,然后的得到四个训练结果文件。

  在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。

  最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x)。

  于是最终的结果便是这四个值中最大的一个作为分类结果。

评价:

  这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased.因而不是很实用。可以在抽取数据集的时候,从完整的负集中再抽取三分之一作为训练负集。

最早实现SVM对多类别进行分类就是此种方法,思想是将多个类别转化成两类来实现。在训练时,对于k个类别的样本数据,需要训练k个SVM二类分类器,在构造第i个SVM子分类的样本数据标记为正类,其他不属于i类别的样本数据标记为负类。测试时,对测试数据分别计算各判别函数值,如果只有一个分类器输出正值,那么可直接判决结果为相应分类器编号,否则选取判别函数值最大所对应的类别为测试数据的类别。

优点:训练k个分类器,个数较少,其分类速度相对较快。

缺点:每个分类器的训练都是将全部的样本作为训练样本,这样在求解二次规划问题时,训练速度会随着训练样本的数量的增加而急剧减慢;同时由于负类样本的数据要远远大于正类样本的数据,从而出现了样本不对称的情况,且这种情况随着训练数据的增加而趋向严重。解决不对称的问题可以引入不同的惩罚因子,对样本点来说较少的正类采用较大的惩罚因子C。还有就是当有新的类别加进来时,需要对所有的模型进行重新训练。

     由于训练数据的不平衡性,在实际情况下,我们应该合理的选择冒认者模型,选择出距离分类面较近的 少些样本来进行训练。

     从冒认话者集中选取冒认者的方法:一是基于语音的方法,将冒认者话集的冒认语音与该目标说话人的GMM模型进行匹配,性中找到s个具有较大似然度评分的话者语音作为该目标说话人的冒认话者;二是将目标说话人与冒认话者分别训练GMM模型,然后随机选取K条次序固定的语音作为测试语音,然后将这K条测试语音通过目标模型的GMM和所有的冒认话者的GMM模型,得到的评分可以组成多个K维矢量,通过计算矢量间的欧氏距离来获得最优的冒认话者。

        在“一对多”的方式中,也可以为训练语音寻找一个公共的冒认话者集,而这个冒认话者集尽可能包含多种环境情况。这样训练得到的分类面相当于某个目标说话人与一群固定的冒认者之间的区分情况。

        从“一对多”的方法又衍生出基于决策树的分类:

        首先将所有类别分为两个类别,再将子类进一步划分为两个次级子类,如此循环下去,直到所有的节点都只包含一个单独的类别为止,此节点也是二叉树树种的叶子。该分类将原有的分类问题同样分解成了一系列的两类分类问题,其中两个子类间的分类函数采用SVM。如下图表示:SVM的实现多分类的几种方法以及优缺点详解

一对一法(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)-classifier 如果是A win,则A=A+1;otherwise, C=C+1;
  ...
  (C,D)-classifier 如果是C win,则C=C+1;otherwise,D=D+1;
  The decision is the Max(A,B,C,D)

评价:这种方法虽然好,但是当类别很多的时候,model的个数是n*(n-1)/2,代价还是相当大的。

分别选取两个不同类别构成一个SVM子分类器,这样对于K个类别来说,共有(k*(k-1)/2)个分类器。在构造i和j的分类器时,可以将类别i的训练样本置为1,j的样本置为-1来进行训练。

     在进行测试的时候,使用最多的就是Friedman提出的投票策略:将测试数据x对所有的分类器分别进行测试,若由

 

SVM的实现多分类的几种方法以及优缺点详解得到x属于第i类,则第i类加1,属于j类,则第j类投票加1.累计各类别的得分,选择得分最高者所对应的类别为测试数据的类别。

      例如说:我们有6个说话人的数据,分别作为6类,我们分别做(类1、类2),(类1、类3),。。。(类5、类6)总共15个SVM分类面,现在有一个测试说话人X,将其分别送入15个SVM分类面,假如说,在(类1、类2)属于类1,在(类1、类3)中属于类1,在(类1,类4)中属于类一,在(类1、类5)中属于类1,在(类1、类6)中属于类1,那么它属于类1的投票数是5,如果属于其他类别数不大于5时,那么X就属于类1.

     这种方式的优点是:增加语音的情况下,我们不需要重新训练所有的SVM,只需要重新训练和增加语音样本相关的分类器。在训练单个模型时,相对速度较快。

                        缺点是:所需构造和测试的二值分类器的数量关于k成二次函数增长,总训练时间和测试时间相对较慢。

提醒:用一对一的方式训练SVM时,如果每个类别只有一句语音时,在训练SVM分类面时不要进行标准化。

       从“一对一”的方式出发,出现了有向无环图(Directed Acyclic Graph)的分类方法,训练过程如“一对一”类似,但测试具体过程如下图:SVM的实现多分类的几种方法以及优缺点详解

这种方法减小了测试的数据量,提高了速度。

层次支持向量机

层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。对层次支持向量机的详细说明可以参考论文《支持向量机在多类分类问题中的推广》(刘志刚,计算机工程与应用,2004)