我对使用LSTM进行文本分类还很陌生。
我试图使用LSTM将社交媒体数据分类为hate(1)和nothate(0),而不使用任何预训练的单词嵌入。
我做了一些预处理,去除了停用词,小写,词形化等,并使用tensorflow.keras.preprocessing.text.Tokenizer
进行标记化,将所有条目填充到512个标记的长度。
我的模型如下:
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条答案
按热度按时间ars1skjm1#
从结果中可以看出,模型只能识别大约一半的
hate
句子(recall=0.51
)。因此,您的模型在区分not-hate
和hate
时存在问题。现在的关键问题是:如何帮助您的模型区分这两个类别?一般来说,您可以考虑各种方法,即1)更好的数据,2)更多的数据,3)更大的模型,和/或4)超参数调优。下面你可以找到我的建议(1)的更详细的解释和其他一些参考。1.更好的数据
在不了解更多关于你的问题/数据的情况下,这是我推荐你的方法。仇恨言论通常是非常微妙和含蓄的。因此,理解单词使用的
context
是很重要的。尽管你的代码生成了定制训练的单词嵌入,但这些不会是contextual
,例如,单词dog
的嵌入对于dogs are awesome
和dogs are lame
来说是完全相同的。因此,为了提高模型区分这两个类别的能力,可以查看contextualized word embeddings
,例如,BERT
使用的嵌入。请注意,您通常不会训练自定义的,上下文化的单词嵌入,而是微调现有的单词嵌入。如果您有兴趣了解更多关于如何使用TensorFlow
自定义BERT
的信息,请阅读here指南。1.更多数据
模型在大数据上蓬勃发展,也许你的模型只是没有看到足够的数据(你没有提供任何关于数据集大小的信息,也许你的数据集大小是1,000句,而你的模型需要100,000句来学习关系)。
1.大型号
也许你有足够的数据,但你的模型不够复杂,无法捕捉到这种关系。根据通用近似定理的要点,一个更复杂的模型可以帮助你捕捉将
hate
从no-hate
中分离出来的关系。如果你想了解更多关于这个定理的信息,我发现Youtube上的this讲座非常有用1.超参数调优
也许您有足够的数据,并且您的模型具有正确的复杂性,但是您的模型配置是错误的,例如您的
learning rate
太小,这就是为什么您的模型需要很长时间来学习关系。您可以了解有关hyperparameter tuning on TensorFlow
here的更多信息