繁体   English   中英

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

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

我是机器学习和神经网络领域的新生。 我遇到了文本分类问题。 我使用带有Keras库的LSTM NN体系结构系统。 我的模型每次达到约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)

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

我们在这里处理的问题称为过度拟合。 首先,请确保正确清洁了输入数据。 机器学习的原则之一是:“垃圾进,垃圾出”。 接下来,您应该平衡数据收集,例如在40万条肯定记录和40万条否定记录上。 依次将数据集划分为训练集,测试集和验证集(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参数。 我们使用S形函数的主要原因是因为它存在于(0到1)之间。 因此,它特别适用于必须预测输出概率的模型。由于任何事物的概率仅存在于0到1之间,因此S型是正确的选择。

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])

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM