多标签分类实施

时间:2020-08-31 07:52:27

标签: python tensorflow keras nlp kaggle

到目前为止,我已经使用Keras Tensorflow对图像处理,NLP,时间序列预测进行建模。通常,在具有多个条目的标签的情况下,所以多个类别的任务总是只是预测样本属于哪个类别。例如,可能类别的列表是[汽车,人,飞机,花,建筑物]。因此,最终的预测是样本属于哪个类别-给出每个类别的概率。通常,根据非常自信的预测,一类人的机率很高,而其他人的机率很低。

现在我遇到了Kaggle挑战:Toxic Comment Classification Challenge,尤其是这个implementation。我认为这是一个多标签分类问题,因为一个样本可以属于不同的类别。确实,当我检查最终预测时:

ex1

我可以看到,第一个样本预测对于有毒和淫秽都有很高的概率。到目前为止,据我所知,当我使用标准模型来预测类别时,我将预测样本属于该类别的概率。因此,无论是1级还是2级,或.......如果我对前任有前瞻性,则有较高的类别中毒可能性,而对其他人则较低;或者在前无前例的情况下,我有-0.4倍有毒,0.4倍淫秽的可能性很小,

现在让我感到惊讶的是,实现是如何完成的。我不理解以下内容: 如何完成多标签分类(与“常规”模型相反)?

在检查代码时,我看到以下模型:

inp = Input(shape=(maxlen,))
x = Embedding(max_features, embed_size, weights=[embedding_matrix])(inp)
x = Bidirectional(LSTM(50, return_sequences=True, dropout=0.1, recurrent_dropout=0.1))(x)
x = GlobalMaxPool1D()(x)
x = Dense(50, activation="relu")(x)
x = Dropout(0.1)(x)
x = Dense(6, activation="sigmoid")(x)
model = Model(inputs=inp, outputs=x)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

我知道x = Dense(6, activation="sigmoid")是由于必须预测6个班级而产生的。到目前为止,据我所知也是如此。但是,为什么会产生多标签分类的概率呢?多标签分类与仅从不同选择中预测一个标签之间的实现区别在哪里?

使用二进制交叉熵而不是(稀疏的)分类交叉熵与6类是简单的区别吗?这就说明我们每个类别都有一个二元问题,它分别处理这6个类别,因此给每个类别一个概率就是样本属于该类别,因此它有很高的概率属于不同的类别? / p>

2 个答案:

答案 0 :(得分:4)

要使用的损失函数的确是binary_crossentropy,激活了sigmoid

categorical_crossentropy不适合多标签问题,因为在出​​现多标签问题的情况下,标签不是互斥的。重复最后一句话:标签不是互斥的。

这意味着以[1,0,1,0,0,0]形式存在的标签是正确的。 categorical_crossentropysoftmax将总是倾向于偏向一个特定的类,但事实并非如此;就像您看到的一样,评论可能既有毒又淫秽。

现在想象一下里面有猫和狗的照片。如果照片中有2只狗和2只猫,该怎么办?是狗图片还是猫图片?它实际上是“两全其美”的图片!我们绝对需要一种方法来指定多个标签与照片/标签相关/相关。

使用binary_crossentropy和Sigmoid进行多标签分类的基本原理在于数学属性,因为每个输出都需要视为独立的Bernoulli distribution

因此,唯一正确的解决方案是BCE +'Sigmoid'。

答案 1 :(得分:0)

您已经发现,这不是一个“经典”分类问题。对于您在本文中描述的分类问题,通常使用softmax激活来实现高置信度和低置信度(总计为1)的效果。

如果要预测二进制问题,例如“信用卡欺诈”,则可以在结合2个输出神经元(欺诈<->非欺诈)的softmax激活和具有1个输出神经元的回归模型之间进行选择。在后者中,单个神经元将输出[0,1]范围内的值,并选择一个阈值,例如0.5。所有<0.5的输出属于0类,所有> = 0.5的属于1类。

如果要构建一个模型,该模型能够为一个输入预测多个类别,则应使用回归方法(后一种)和S形激活函数。这样就可以在图像中进行输出。

说实话,对于这样的问题,我不确定“二进制交叉熵”是否是正确的损失。