我正在构建一个Keras模型,用于预测用户是否会选择某个产品(二元分类)。
模型在训练过程中对验证集表现出进展,但在测试集上的预测结果全部为0。
我的数据集看起来像这样:
train_dataset customer_id id target customer_num_id0 TCHWPBT 4 0 11 TCHWPBT 13 0 12 TCHWPBT 20 0 13 TCHWPBT 23 0 14 TCHWPBT 28 0 1... ... ... ... ...1631695 D4Q7TMM 849 0 74171631696 D4Q7TMM 855 0 74171631697 D4Q7TMM 856 0 74171631698 D4Q7TMM 858 0 74171631699 D4Q7TMM 907 0 7417
我使用以下方法将数据集分为训练集和验证集:
from sklearn.model_selection import train_test_splitTrain, 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 = 2for 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: 01468530/1468530 [==============================] - 19s 13us/step - loss: 0.0891TRAIN F1: 0.1537511577647422VAL F1: 0.09745762711864409EPOCH: 11468530/1468530 [==============================] - 19s 13us/step - loss: 0.0691TRAIN F1: 0.308748569645272VAL 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
这里可能存在什么问题?
回答:
请查看您的数据分布。从您展示的样本数据来看,目标值全部为0。考虑到如果大多数用户不选择该产品,那么如果模型总是预测0,它大多数时候都是正确的。因此,模型可能会通过过度拟合到多数类(0)来提高其准确性。
您可以通过调整参数,如学习率和模型架构,添加dropout层来防止过拟合。
另外,我不确定您的模型是什么样子的,但您只训练了2个周期,所以它可能没有足够的时间来泛化数据,根据您的模型深度,它可能需要更多的训练时间。