为啥我的多标签文本分类 LSTM 表现不佳?

Posted

技术标签:

【中文标题】为啥我的多标签文本分类 LSTM 表现不佳?【英文标题】:Why my LSTM for Multi-Label Text Classification underperforms?为什么我的多标签文本分类 LSTM 表现不佳? 【发布时间】:2021-11-07 05:01:17 【问题描述】:

我使用的是 Windows 10 机器。 库:带有 Tensorflow 2.0 的 Keras 嵌件:手套(100维)

我正在尝试为多标签文本分类实现 LSTM 架构。

我的问题是,无论我做多少微调,结果都非常糟糕。

我在 DL 实际实施方面没有经验,因此我征求您的意见。

下面我将说明到目前为止我的数据集和模型的基本信息。

我是新会员,无法嵌入图片,所以它们显示为链接。

Dataset form+Embedings form+train-test-split form

Dataset's labels distribution

My Implementation of LSTM

Model's Summary

Model's Accuracy plot

Model's Loss plot

如您所见,我的数据集非常小(约 6.000 个示例),这可能是我无法获得更好结果的原因之一。尽管如此,我还是选择了它,因为它不偏不倚。

    我想知道我的代码在多标签文本分类的尺寸、形状、激活函数和损失函数方面是否存在根本性错误?

    为了在我的模型上取得更好的结果,您有什么建议?此外,任何关于优化、方法、节点数量、层、dropout 等的一般性建议都非常受欢迎。

迄今为止我实现的模型的最佳 val 准确度约为 0.54,即使我试图提高它,它似乎也卡在那里。

【问题讨论】:

是否可以安全地假设您在最后一层使用 sigmoid 激活并带有二元交叉熵损失? 没错。 Sigmoid 和二元交叉熵,因为它是一个多标签分类。 【参考方案1】:

有很多方法可以解决这个问题,但最常见的错误是让您的模型过度拟合训练数据。 我怀疑 0.54 的准确度意味着您的模型为几乎所有情况选择了最常见的标签(攻击性)。

因此,考虑以下简单解决方案之一:

创建平衡的训练数据:例如每个类别的 400 个样本。 或样本平衡批次进行训练(每个训练批次上的标签数量完全相同)

除了跟踪准确率和损失之外,看看precision-recall-f1 甚至更好地尝试绘制曲线下的区域,可能不同的类需要不同的激活阈值。 (如果你在最后一层使用 Sigmoid,也许一个类在 0.2 激活时表现更好,而另一个类在 0.7 时表现更好)

【讨论】:

好建议!我试图通过这个库“从 keras_balanced_batch_generator import make_generator”在 Keras 中使用平衡批次。首先,我将 X & y 转换为 numpy.ndarray,因为它是库的要求。我是这样实现的:“ generator = make_generator(X, y, batch_size=32) history = model_LSTM.fit(generator, epochs=30,callbacks=[early_stopping])” 但我收到一条错误消息:“ValueError: Args @ 987654321@ 和 y 的长度必须相同。”我的 X 和 y 形状是: X_shape: (5647,) y_shape: (5647, 6)" 它们怎么会有相同的形状 我不明白这是怎么工作的。 另外,由于我是新人,也许我应该将上面的评论整合到我的主要帖子中?不知道什么是正确的方法。 是的,可以根据需要编辑问题,只要它可以为您和其他人改进问题。 太好了,你能帮我看看上面的评论吗?如何解决? 我不确定您为什么会收到此错误。也许这是一个keras错误。检查您使用的 keras 版本?【参考方案2】:
    首先尝试简单模型。嵌入 1 层 LSTM 而非分类 如何标记文本,词汇量是否足够? 试试骰子损失

【讨论】:

以上是关于为啥我的多标签文本分类 LSTM 表现不佳?的主要内容,如果未能解决你的问题,请参考以下文章

多标签文本分类融合CNN-SAM与GAT的多标签文本分类模型

多标签文本分类《基于标签语义注意力的多标签文本分类》

多标签文本分类《基于标签语义注意力的多标签文本分类》

多标签文本分类《融合注意力与CorNet的多标签文本分类》

多标签文本分类《融合注意力与CorNet的多标签文本分类》

使用 TensorFlow 的多标签文本分类