LSTM 文本分类的低召回率和 f1 分数

Low recall and f1-score for LSTM Text classification

提问人:ix.trc 提问时间:11/10/2023 更新时间:11/10/2023 访问量:36

问:

我对 LSTM 的文本分类很陌生。

我正在尝试使用没有任何预训练词嵌入的 LSTM 将社交媒体数据分类为仇恨 (1) 和不仇恨 (0)。

我做了一些预处理,删除了停用词、小写、词形还原等,并用于标记化,将所有条目填充到 512 个标记的长度。tensorflow.keras.preprocessing.text.Tokenizer

我的模型如下:

from tensorflow.keras.layers import LSTM, Dense, Embedding, Dropout
from tensorflow.keras.models import Sequential

model = Sequential()
model.add(Embedding(512, 200)
model.add(LSTM(128, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(1, activation="sigmoid"))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

模型摘要如下:

enter image description here

分类报告如下:

enter image description here

在训练模型之前,我对训练数据进行了欠采样,以获得平衡的数据集。测试数据仍然不平衡。 虽然精确率、回忆率和 f1 分数对班级非仇恨有好处,但 f1 分数和回忆似乎对仇恨言论表现不佳。

Keras LSTM 复发神经网络 文本分类

评论


答:

2赞 Simon David 11/10/2023 #1

从结果中可以看出,模型只能识别大约一半的句子()。因此,您的模型在从 .现在的关键问题是:如何帮助模型区分这两个类别?一般来说,您可以考虑多种方法,即 1) 更好的数据,2) 更多的数据,3) 更大的模型,和/或 4) 超参数优化。您可以在下面找到关于我的建议(1)的更详细的解释以及对其他建议的一些参考。haterecall=0.51not-hatehate

  1. 更好的数据

在不了解您的问题/数据的情况下,这是我推荐您的方法。仇恨言论通常非常微妙和含蓄。因此,了解使用哪些单词很重要。尽管您的代码会生成自定义训练的单词嵌入,但这些嵌入不会与上下文相关,例如,单词的嵌入将与 和 完全相同。因此,为了提高模型分离这两个类别的能力,您可以研究 ,例如 BERT 使用的嵌入。请注意,您通常不会训练自定义的上下文化词嵌入,而是微调现有的词嵌入。如果您有兴趣了解有关如何使用自定义的更多信息,请阅读此处的指南。contextdogdogs are awesomedogs are lamecontextualized word embeddingsBERTTensorFlow

  1. 更多数据

这是不言自明的。模型在大数据上茁壮成长,也许你的模型只是没有看到足够的数据(你没有提供任何关于数据集大小的信息,也许你的数据集大小是 1,000 个句子,而你的模型需要 100,000 个句子来学习这种关系)。

  1. 更大的模型

也许你有足够的数据,但你的模型不够复杂,无法捕获这种关系。根据通用近似定理的结论,一个更复杂的模型可以帮助您捕获除以 的关系。如果你想了解更多关于这个定理的信息,我发现Youtube上的这个讲座非常有用hateno-hate

  1. 超参数调优

也许你有足够的数据,而且你的模型具有正确的复杂度,但你的模型配置是错误的,例如你的模型太小了,这就是为什么你的模型需要很长时间来学习这种关系。你可以在这里了解更多信息learning ratehyperparameter tuning on TensorFlow