二进制分类和数字标签

数据挖掘 深度学习 nlp lstm 情绪分析
2021-09-29 09:23:33

我正在尝试使用一个数据集创建一个情绪分析模型,该数据集有约 50000 条我标记为 1 的正面推文,约 50000 条我标记为 0 的负面推文。我还获得了约 10000 条中性推文。

由于中性推文的数量很少,我的想法是用 0.5 标记中性,并使用二元交叉熵作为损失函数来训练模型。我的输出层是 1 个具有 sigmoid 激活函数的神经元,因此预测值将介于 (0,1) 之间。

我的想法是正确的还是会影响准确性?

3个回答

如果您要拥有两个以上的标签,则需要使用 softmax 激活和用于多类分类的损失,即交叉熵损失。

此外,请注意多类与多标签(如下)。


多级

多分类之一。每个样本可以属于一个C类。该模型将有C 可以收集在向量中的输出神经元 s(分数)。目标(地面实况)向量t 将是一个带有正类的单热向量,并且 C1负类。该任务被视为其中一个样本的单个分类问题C 类。

多标签

每个样本可以属于多个类别。该模型也将具有 C输出神经元。目标向量t 可以有多个正类,所以它将是一个由 0 和 1 组成的向量 C维度。该任务被视为C 不同的二进制 (C=2,t=0 or t=1) 和独立的分类问题,每个输出神经元决定一个样本是否属于一个类。

来源:https ://gombru.github.io/2018/05/23/cross_entropy_loss/

如果您正在执行二元(两类)分类问题,二元交叉熵仅是一个合适的损失函数。如果您添加第三个“中性”类,则不再合适。有两种方法可以解决您的问题:

  1. 多类分类。在这种情况下,使用具有三个神经元和 softmax 激活的输出层来标准化输出的建议是最合适的。例如,在 Keras 中,适当的损失将是CategoricalCrossentropy(或稀疏等价物)。

  2. 回归。您也可以训练网络输出介于 0 和 1 之间的“积极性分数”,其中 0.5 表示中性。在这种情况下,输出层可能只是具有 sigmoid 激活的单个神经元,它将输出绑定到区间(0,1). 您可以使用均方误差等损失和合适的回归指标来监控您的模型是否有效。这是合理的,因为您可以将某些文本的积极性视为连续数量而不是离散类别。

尝试每种方法,看看哪种方法效果更好!

在多类问题中使用softmax激活函数。例如,在 Keras 中,您放置了 3 个神经元:

model.add(Dense(3, activation='softmax'))

作为损失函数,您可以选择分类交叉熵

loss=tf.keras.losses.CategoricalCrossentropy()

以便您编译模型:

model.compile(loss=tf.keras.losses.CategoricalCrossentropy(), 
              optimizer=tf.keras.optimizers.Adamax(learning_rate=0.01), 
              metrics=['acc']
             )

由于类别不平衡,不要忘记添加类别权重 50000:50000:10000 用于正面:负面:中性类别。否则,如果您更关心例如中性类,则准确度指标毫无意义。