python-3.x - 多输入多输出模型返回单值
问题描述
我正在尝试使用 Keras 中的多输入模型使用时间序列(即过去 n 个月的收入)和时间不变的客户数据(即性别、职业)来预测客户收入。为此,我使用 LSTM 模型来预测时间 (n+1) 的收入,然后引入客户数据作为辅助输入。
第一个模型 (LSTM) 产生了不错的结果,但添加辅助层似乎产生了一个悖论,因为每个客户的预测都是相同的值。任何建议为什么会发生这种情况?
已经尝试了多个批量大小并转换了一些数值变量,但问题仍然存在。
from keras.layers import Input, LSTM, Dense, concatenate
from keras.models import Model
'''
train_X1: time series data, customer revenues, 1 to (n-1)
train_X2: customer demographics
'''
train_X1 = np.asarray(X1.drop('id', axis = 1))
train_X1 = train_X1.reshape(train_X1.shape[0], train_X1.shape[1], 1)
print(train_X1.shape)
train_X2 = np.asarray(X2.drop('id', axis = 1))
print(train_X2.shape)
main_input = Input(shape = (20,1), name = "main_input")
hidden = Dense(10, activation = 'tanh')(main_input)
hidden = LSTM(10)(hidden)
aux_output = Dense(1, name = 'aux_output')(hidden)
train_X2 = np.asarray(X2.drop('id', axis = 1))
train_X2 = train_X2.reshape(train_X2.shape[0], train_X2.shape[1])
print(train_X2.shape)
aux_input = Input(shape = (2, ), name = "aux_input")
hidden = concatenate([aux_output, aux_input])
hidden = Dense(2, activation = 'relu')(hidden)
main_output = Dense(1, name = "main_output")(hidden)
model = Model(inputs = [main_input, aux_input], outputs = [main_output, aux_output])
model.compile(optimizer ='adam',
loss = {'main_output': 'mean_squared_error', 'aux_output': 'mean_squared_error'},
loss_weights = {'main_output': 1, 'aux_output': 0.2})
model.fit({'main_input': train_X1, 'aux_input': train_X2},
{'main_output': y, 'aux_output': y},
epochs = 50, batch_size = 5)
期望不同的预测,但此代码仅导致单个值预测。(见图)
注意:我目前只在一个非常小的数据集中模拟这项工作,然后才能将其扩展到更大的集合。这可能是数据问题吗?
解决方案
当你这样做
preds = model.predict([train_X1, train_X2])
您将获得两个 numpy 数组的列表。
如果 is 的 shapetrain_X1
和(100, 20, 1)
shape of train_X2
is(100, 2)
你preds
将是两个 numpy 数组的列表,其中每个数组都是 shape (100, 1)
。
i
您可以像这样访问测试样本的预测
preds[0][i], preds[1][i]
您可以遍历数组以获取每个样本的输出以进行视觉验证,如下所示
preds = model.predict([train_X1, train_X2])
for i in range(len(preds[1])):
print(f'Main prediction for sample {i} = {preds[0][i]} --- Aux Prediction for sample {i} = {preds[1][i]}')
# Output
Main prediction for sample 0 = [-5.820766e-09] --- Aux Prediction for sample 0 = [-9.313226e-09]
Main prediction for sample 1 = [-5.820766e-09] --- Aux Prediction for sample 1 = [-9.313226e-09]
Main prediction for sample 2 = [-5.820766e-09] --- Aux Prediction for sample 2 = [-9.313226e-09]
Main prediction for sample 3 = [-5.820766e-09] --- Aux Prediction for sample 3 = [-9.313226e-09]
Main prediction for sample 4 = [-5.820766e-09] --- Aux Prediction for sample 4 = [-9.313226e-09]
..................................................................................................
推荐阅读
- c - 如何在c中的一行中打印不同的数组?
- jackson - 杰克逊数据绑定:无法构造`java.time.OffsetDateTime`的实例
- android - 在回收视图中更改卡片的颜色
- python - PDF to Image 并使用 Wand Python 将其下载到特定文件夹
- vue.js - 可以在浏览器版本vuejs中使用nuxt吗?
- c - Zynq7000 I2C 不工作,但寄存器设置正确
- python - 如何在python中转换日期时间?
- azure-pipelines-release-pipeline - 如何使用powershell在构建管道中验证天蓝色任务中的空字段
- rust - 内部 Rust 结构可以传递对其所有者的引用吗?
- asp.net-mvc - 如何根据控制器和动作方法创建面包屑