Вопрос или проблема
Существует ли модель машинного обучения (что-то вроде LSTM
или 1D-CNN
), которая принимает на вход две временные серии переменной длины и выдает бинарную классификацию (Истина/Ложь, являются ли временные серии одного ярлыка)?
Таким образом, данные будут выглядеть примерно так:
дата значение ярлык
2020-01-01 2 0 # первая входная временная серия
2020-01-02 1 0 # первая входная временная серия
2020-01-03 1 0 # первая входная временная серия
2020-01-01 3 1 # вторая входная временная серия
2020-01-03 1 1 # вторая входная временная серия
Существует ли что-то подобное в готовом виде, и если нет, как бы вы построили минимальный рабочий пример модели в Keras
?
Мой лучший вариант – использовать общий LSTM
слой для обоих входов и Concatenate
оба результирующих вектора перед подачей в финальный Dense
слой.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
n_lstm_blocks = 50
input_1 = keras.Input(shape=(None, 1)) # неизвестный временной интервал, фиксированный размер признака 1
input_2 = keras.Input(shape=(None, 1))
shared_lstm = layers.LSTM(n_lstm_blocks)
encode_1 = shared_lstm(input_1)
encode_2 = shared_lstm(input_2)
concat = layers.concatenate([encode_1,encode_2])
output = layers.Dense(1, activation='sigmoid')(concat)
model = keras.Model(inputs=[input_1,input_2],outputs=output)
model.compile(optimizer="adam", loss="binary_crossentropy")
Сравнимой задачей были бы сиамские сети / одноразовое обучение, которые используются для распознавания лиц. Но в данном случае задача состоит в том, чтобы сравнить две временные серии и определить, имеют ли они одинаковый ярлык, но знать каждый ярлык – это НЕ задача сети!
Я думаю, что как LSTM, так и 1D-CNN могут работать, но это зависит от ваших данных в первую очередь.
В вашем коде вы использовали общий LSTM, что подразумевает, что вы считаете, что ваши две входные последовательности на самом деле просто последовательности одинаковой переменной длины? Если это так, почему бы не использовать LSTM для маркировки, а затем сравнить их метки.
Если это не так, тогда вы можете использовать отдельный ввод.
Итак, ограничение на использование 1D-CNN для последовательностей в том, что ваша последовательность должна иметь одинаковую длину среди образцов (насколько мне известно). Итак, если у вас есть два типа последовательностей с фиксированной длиной $l_1$ и $l_2$ среди образцов, тогда вы можете попробовать этот подход.
Если у вас есть два типа последовательностей, обе с переменной длиной, то вам придется использовать один динамичный вход LSTM для каждой из них, а затем объединить эти два LSTM.
Ответ или решение
Бинарная классификация с использованием временных рядов переменной длины
Введение
В условиях быстрого развития технологий и огромного объема данных, которые необходимо обрабатывать, возникает потребность в эффективных методах анализа временных рядов, особенно когда данные имеют переменную длину. Ваша задача — использовать машинное обучение для бинарной классификации, основываясь на двух временных рядах с переменной длиной, для определения, принадлежат ли они к одной категории.
Подходящие модели
Среди различных архитектур глубокого обучения, такие как LSTM (Long Short-Term Memory) и 1D-CNN (One-Dimensional Convolutional Neural Networks), особенно выделяется возможность использования общих (shared) слоев. Это позволяет снизить вероятность переобучения и улучшить обобщающую способность модели, так как два временных ряда можно рассматривать как две части одного процесса.
Описание данных
Как показано в вашем вопросе, данные содержат временные метки (date), значения (value) и метки классов (label). При этом каждый временной ряд может иметь переменную длину. Наиболее подходящий способ работы с такими данными — объединение временных рядов через метод совместного обучения.
Построение модели
Рассмотрим реализацию данной стратегии в Keras. Вы правильно предложили использовать общий LSTM-слой. Ниже представлен код, который демонстрирует построение модели:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# Определяем количество блоков в LSTM
n_lstm_blocks = 50
# Входные данные для двух временных рядов
input_1 = keras.Input(shape=(None, 1)) # Вход 1 (переменная длина, 1 признак)
input_2 = keras.Input(shape=(None, 1)) # Вход 2
# Общий LSTM слой
shared_lstm = layers.LSTM(n_lstm_blocks)
# Кодирования для обоих входов
encode_1 = shared_lstm(input_1)
encode_2 = shared_lstm(input_2)
# Конкатенация закодированных векторов
concat = layers.concatenate([encode_1, encode_2])
# Полносвязный слой для классификации
output = layers.Dense(1, activation='sigmoid')(concat)
# Создание модели
model = keras.Model(inputs=[input_1, input_2], outputs=output)
# Компиляция модели
model.compile(optimizer="adam", loss="binary_crossentropy")
Объяснение кода
-
Входные данные: Модель принимает два входа, каждый из которых имеет переменную длину и фиксированное количество признаков (в данном случае, 1).
-
Общий LSTM: Этот слой обрабатывает оба временных ряда. Поскольку слои имеют общие веса, это позволяет модели поддерживать инвариантность и обобщение в различных временных аспектах входных данных.
-
Конкатенация: После получения представлений для обоих временных рядов, они конкатенируются (объединяются) для последующей обработки.
-
Полносвязный слой: На выходе мы получаем предсказание, где 1 означает, что временные ряды принадлежат одной категории, а 0 — что они отличаются.
Заключение
Использование общих слоев, таких как LSTM, для сравнения временных рядов с переменной длиной является мощным решением для задачи бинарной классификации. Благодаря разработанному коду вы можете начать экспериментировать с настройками модели и данными, что может привести к получению высококачественных результатов.
Обращайтесь с вопросами или уточнениями, если потребуется более глубокий анализ или помощь в ваших проектах!