带有嵌入的 NLP CNN,从 Twitter 文本中预测 5 个值

我有一堆大约 10K 字的 Twitter 文本(大约 70K)。有些更少,有些则更多。我创建了一个 Keras 架构来预测每个 Twitter 文本的 5 个值,并且我已经对那些 70K 进行了训练。然而,准确度(定义如下:当所有 5 个值的差异不超过 10 个时,pred1 和 pred2 匹配发生)为 21%(21% 的测试数据符合上述条件)。我不确定架构、tokenizer 和参数是否适合这个问题,但我会提供代码并寻求帮助。如果有人能帮我弄清楚为什么准确率这么低,我将不胜感激。这是模型:

class NeuralNetMulti(Regressor):
    def __init__(self):
        self.name = 'keras-sequential'
        self.model = Sequential()
        self.num_words = 35000
        self.tokenizer = Tokenizer(num_words=self.num_words,lower=True)
        # self.earlystopping = callbacks.EarlyStopping(monitor="mae",#                                              mode="min",patience=5,#                                              restore_best_weights=True)

    def fit(self,X,y):
        print('Fitting into the neural net...')
        #n_inputs = X.shape[1]
        n_outputs = y.shape[1]
        self.tokenizer.fit_on_texts(X)
        encoded_docs = self.tokenizer.texts_to_sequences(X)
        max_length = max([len(s.split()) for s in X])
        self.max_length = max_length
        X_train = pad_sequences(encoded_docs,maxlen=max_length,padding='post')
        vocab_size = len(self.tokenizer.word_index) + 1
        print(max_length)
        self.model.add(Embedding(self.num_words,512,input_length=max_length))
        self.model.add(Conv1D(filters=32,kernel_size=8,activation='relu'))
        self.model.add(MaxPooling1D(pool_size=2))
        self.model.add(Conv1D(filters=16,kernel_size=4,activation='relu'))
        self.model.add(MaxPooling1D(pool_size=2))
        self.model.add(Conv1D(filters=8,activation='relu'))
        self.model.add(MaxPooling1D(pool_size=2))
        self.model.add(flatten())
        self.model.add(Dense(1024,activation='relu'))
        self.model.add(Dense(512,activation='relu'))
        self.model.add(Dense(256,activation='relu'))
        self.model.add(Dense(n_outputs))
        self.model.summary()
        self.model.compile(loss='mse',optimizer='adam',metrics=['mse','mae'])
        history = self.model.fit(X_train,y,verbose=1,epochs=5,validation_split=0.1,batch_size=16)
def predict(self,X):
    print('Predicting...')
    encoded_docs = self.tokenizer.texts_to_sequences(X)
    X_test = pad_sequences(encoded_docs,maxlen=self.max_length,padding='post')
    predictions = self.model.predict(X_test,verbose=1)
    print('Predicted!')
    return predictions

在这种情况下,X 只是一个字符串数组(文本)。它们可能是 1000 个单词,但大多数都在 10K 个单词左右。 y 是我提到的具有 5 个值的数组数组。它们中的每一个都在 0 到 100 之间。这个模型达到了 21% 的准确率,但之前我使用了 TfIdf + PCA 和基本的 Dense 网络,我在相同的数据上达到了 62% 的准确率。我很感激任何在这个领域有经验的人提供专业的建议。提前致谢!

hohoman610 回答:带有嵌入的 NLP CNN,从 Twitter 文本中预测 5 个值

一种选择是尝试使用预先训练的词嵌入而不是随机嵌入,因为您在这里处理大量文本。您可以从像 GloVe 这样的静态嵌入开始,然后尝试像 BERT 这样的上下文化嵌入。请参阅此 Keras 文档以了解如何添加预训练的词向量 - link

本文链接:https://www.f2er.com/36776.html

大家都在问