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



我是机器学习和神经网络的新生。我在文本分类方面遇到了问题。我将 LSTM NN 架构系统与 Keras 库一起使用。 我的模型每次都能达到97%左右的结果。我得到的数据库大约有 100 万条记录,其中 600k 条是正数,400k 条是负数。 我还得到了 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)

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

我们在这里处理的问题称为过拟合。 首先,确保您的输入数据已正确清理。机器学习的原则之一是:"垃圾输入,垃圾输出"。接下来,您应该平衡数据收集,例如 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’))

您可以尝试使用 2 层和 64 个隐藏神经元,添加recurrent_dropout参数。 我们使用 sigmoid 函数的主要原因是因为它存在于 (0 到 1( 之间。因此,它特别适用于我们必须将概率预测为输出的模型。由于任何事物的概率只存在于 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])

我们还可以使用图形控制过拟合。如果您想了解如何操作,请查看此处。

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

最新更新