Keras 模型不预测测试集中的值
Keras model not predicting values in the Test set
我正在构建一个 Keras 模型来预测用户是否会 select 特定产品(二元分类)。
模型似乎在训练时保留的验证集上取得了进展,但模型在测试集上的预测全为 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
我将它分成 Train/Val 组使用:
from sklearn.model_selection import train_test_split
Train, Val = train_test_split(train_dataset, test_size=0.1, random_state=42, shuffle=False)
拆分数据集后,我select训练和验证模型时使用的特征:
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
有谁知道这里可能是什么问题?
编辑:使数据集文本更具可读性
请查看您的数据分布情况。我在示例数据中看到您显示的目标全为 0。考虑到如果大多数用户不 select 产品,那么如果模型总是预测 0,那么它在大多数时候都是正确的。因此,它可以通过过度拟合大多数来提高它的准确性 class (0).
您可以通过添加 dropout 层来调整学习率和模型架构等参数来防止过拟合。
另外,我不确定你的模型是什么样子,但你只训练了 2 个时期,所以它可能没有足够的时间来概括数据,这取决于你的模型有多深需要更多的训练时间
我正在构建一个 Keras 模型来预测用户是否会 select 特定产品(二元分类)。
模型似乎在训练时保留的验证集上取得了进展,但模型在测试集上的预测全为 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
我将它分成 Train/Val 组使用:
from sklearn.model_selection import train_test_split
Train, Val = train_test_split(train_dataset, test_size=0.1, random_state=42, shuffle=False)
拆分数据集后,我select训练和验证模型时使用的特征:
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
有谁知道这里可能是什么问题?
编辑:使数据集文本更具可读性
请查看您的数据分布情况。我在示例数据中看到您显示的目标全为 0。考虑到如果大多数用户不 select 产品,那么如果模型总是预测 0,那么它在大多数时候都是正确的。因此,它可以通过过度拟合大多数来提高它的准确性 class (0).
您可以通过添加 dropout 层来调整学习率和模型架构等参数来防止过拟合。
另外,我不确定你的模型是什么样子,但你只训练了 2 个时期,所以它可能没有足够的时间来概括数据,这取决于你的模型有多深需要更多的训练时间