如何解决基于 NLP 的 CNN 模型中的过度拟合问题,以使用词嵌入进行多类文本分类?

Posted

技术标签:

【中文标题】如何解决基于 NLP 的 CNN 模型中的过度拟合问题,以使用词嵌入进行多类文本分类?【英文标题】:How does one tackle over-fitting in NLP based CNN models for multiclass text classification with word embeddings? 【发布时间】:2021-05-28 16:40:44 【问题描述】:

(问题:多类文本分类问题中的过拟合问题) 在我的个人项目中,目标是根据公司描述对公司的行业标签进行分类。我采取的步骤是:

    删除停用词、标点符号、空格等,并将说明拆分为标记。 将标签和标记转换为词向量。 将标记转换为词嵌入模型。 设置具有 62 个输出节点的 CNN。 (62 个不同的行业标签进行分类)

图片/数据集链接供参考:https://drive.google.com/drive/folders/1yLW2YepoHvSp_koHDDzcAAJBIaYQIen0?usp=sharing


我面临的问题是模型过拟合,不管我做了什么改变。 (由于我为损失设置的回调而提前结束) [CNN准确率][7]

max_features = 700
maxlen = 200
embedding_dims = 50
filters = 200
kernel_size = 3
hidden_dims = 160
es_callback = EarlyStopping(monitor='val_loss', patience=5)

model = Sequential()
model.add(Embedding(vocab_size, 100, weights=[embedding_matrix], trainable=False))
model.add(Dropout(0.4))

model.add(Conv1D(filters,
                 kernel_size,
                 padding='valid',
                 activation='relu',
                 strides=1))
model.add(GlobalMaxPooling1D())

model.add(Dense(hidden_dims))
model.add(Dropout(0.4))
model.add(Activation('relu'))

model.add(Dense(62))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

history = model.fit(X_train, y_label_train,
              batch_size=64,
              epochs=50,
              validation_data=(X_test, y_label_test),
              callbacks=[es_callback])

代码链接:https://colab.research.google.com/drive/1YqbhPX6e4bJ5FnbfHj7fTQH4tUe6diva?usp=sharing

【问题讨论】:

【参考方案1】:

我觉得这个问题很笼统,尽管它不仅对 NLP 有用。因此,我认为要正确解决这个问题,需要涵盖很多主题。我建议您首先关注数据预处理步骤,因此这里描述神经网络架构的代码 sn-p(在我看来)可能是最后一步。基于对 colab 代码的初步了解,我建议:

更好的数据预处理

更正确的数据预处理

例如,我认为您仅在训练数据X['Text_Clean'] = X['Business Description'].apply(lambda x: remove_punct(x)) 上应用了以下内容,并且我没有在测试集上看到类似转换的管道,也没有看到直接转换。 您在 tokens 上应用了词嵌入。我相信它们会给您的文本“text_final”功能带来更大的价值,这样您就可以从语义表示中获得价值em> 的文本叙述。

在general 我会说:转换为小写,删除 html 标记、标点符号、非字母字符、删除停用词/根据您的特定文本在停用词列表中添加一些其他词,修复一些非正式的词汇表中的文本,例如"what's" -> "what is",并通过词干将语义大致相同的单词转换为一种标准形式。

Imbalanced Classification Problems:发生了

当每个类的训练数据集中的示例数 标签不平衡。

简单地说,当你的少量标签占据了与你的文本相关的大量标签时,剩下的要学习的“少数”标签就没有太多的训练了。

Feature Engineering:您可以创建额外的功能和元数据来增强培训和学习。例如,您可以添加一个列来提供每个实例的情绪,和/或您可以将主题建模应用为一个额外的属性(它们类似于您放在数据框上的“令牌”,支持 - 而不是替换 -主要文本属性)。

最后,我认为首先从TfidfVectorizer 开始并观察那里的准确性,然后再进行神经网络,这不是一个坏主意。如果以上还不够,还可以在使用深度神经网络的同时探索更鲁棒的迁移学习和pre-trained models。

【讨论】:

以上是关于如何解决基于 NLP 的 CNN 模型中的过度拟合问题,以使用词嵌入进行多类文本分类?的主要内容,如果未能解决你的问题,请参考以下文章

CNN为啥能使用在NLP?

过度拟合

过度拟合数据集的可能原因

如何测试过度拟合的随机森林回归模型?

如何使用 GridSearchCV 测试回归交叉验证中的过度拟合?

CNN 中的验证损失显着减少,模型拟合还是过拟合?