在上一节中我们已经讨论了如何处理两类分类问题,并对一些常见的任务(评分与排序、类概率估计)进行了总结,本节将讨论两类分类问题的推广,即多分类问题,并简单讨论一下回归问题。
多分类问题
1.1两种K类分类器
假设我们要构造一个K类分类器,有两种方案:
- 一对多(一堆其余):首先训练K个两类分类器,第一个分类器是将C1和C2...Cn类区分开,第二个分类器是将C2和C1,C3...Cn类区分开,以此类推。在训练第i个分类器的时候,我们将来自Ci类的所有实例看成正例,其余的看作负例。有时候会按照某种固定的顺序来训练各类分类器,这时我们只需要K-1个分类器,其中第i个分类器是将Ci与Ci+1...Cn类区分开。
注意:有序也可以理解为,将K个分类器合并到一个决策树里,将某一测试集分成K类的时候,会产生K-1个内部节点,也就是K-1个分类器。
- 一对一:在任意两个类别之间都需要训练一个分类器,如果是按照对称的处理方式,则需要K(K-1)/2个分类器,如果是按照非对称的处理方式,则需要K(K-1)个分类器。
注意:如果2个类别对没有顺序关系则为对称,如(C1,C2)和(C2,C1)
1.2输出编码矩阵
用输出编码矩阵可以较容易的描述上述方案,将K类任务分为l个两分类问题,构建一个K x L的矩阵,矩阵中的元素都来自{+1,0,-1}。
下面是用一对一方案构建3类分类任务的两种方式:左侧是对称,右侧是非对称
- 每一列都描述了一个两分类任务,+1所在的行对应的类为正类。
- 每一行代表一类(本例是C1,C2,C3)。
- 采用对称的方式时,如左图,第一个用于区分C1(正)和C2(负),第二个用于区分C1(正)和C3(负),第三个用于区分C2(正)和C3(负)。
下面是用一对多方案构建3类分类任务的两种方式:左侧是无序,右侧是有序
- 先看左侧,第一个分类器将C1(正)和{C2,C3}(负)分开,第二个分类器将C2(正)和{C1,C3}(负)分开,第三个分类器将C3(正)和{C1,C2}(负)分开。
- 右侧是按照C1-C2-C3的顺序进行分类的,因此只用2个分类器即可。
1.3多累分类器的性能
基于距离的解码:
为了确定新测试实例属于哪一类,我们需要收集该实例所有两类分类器的测试结果,这些预测结果形成了一个可在编码矩阵中查询的“字”,该过程也称为解码。
现在假设有一个字w为(-1,+1,-1),分类器采用的是无序一对多方案(看上面的矩阵),则判定该实例属于C2类,这个属于凑巧,得到的字正好在矩阵中出现了。
如果没出现该怎么办呢?现在假设有另外一个字w(0,+1,0),采用对称的一对一方案(见上面矩阵)。这时我们应该从矩阵中找与该字w距离最近的码字c。
计算公式如下:
- 两个字一样的位对距离不产生贡献
- 每个字为+1或-1的位对距离的贡献为1
- 如果某一位出现了0,其对距离贡献为1/2
因此,对于字w(0,+1,0),距离最近为d(w,c1)=1.5,应该选择C1
注意:
- 如果采用的是一对一的方案,也可以通过投票的方式做出决策,与距离解码等价。如字(0,+1,0),分别对应了C3,C1,C1,因此C1有2票,选C1。
,即距离(dj)+票数(vj)=常数,该常数取决于K值。
- 最近距离的码字也不一定是唯一的,可能会出现多相同的距离,这时候不知道该选择哪个类,则可以为矩阵增加更多的类改善这种情况(一对一和一对多混合的方案)。
基于损失的解码:
上一篇文章讲了损失函数,这里可以将裕量应用到编码矩阵中来。如果两分类器可以输出得分,得分si则标识了不同的类别,裕量,并将其传给上一节中的某个损失函数,将该损失的最小化作为最终的决策。
例:编码矩阵C如左图,得分向量如中图,裕量矩阵如右图
如果使用0-1损失,则预测结果为C3(Z1=4,Z2=5,Z3=3,Z4=6)
注意:基于损失的解码假设每个两类分类器在评分时都在相同的尺度。