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