【问题标题】:Tenserflow model for text classification doesn't predict as expected?用于文本分类的 TensorFlow 模型没有按预期预测?
【发布时间】:2020-02-02 03:34:14
【问题描述】:

我正在尝试训练一个用于情感分析的模型,它在将数据拆分为训练和测试时显示出 90% 的准确率!但是每当我在一个新短语上测试它时,结果几乎相同(通常在 0.86 - 0.95 范围内)! 代码如下:

sentences = data['text'].values.astype('U')
y = data['label'].values

sentences_train, sentences_test, y_train, y_test = train_test_split(sentences, y, test_size=0.2, random_state=1000)

tokenizer = Tokenizer(num_words=5000)
tokenizer.fit_on_texts(sentences_train)

X_train = tokenizer.texts_to_sequences(sentences_train)
X_test = tokenizer.texts_to_sequences(sentences_test)

vocab_size = len(tokenizer.word_index) + 1  

maxlen = 100

X_train = pad_sequences(X_train, padding='post', maxlen=maxlen)
X_test = pad_sequences(X_test, padding='post', maxlen=maxlen)

embedding_dim = 50
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=embedding_dim,input_length=maxlen))
model.add(layers.Flatten())
model.add(layers.Dense(10, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])
model.summary()

history = model.fit(X_train, y_train,
                    epochs=5,
                    verbose=True,
                    validation_data=(X_test, y_test),
                    batch_size=10)
loss, accuracy = model.evaluate(X_train, y_train, verbose=False)
print("Training Accuracy: {:.4f}".format(accuracy))
loss, accuracy = model.evaluate(X_test, y_test, verbose=False)
print("Testing Accuracy:  {:.4f}".format(accuracy))

训练数据是一个 CSV 文件,包含 3 个字段:(id, text, labels(0,1)),其中 0 为正数,1 为负数。

Training Accuracy: 0.9855
Testing Accuracy:  0.9013

在新句子上测试它,例如“这只是一个文本!”和“讨厌传教士!”将预测相同的结果 [0.85],[0.83]。

【问题讨论】:

  • 你有多少训练样例?您是如何决定使用 5k 作为词汇量的?

标签: python tensorflow machine-learning keras


【解决方案1】:

您似乎是overfitting 的受害者。换句话说,我们的模型会过度拟合training data。尽管通常可以在训练集上实现高精度,但在您的情况下,我们真正想要的是开发能够很好地泛化到测试数据(或他们的数据)的模型没见过)。

您可以按照these 的步骤来防止过拟合。

另外,为了提高算法的性能,我建议你增加Dense层的神经元的数量,并设置更多的epochs以提高算法的性能。用新数据对其进行测试。

【讨论】:

  • 这个答案中的建议没有多大意义。如果过拟合是问题,那么增加模型的容量或训练更长时间将导致更多的过拟合。
  • @Mathias,我知道这一点。但我不认为 OP 有更多的数据。由于他使用的 epoch 和神经元数量很少,这会导致性能下降,因为算法训练不足,无法泛化到测试数据
  • 如果参数数量太少,或者epoch太少,这会导致训练数据的准确率低,并且会出现underfitting我>。事实并非如此。
  • 如果面临过拟合应该怎么做,例如,1) 验证数据的提前停止,2) 正则化,例如 dropout。减少参数数量或 epoch 数量也是一种选择,但这是一种“命中注定”的方法。
  • @Mathias,如果您查看问题文本,您会发现训练和测试的准确性非常好,这就是为什么我倾向于说它是过拟合而不是欠拟合
猜你喜欢
  • 2021-03-23
  • 1970-01-01
  • 2021-05-17
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2020-10-21
  • 2018-07-31
相关资源
最近更新 更多