多标签分类实现

Sta*_*ian 1 python nlp keras tensorflow kaggle

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

现在我遇到了这个 Kaggle 挑战:有毒评论分类挑战,特别是这个实现。我认为这是一个多标签分类问题,因为一个样本可以属于不同的类。事实上,当我检查最终预测时:

ex1

我可以看到第一个样本预测对于有毒和淫秽的可能性非常高。到目前为止,当我应用标准模型来预测一个类别时,根据我的知识,我会预测样本属于该类别中的哪个类别的概率。因此,无论是 1 类还是 2 类或 .... 所以我会 - 在有信心预测的情况下 - 有毒类别的可能性很高而其他类别的可能性较低 - 或者在不自信的预测的情况下 - 0.4x 有毒,0.4x对于淫秽和其余的小概率。

现在我对如何完成实施感到惊讶。我不明白以下内容:如何完成多标签分类(与“通常”模型相反)?

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

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'])
Run Code Online (Sandbox Code Playgroud)

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

这是使用二元交叉熵而不是(稀疏)分类交叉熵以及 6 个类的简单区别吗?所以这告诉我们每个类都有一个二元问题,它分别处理这 6 个类,因此为每个类给出样本属于这个类的概率,因此它可以有很高的概率属于不同的类?

Tim*_*lin 5

要使用的损失函数确实是binary_crossentropywithsigmoid激活。

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

这意味着表单中标签的存在[1,0,1,0,0,0]是正确的。该categorical_crossentropysoftmax总是倾向于一个特定的类,但这种情况并非如此; 就像您看到的一样,评论可能有毒也可能下流。

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

使用 binary_crossentropy 和 sigmoid 进行多标签分类的基本原理在于数学特性,因为每个输出都需要被视为独立的伯努利分布

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