首页 > 解决方案 > Keras 模型无法预测测试集中的值

问题描述

我正在构建一个 Keras 模型来预测用户是否会选择某个产品(二元分类)。

模型似乎在训练时保留的验证集上取得了进展,但是当涉及到测试集时,模型的预测都是 0。

我的数据集看起来像这样:

train_dataset
    
customer_id id  target  customer_num_id
0   TCHWPBT 4   0         1
1   TCHWPBT 13  0         1
2   TCHWPBT 20  0         1
3   TCHWPBT 23  0         1
4   TCHWPBT 28  0         1
... ... ... ... ...
1631695 D4Q7TMM 849 0   7417
1631696 D4Q7TMM 855 0   7417
1631697 D4Q7TMM 856 0   7417
1631698 D4Q7TMM 858 0   7417
1631699 D4Q7TMM 907 0   7417

我使用以下方法将其拆分为训练/验证集:

from sklearn.model_selection import train_test_split

Train, Val = train_test_split(train_dataset, test_size=0.1, random_state=42, shuffle=False)

拆分数据集后,我选择在训练和验证模型时使用的特征:

train_customer_id = Train['customer_num_id']
train_vendor_id = Train['id']
train_target = Train['target']

val_customer_id = Val['customer_num_id']
val_vendor_id = Val['id']
val_target = Val['target']

...并运行模型:

epochs = 2

for e in range(epochs):
  print('EPOCH: ', e)
  model.fit([train_customer_id, train_vendor_id], train_target, epochs=1, verbose=1, batch_size=384)
  
  prediction = model.predict(x=[train_customer_id, train_vendor_id], verbose=1, batch_size=384)
  train_f1 = f1_score(y_true=train_target.astype('float32'), y_pred=prediction.round())
  print('TRAIN F1: ', train_f1)

  val_prediction = model.predict(x=[val_customer_id, val_vendor_id], verbose=1, batch_size=384)
  val_f1 = f1_score(y_true=val_target.astype('float32'), y_pred=val_prediction.round())
  print('VAL F1: ', val_f1)

EPOCH: 0
1468530/1468530 [==============================] - 19s 13us/step - loss: 0.0891
TRAIN F1:  0.1537511577647422
VAL F1:  0.09745762711864409
EPOCH:  1
1468530/1468530 [==============================] - 19s 13us/step - loss: 0.0691
TRAIN F1:  0.308748569645272
VAL F1:  0.2076433121019108

验证准确度似乎随着时间的推移而提高,模型预测 1 和 0:

    prediction = model.predict(x=[val_customer_id, val_vendor_id], verbose=1, batch_size=384)
    np.unique(prediction.round())

    array([0., 1.], dtype=float32)

但是当我尝试预测测试集时,模型预测所有值都为 0:

prediction = model.predict(x=[test_dataset['customer_num_id'], test_dataset['id']], verbose=1, batch_size=384)
np.unique(prediction.round())

array([0.], dtype=float32)

测试数据集看起来类似于训练集和验证集,并且在训练过程中就像验证集一样被遗漏了,但模型不能输出除 0 以外的值。

这是测试数据集的样子:

 test_dataset
    
         customer_id    id  customer_num_id
    0     Z59FTQD      243      7418
    1     0JP29SK      243      7419
    ... ... ... ...
    1671995 L9G4OFV    907      17414
    1671996 L9G4OFV    907      17414
    1671997 FDZFYBA    907      17415

有谁知道这里可能是什么问题?

编辑:使数据集文本更具可读性

标签: machine-learningkerasdeep-learningneural-networkrecommendation-engine

解决方案


请查看您的数据分布。我在您显示的示例数据中看到目标全为 0。考虑一下,如果大多数用户不选择产品,那么如果模型总是预测为 0,那么大部分时间都是正确的。因此,它可以通过过度拟合大多数类(0)来提高它的准确性。

您可以通过添加 dropout 层来调整学习率和模型架构等参数来防止过度拟合。

另外,我不确定你的模型是什么样的,但你只训练了 2 个 epoch,所以它可能没有足够的时间来概括数据,并且取决于你的模型有多深,它可能需要更多的训练时间


推荐阅读