Модель с несколькими входами и несколькими выходами возвращает одно значение - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь получить прогноз доходов клиентов, используя как временные ряды (т. Е. Доход за последние n месяцев), так и не зависящие от времени данные о клиентах (т. Е. Пол, род занятий), используя модель множественного ввода в Keras. Для этого я использовал модель 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)

Ожидается изменяющийся прогноз, но этот код приводит только к одному значению. (см. изображение)

Примечание: В настоящее время я имитирую эту работу только в очень маленьком наборе данных, прежде чем смогу масштабировать ее до большего набора. Может ли это быть проблемой с данными?

enter image description here

1 Ответ

1 голос
/ 28 марта 2019

Когда вы делаете

preds = model.predict([train_X1, train_X2])

вы получите список из двух массивов.

Если форма train_X1 равна (100, 20, 1), а форма train_X2 равна (100, 2), то ваш preds будет списком из двух числовых массивов, где каждый массив имеет форму (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]
..................................................................................................
...