### Keras模型在测试集上无法预测值

我正在构建一个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个周期,所以它可能没有足够的时间来泛化数据,根据您的模型深度,它可能需要更多的训练时间。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注