【问题标题】:Text classification (Bag of words) using Keras wrong predictions && model creating non existent classes使用 Keras 错误预测 && 模型创建不存在的类的文本分类(词袋)
【发布时间】:2019-02-24 00:52:00
【问题描述】:

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

训练数据集大约有 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 文本测试 label_train 标签测试

参数

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

将标签数据转换为 one-hot 向量:

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

如果有人可以就这种情况提供意见,我们将不胜感激。

【问题讨论】:

    标签: python text keras classification


    【解决方案1】:

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

    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)
    

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

    mega 应该到 3,但到 45,甚至不存在

    但要说明

    num_classes = 54
    

    这也是你的输出层的大小。

    【讨论】:

    • “test_dataset”没有经过编码器的任何转换。事实上,这就是使用标记器对其进行转换的方式。 sequences = tokenizer.texts_to_sequences(test_dataset) padded_sequences = pad_sequences(sequences) test_data = pad_sequences(sequences, maxlen=longest_string)我已经更新了OP中的类信息。
    • 请仔细查看我发布的代码。您正在使用labelencoder_Y 对测试标签进行编码(您应该这样做),但在您的版本中,您实际上是在为测试标签实例化一个新的编码器,这可能会导致将不同的数字标签分配给一个类。
    • 尝试了以下但结果相同。我还缺少什么吗? labelencoder_Y = LabelEncoder() x = labelencoder_Y.fit_transform(label_train) label_cat_train = np_utils.to_categorical(x, num_classes=num_classes) test_dataset = ['white puppy','cottonelle clean mega','zagg universal keyboard','sweet milk tea''] sequences = tokenizer.texts_to_sequences(test_dataset) padded_sequences = pad_sequences(sequences) test_data = pad_sequences(sequences, maxlen=longest_string) predictions = model.predict_classes(test_data)
    • 您是否根据训练数据评估了您的模型?您是否检查过单个预测以了解问题所在?
    • 经过一番调查,模型预测正确,但输出以某种方式转换为 1 到 54 之间的数字。我应用了一些后期转换来匹配预测。 `blend['predicted_dept'] = blend['predicted_dept'].replace({53:98,52:97,51:96,50:95,49:94,48:93,........ .........,10:11,9:10,8:9,7:8,6:7,5:6,4:5, 3:4,2:3,1:2, 0:1}) 这不是一个理想的解决方案,但它确实有效。
    猜你喜欢
    • 2018-02-09
    • 2016-08-28
    • 2019-02-28
    • 2019-07-02
    • 2019-01-14
    • 2011-02-20
    • 2020-11-09
    • 2018-12-01
    • 2019-10-19
    相关资源
    最近更新 更多