从前面SVM学习中可以看出来,SVM是一种典型的两类分类器。而现实中要解决的问题,往往是多类的问题。如何由两类分类器得到多类分类器,就是一个值得研究的问题。
以文本分类为例,现成的方法有很多,其中一劳永逸的方法,就是真的一次性考虑所有样本,并求解一个多目标函数的优化问题,一次性得到多个分类面,就像下图这样:
多个超平面把空间划分为多个区域,每个区域对应一个类别,给一篇文章,看它落在哪个区域就知道了它的分类。 只可惜这种算法还基本停留在纸面上,因为一次性求解的方法计算量实在太大,大到无法实用的地步。
目前,存在的方法主要有:
1. “1-V-R方式”,就是每次仍然解一个两类分类的问题。比如我们有5个类别,首先把类别1的样本定为正样本,其余的样本合起来定为负样本,得到一个两类分类器,它能够指出新的样本是不是第1类的;然后我们把类别2的样本定为正样本,把1、3、4、5的样本合起来定为负样本,得到一个分类器,如此下去,最终可以得到5个这样的两类分类器。这种方法的好处是每个优化问题的规模比较小,而且分类的时候速度很快(对于k类问题,把其中某一类的n个训练样本视为一类,所有其他类别归为另一类,因此只有k个分类器)。
但有时可能会出现两种特殊情况,某样本属于多个类别(分类重叠现象)或者是某样本没有判别为任何类别(不可分类现象)。而且,如果各个类别的样本数目是差不多的,“其余”那一类样本数总是要数倍于正类,这就人为的造成了上一节所说的“数据集偏斜”问题。
2. “1-V-1方式”,也就是我们所说的one-against-one方式。这种方法把其中的任意两类构造一个分类器,共有(k-1)×k/2个分类器。虽然分类器的数目多了,但是在训练阶段所用的总时间却比“一类对其余”方法少很多。
最后预测中如果出现分类重叠现象,可以采用竞争方式(各个分类器向k个类别投票,取得票最高类)。但是如果类别数非常大时,要调用的分类器数目会达到类别数的平方量级,预测的运算量不可小觑。
3. “有向无环图(DAG-SVM)”,该方法在训练阶段采用1-V-1方式,而判别阶段采用一种两向无环图的方式。
如果类别数是k,则只调用k-1个分类器即可。但是如果开始的分类器回答错误,那么后面的分类器是无论如何也无法纠正它的错误的,其实对下面每一层的分类器都存在这种错误向下累积的现象。也有一些方法可以改善整体效果,我们总希望根节点少犯错误为好,因此参与第一次分类的两个类别,最好是差别特别大,或者取在两类分类中正确率最高的那个分类器作根节点,或者我们让两类分类器在分类的时候,不光输出类别的标签,还输出一个类似“置信度”,当它对自己的结果不太自信的时候,我们就不光按照它的输出走,它可会按照一定的概率走向另一分支。
LibSVM采用的是1-V-1方式,因为这种方式思路简单,并且许多实践证实效果比1-V-R方式要好。对于 nr_class 个类的组合方式为:
for(i=;i<nr_class;i++)
{
for(j=i+;i<nr_class;j++)
{类i–V–类j}
}