使用Keras错误预测和/或模型创建不存在的类的文本分类(单词袋) - python

尝试使用单词袋为文本分类模型构建预测模型。我遵循了各种指南和信息来构建以下方法。

培训数据集约有130万条记录,其中包含项目描述及其相关部门。我有54​​个系。

问题

test_dataset = ['white puppy','cottonelle clean  mega','zagg universal keyboard','sweet milk tea'']

问题是在上述阵列的预测过程中,该阵列与我的训练数据集具有完全相同的项目。它们要么落入错误的存储桶中,要么正在创建一个全新的类,而该类在我的数据集中不存在。我的课程范围在(最小1和最大98)之间,但总共有54个课程。

例:
甜奶茶应该去1但去2
Cottonelle Clean mega应该达到3,但达到45,甚至不存在。

这是我的输入数据集:
text_train
text_test
label_train
label_test

参量

vocab_size = 130000
longest_string = 20
hidden_size = 128
num_classes = 54
batch_size = 25000
epochs =7

将标签数据转换为一键矢量:

labelencoder_Y = LabelEncoder()
x = labelencoder_Y.fit_transform(label_train)
label_cat_train = np_utils.to_categorical(x, num_classes= num_classes)
y = labelencoder_Y.fit_transform(label_test)
label_cat_test = np_utils.to_categorical(y, num_classes= num_classes)

将我的文本数据转换为数值数组和填充

tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(text_train)
sequences = tokenizer.texts_to_sequences(text_train)
padded_sequences = pad_sequences(sequences)
data = pad_sequences(sequences, maxlen=longest_string)

建立模型并训练数据

model = Sequential()
model.add(Embedding(vocab_size, hidden_size,input_length=longest_string))
model.add(GRU(256, dropout=0.25, return_sequences=True))
model.add(GRU(256, dropout=0.25))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(data, label_cat_train, validation_split=0.1, epochs=epochs,batch_size = batch_size) 

同样,从输出模型来看,性能也很高。这根本不符合逻辑。

2018-09-18 22:05:41.039445: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
1101365/1101365 [==============================] - 668s 606us/step - loss: 3.4749 - acc: 0.1313 - val_loss: 2.6991 - val_acc: 0.2888
Epoch 2/7
1101365/1101365 [==============================] - 673s 611us/step - loss: 2.0425 - acc: 0.4523 - val_loss: 1.3667 - val_acc: 0.6435
Epoch 3/7
1101365/1101365 [==============================] - 682s 620us/step - loss: 1.0634 - acc: 0.7231 - val_loss: 0.8052 - val_acc: 0.7945
Epoch 4/7
1101365/1101365 [==============================] - 679s 617us/step - loss: 0.6992 - acc: 0.8187 - val_loss: 0.6251 - val_acc: 0.8392
Epoch 5/7
1101365/1101365 [==============================] - 679s 617us/step - loss: 0.5478 - acc: 0.8562 - val_loss: 0.5329 - val_acc: 0.8616
Epoch 6/7
1101365/1101365 [==============================] - 677s 615us/step - loss: 0.4618 - acc: 0.8770 - val_loss: 0.4814 - val_acc: 0.8739
Epoch 7/7
1101365/1101365 [==============================] - 690s 626us/step - loss: 0.4064 - acc: 0.8903 - val_loss: 0.4411 - val_acc: 0.8840

非常感谢有人可以提供有关此情况的信息。

参考方案

我怀疑问题出在您的标签编码中。您需要使用完全相同的编码器才能使标签匹配:

labelencoder_Y = LabelEncoder()
x = labelencoder_Y.fit_transform(label_train)
label_cat_train = np_utils.to_categorical(x, num_classes=num_classes)
y = labelencoder_Y.transform(label_test)  # do not fit again, but reuse the encoder
label_cat_test = np_utils.to_categorical(y, num_classes=num_classes)

也许您还需要检查类别标签。在上面,你写道

  兆应该升至3,但升至45,甚至不存在

但是说

num_classes = 54

这也是输出层的大小。

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

如何用'-'解析字符串到节点js本地脚本? - python

我正在使用本地节点js脚本来处理字符串。我陷入了将'-'字符串解析为本地节点js脚本的问题。render.js:#! /usr/bin/env -S node -r esm let argv = require('yargs') .usage('$0 [string]') .argv; console.log(argv…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…