如何使用 word2vec 修复(做得更好)文本分类模型

How to fix (do better) text classification model with using word2vec

我是机器学习和神经网络专业的新生。我遇到了文本分类的问题。我将 LSTM NN 架构系统与 Keras 库一起使用。 我的模型每次都能达到 97% 左右的结果。我得到的数据库大约有 100 万条记录,其中 60 万条是正面的,40 万条是负面的。 我还得到了 2 个标记为 类 的 0(负数)和 1(正数)。我的数据库拆分为训练数据库和测试数据库 80:20。对于 NN 输入,我使用在 PubMed 文章上训练过的 Word2Vec。 我的网络架构:

model = Sequential()
model.add(emb_layer)
model.add(LSTM(64, dropout =0.5))
model.add(Dense(2))
model.add(Activation(‘softmax’)
model.compile(optimizer=’rmsprop’, loss=’binary_crossentropy’, metrics=[‘accuracy’])
model.fit(X_train, y_train, epochs=50, batch_size=32)

如何在这种文本分类中修复(做得更好)我的神经网络创建的模型?

我们在这里处理的问题称为过度拟合。 首先,确保您的输入数据已正确清理。机器学习的原则之一是:“垃圾输入,垃圾输出”。接下来,您应该平衡您的数据收集,例如 400k 正记录和 400k 负记录。依次将数据集分为训练集、测试集和验证集(60%:20%:20%),例如使用scikit-learn库,如下例:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2)

然后我会使用不同的神经网络架构并尝试优化参数。 就个人而言,我会建议使用 2 层 LSTM 神经网络或卷积神经网络和递归神经网络的组合(速度更快,阅读文章效果更好)。

1) 2层LSTM:

model = Sequential()
model.add(emb_layer)
model.add(LSTM(64, dropout=0.5, recurrent_dropout=0.5, return_sequences=True)
model.add(LSTM(64, dropout=0.5, recurrent_dropout=0.5))
model.add(Dense(2))
model.add(Activation(‘sigmoid’))

您可以尝试使用具有 64 个隐藏神经元的 2 层,添加 recurrent_dropout 参数。 我们使用 sigmoid 函数的主要原因是因为它存在于(0 到 1)之间。因此,它特别适用于我们必须预测概率的模型,因为任何事物的 output.Since 概率仅存在于 0 和 1 之间,sigmoid 是正确的选择。

2) CNN + LSTM

model = Sequential()
model.add(emb_layer)
model.add(Convolution1D(32, 3, padding=’same’))
model.add(Activation(‘relu’))
model.add(MaxPool1D(pool_size=2))
model.add(Dropout(0.5))
model.add(LSTM(32, dropout(0.5, recurrent_dropout=0.5, return_sequences=True))
model.add(LSTM(64, dropout(0.5, recurrent_dropout=0.5))
model.add(Dense(2))
model.add(Activation(‘sigmoid’))

您可以尝试结合使用 CNN 和 RNN。在此架构中,模型学习速度更快(最多快 5 倍)。

那么,在这两种情况下,你都需要应用优化,损失函数。

对于这两种情况,一个好的优化器是 "Adam" 优化器。

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

在最后一步中,我们在验证集上验证我们的网络。 此外,我们使用回调,这将停止网络学习过程,以防万一,例如,在 3 次以上的迭代中,分类的准确性没有变化。

from keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(patience=3)

model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_val, y_val), callbacks=[early_stopping])

我们还可以使用图表来控制过度拟合。如果您想了解如何操作,请查看 here

如果您需要进一步的帮助,请在评论中告诉我。