多标签分类的实现

2024-05-28 19:19:11 发布

您现在位置:Python中文网/ 问答频道 /正文

到目前为止,我已经使用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个类,所以给每个类一个概率,样本属于这个类,因此它属于不同类的概率很高


Tags: 模型分类标签概率类别activationdropoutdense
2条回答

要使用的损失函数实际上是带有sigmoid激活的binary_crossentropy

categorical_crossentropy不适用于多标签问题,因为在多标签问题的情况下,标签不是相互排斥的。重复最后一句话:标签不是相互排斥的

这意味着[1,0,1,0,0,0]形式的标签是正确的。categorical_crossentropysoftmax总是倾向于支持一个特定的类,但事实并非如此;正如你所看到的,一条评论既有毒又淫秽

现在想象一下里面有猫和狗的照片。如果照片中有两只狗和两只猫,会发生什么?这是一张狗的画还是一张猫的画?这实际上是一张“两者皆有”的照片!我们确实需要一种方法来指定多个标签与一张照片/标签相关

使用二进制交叉熵和sigmoid进行多标签分类的基本原理在于数学特性,因为每个输出都需要被视为独立的Bernoulli distribution

因此,唯一正确的解决方案是BCE+“乙状结肠”

正如您已经发现的,这不是一个“经典”的分类问题。对于您在文本中描述的分类问题,softmax激活通常用于实现高机密性和低机密性的效果,总计为1

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

如果你想建立一个模型,能够预测一个输入的多个类,你应该使用回归aproach(后一个)和sigmoid激活函数。这将启用图像中的输出

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

相关问题 更多 >

    热门问题