首页 > 解决方案 > 使用 LSTM 制作新闻类别分类器

问题描述

我正在使用 LSTM 制作新闻分类模型。当我训练模型时,我的训练准确度不断提高,但验证准确度没有增加超过 57%。我有近 20 万条新闻段落,并将它们分为 30 个不同的类别。

我的模型如下:

model=Sequential()
model.add(Embedding(30000,64,input_length=X_train.shape[1],mask_zero=True))
model.add(Bidirectional(LSTM(64)))
model.add(Dropout(0.5))
model.add(Dense(64,activation='relu'))
model.add(Dense(30))
model.add(Activation(activation='softmax'))
model.compile(loss="categorical_crossentropy",optimizer='adam',metrics=['accuracy'])

标签: tensorflowmachine-learningkerasnlplstm

解决方案


首先,对于 30 个类别,随机基线准确度为(100/30) = 3.33%,因此您的模型已经足够好。

您没有提供更多详细信息,例如输入长度是多少,段落有多长,您是否进行了任何预处理,例如删除停用词,您如何将段落截断为具有相同的长度input_length

另一个问题可能是类不平衡,可能对于某些类,您的示例太少。尝试删除它们或增加数据集以使类平衡。

我解决了一个类似的问题,新闻类别分类,但是对于孟加拉语,孟加拉语新闻类别分类肯定比对英语进行分类更具挑战性。

我使用了一个 BiLSTM 模型,它在没有任何严重的超参数调整的情况下实现了 91% 以上的测试准确度。

这是我使用的模型:

from keras.models import Sequential
from keras.layers import Embedding, CuDNNLSTM, Bidirectional, Dense

embedding_dim = 8

model = Sequential()
model.add(Embedding(input_dim=vocab_size, 
                           output_dim=embedding_dim, 
                           input_length=maxlen))
model.add(Bidirectional(CuDNNLSTM(128, return_sequences = True)))
model.add(Bidirectional(CuDNNLSTM(128))) 
model.add(Dense(9, activation='softmax'))
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.summary()

Bangla News类别分类的完整代码:https ://github.com/zabir-nabil/bangla-news-rnn

现在,您没有绘制验证准确度与训练准确度的图,但我假设您的训练准确度更高。因此,您的模型过度拟合。也许减少嵌入层中的参数。

您可以使用 Google 新闻嵌入作为嵌入层的权重初始化器。https://github.com/mmihaltz/word2vec-GoogleNews-vectors

最好的方法是使用类似 BERT 的语言模型来获得非常好的准确性。https://github.com/huggingface/transformers


推荐阅读