概述
multi-label是相较multi-class的概念,有关研究相对较少,multi-label指一个数据可以被分为多个类,一个输入对应多个输出,例如一篇新闻可以被同时打上娱乐、体育等多个类,类的数目也不确定;
对于multi-label问题的处理,主要看到三种思路:
- 当类别之间没有较强的联系时,将multi-label转化为多个二分类问题,对于每个类专门训练一个分类器,然后将多个分类器对同个样本进行分类输出结果达到多标签的效果。
- 当类别之间有一定联系的时候,将multi-label转化为multi-class问题,比如用二进制编码表示三个类:[‘人’, ‘猫’, ‘狗’],0表示不是该类,1表示是,则对于多标签分类可能有[0, 1, 1]的情况比如一张图片上既有猫又有狗,那么我们可以将每一个向量作为一个类别,比如[0, 1, 1]作为一个类,将[1, 0, 1]作为一个类,这样一来我们得到一个23个类,对单一样本输出的结果一定在这个类别空间中,这样就是一个多分类问题了,总共8个类,可以用长度为8的独热编码表示。
当然对于类别特别多(n个类)的数据集,这时候类别空间就是2n,显然类别太多了运算压力大,可以选择将类别输出的种类限制在训练集数据中存在的类别中,比如[1, 0, 0]在训练集中没有这个输出,就把他从类别中去除,当然这会影响模型的准确程度,因为它不再识别那些被踢出的可能性。 - 最后一种就是改进算法使其能够直接处理多标签问题,输出多个类。
多标签分类算法
对于神经网络,简单的做法是在最后输出层使用sigmoid激活函数,输出数目为类别数,每个输出都是一个概率,注意输出的多个类别的概率总和不再是1,因为是多标签问题,然后损失函数用binary_crossentrophy,相当于对每个输出分别判断属不属于该类,从而使每一个可能属于的类的概率都趋近1。
在简单的单层CNN算法的实验上效果并不是很好,确实得到了多输出的结果,但是出现了某个类概率接近1,另一个所属类概率虽然也比较突出但数值偏小,比如0.5左右的样子,同时属于3个或4个类效果就更差些,可以通过修改阈值比如threshold=0.3,大于0.3就算做该类,但改善不明显。应该和数据集不同类对应存在的样本不同有关。