我尝试预测不同消息的标签(36个类)。我为Keras使用LSTM和tensorflow。当我预测11条消息的标签(Y)时,我会得到一些结果。但是,当我预测59条消息(11条新行+ 48条新行)的标签时,这11条消息的偏好就会发生变化...
网络很简单:
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
tf.keras.layers.LSTM(embedding_dim2, dropout=0.5, recurrent_dropout=0.5),
tf.keras.layers.Dense(n_class, activation='softmax')])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
rnn= model.fit(X_train, y_train, epochs= nb_epoch, batch_size=batch_size,validation_split=0.1, shuffle=True)
score = model.evaluate(X_test,y_test)
训练后,我在未标记的数据上测试了模型。我使用了W2V和典型的model.predict(unlabeled_data)函数。这是结果
(Y)标签 30 28 1个 28 31 27 31 30 30 30 0
当我添加新的38行时,结果为前11个。
(Y)标签 28 30 28 28 27 1个 31 31 0 28 31 31 31 28 31 31 27 30 4 ...
有人知道我做错了什么吗?据我所知,处理较简单的帧(Sklearn)时,如果我使用相同的模型,则相同消息的结果应该不会有所不同。 Jupyter和PyCharm(生产代码)中的情况相同。
感谢您的帮助。
如何准备数据并做出预测?
从csv加载
data = pd.read_csv("path", sep=';', usecols=['text'])
X = data['text']
tokenizer = Tokenizer(num_words=top_words)
tokenizer.fit_on_texts(X)
sequences_train = tokenizer.texts_to_sequences(X)
word_index = tokenizer.word_index
X_padded = sequence.pad_sequences(sequences_train, maxlen=mxlen)
然后我预测
prediction = model.predict(X_padded)
df_prediction = pd.DataFrame(prediction)
df_prediction['num_max'] = df_prediction.max(axis=1)
df_prediction['label'] = df_prediction.idxmax(axis=1)
pred = df_prediction.iloc[:, 37:39]
print(pred)
在下一路径中,我更改输入,但是代码保持不变。
答案 0 :(得分:3)
应在培训数据上安装令牌生成器,并使用该令牌生成器对您的测试/预测数据进行令牌化。
从您的代码看来,您似乎正在创建一个新的令牌生成器,并将其拟合到要传递给模型以进行预测的测试数据上(该模型已针对由其他令牌生成器令牌化的数据进行了训练)。
最重要的是,num_words
的{{1}}自变量从其适合的数据集中选择最常见的单词。但是,由于您的预测数据具有不同的标记器(仅适用于测试语料库),因此它可能具有完全不同的最常用词。
代码更改:
Tokenizer
然后使用您用于标记训练数据的标记器来标记(# tokenizer = Tokenizer(num_words=top_words) # remove line
# tokenizer.fit_on_texts(X) #remove line
)测试数据。
(注意:此建议严格基于问题中提供的代码段)