У меня есть набор данных временных рядов с N наблюдениями и F функциями. Каждая функция может либо проявляться (1), либо не проявляться (0). Таким образом, набор данных будет выглядеть так:
T F1 F2 F3 F4 F5 ... F
0 1 0 0 1 0 0
1 0 1 0 0 1 1
2 0 0 0 1 1 0
3 1 1 1 1 0 0
...
N 1 1 0 1 0 0
Я пытаюсь использовать архитектуру на основе LSTM, чтобы предсказать, какие функции проявляются во время T + 1, на основе наблюдений T-W - T, где W - ширина некоторого временного окна. Если W = 4, LSTM «видит» 4 временных шага в прошлое, чтобы сделать прогноз. LSTM ожидает 3D-ввод, который будет иметь вид (number_batches, W, F). Наивная реализация Keras может выглядеть так:
model = Sequential()
model.add(LSTM(128, stateful=True, batch_input_shape=(batch_size, W, F)))
model.add(Dense(F, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size, epochs=250, shuffle=False,
validation_data=(x_val, y_val))
Основная проблема, с которой я сталкиваюсь, заключается в следующем: полный набор данных имеет большое количество признаков (> 200), и признаки проявляются относительно редко, т.е. 0 встречается гораздо чаще, чем 1. Нейронная сеть просто учится устанавливать все значения до 0 и, таким образом, достигается высокая степень «точности».
По сути, я хочу взвесить каждый 1 во входной матрице некоторым значением, чтобы придать ему большее значение, но я не понимаю, как реализовать это в Keras. Я знаю, что в Keras есть опция sample_weight
, но как она работает? Я бы не знал, как реализовать это, например, в моем примере. Это разумное решение моей проблемы? Какие оптимизаторы и функции потерь обычно используются для этого типа задач?