提问人:ix.trc 提问时间:11/10/2023 更新时间:11/10/2023 访问量:36
LSTM 文本分类的低召回率和 f1 分数
Low recall and f1-score for LSTM Text classification
问:
我对 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'])
模型摘要如下:
分类报告如下:
在训练模型之前,我对训练数据进行了欠采样,以获得平衡的数据集。测试数据仍然不平衡。 虽然精确率、回忆率和 f1 分数对班级非仇恨有好处,但 f1 分数和回忆似乎对仇恨言论表现不佳。
答:
从结果中可以看出,模型只能识别大约一半的句子()。因此,您的模型在从 .现在的关键问题是:如何帮助模型区分这两个类别?一般来说,您可以考虑多种方法,即 1) 更好的数据,2) 更多的数据,3) 更大的模型,和/或 4) 超参数优化。您可以在下面找到关于我的建议(1)的更详细的解释以及对其他建议的一些参考。hate
recall=0.51
not-hate
hate
- 更好的数据
在不了解您的问题/数据的情况下,这是我推荐您的方法。仇恨言论通常非常微妙和含蓄。因此,了解使用哪些单词很重要。尽管您的代码会生成自定义训练的单词嵌入,但这些嵌入不会与上下文相关
,例如,单词的嵌入将与 和 完全相同。因此,为了提高模型分离这两个类别的能力,您可以研究 ,例如 BERT
使用的嵌入。请注意,您通常不会训练自定义的上下文化词嵌入,而是微调现有的词嵌入。如果您有兴趣了解有关如何使用自定义的更多信息,请阅读此处的指南。context
dog
dogs are awesome
dogs are lame
contextualized word embeddings
BERT
TensorFlow
- 更多数据
这是不言自明的。模型在大数据上茁壮成长,也许你的模型只是没有看到足够的数据(你没有提供任何关于数据集大小的信息,也许你的数据集大小是 1,000 个句子,而你的模型需要 100,000 个句子来学习这种关系)。
- 更大的模型
也许你有足够的数据,但你的模型不够复杂,无法捕获这种关系。根据通用近似定理的结论,一个更复杂的模型可以帮助您捕获除以 的关系。如果你想了解更多关于这个定理的信息,我发现Youtube上的这个讲座非常有用hate
no-hate
- 超参数调优
也许你有足够的数据,而且你的模型具有正确的复杂度,但你的模型配置是错误的,例如你的模型太小了,这就是为什么你的模型需要很长时间来学习这种关系。你可以在这里了解更多信息learning rate
hyperparameter tuning on TensorFlow
评论