Как обеспечить целостность данных валидации в проблеме временных рядов и правильно установить базовый уровень - PullRequest
0 голосов
/ 22 марта 2019

Я работаю над проблемой временного ряда, когда у меня есть несколько, возможно, коррелированных наборов данных, где мои выборки имеют временную метку и имеют определенную ретроспективную оценку.

Моя конечная цель состоит в том, чтобы существенно изменить мои потери так, чтобы любые положительныечисло - это «край».

Я понял, что природа моей проблемы приводит меня к некоторым проблемам целостности, когда я решаю объединить / перемешать свои данные.

Модель может частично выводить выводына основе:

1) Сходство выборок (т. е. выборка на один шаг вперед будет выглядеть почти идентично текущей временной отметке, и их выходные данные также будут несколько похожи).

2) Перекрестные ссылки между наборами данных, потому что наборы данных могут быть коррелированы.То есть.предоставление модели выходных данных для конкретной временной метки позволит модели иметь информацию об одной и той же временной метке для разных наборов данных.

Из-за этих двух факторов мне нужно разделить мои данные проверки по временной метке, а также дать достаточное количество отступов.(длина просмотра), чтобы образцы не перекрывались.Это означает, например, что я возьму данные за последний месяц в качестве проверочных данных, добавлю их, отбросив предыдущие X выборок, равные длине просмотра, и затем все предыдущие выборки будут использованы для обучения.

Вот некоторый код, который создает это заполнение, а затем сортирует выборки по отметке времени

SECONDS_IN_DAY = 86400
train_timestamp_end = int(time.time() - (SECONDS_IN_DAY * (days_of_validation + lookback_len)))
val_timestamp_start = train_timestamp_end + int(lookback_len * SECONDS_IN_DAY)

def val_sort(sample, output, train_X, train_Y, validation_X, validation_Y):
    # first feature is timestamp
    timestamp = sample[0]
    if timestamp < train_timestamp_end:
        train_X.append(sample)
        train_Y.append(output)
    elif timestamp > val_timestamp_start:
        validation_X.append(sample)
        validation_Y.append(output)

Когда я использую max () на моих временных метках и min () на моих временных отметках проверки, я вижу, что мойданные действительно разделены должным образом, и они не перекрываются.

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

Это несколько отдельный вопрос ... мои данные ориентированы на ноль, я пытаюсь установить базовый уровень так, чтобы, если моя потеря была нижеИсходно, моя модель прогнозирует лучше, чем в среднем.Для моих выходных данных характер моих выходных данных центрирован по нулю, хотя на практике оказывается, что они искажены только в одном направлении.То, что я делаю сейчас, - это усреднение результатов моего поезда, и я также вычислю среднее значение моих результатов проверки.Затем я возьму потери в результате проверки и обучения и сравню их с этими исходными данными.То есть.если потеря поезда, вычтенная из базовой линии поезда, является положительной, это означает, что моя модель имеет «край».

Вот код, который вычисляет базовую линию (для выходных данных поезда и проверки отдельно)

def compute_baseline(actual):
    avg = sum(actual) / len(actual)
    averaged = []
    for x in range(len(actual)):
        averaged.append(avg)
    return tf.Session().run(K.mean(K.abs(averaged - actual)))

После вычисления базового уровня я могу сделать что-то вроде следующего, чтобы получить процентное преимущество моей модели над средним.Я не уверен, является ли% преимущество лучшим подходом, но в любом случае моя цель состоит в том, чтобы положительные метрики указывали на преимущество.

def mod_loss_hist(hist, baseline):
    mod_hist = []
    for x in range(len(hist)):
        mod_hist.append(baseline / hist[x] - 1)
    return mod_hist

Это правильный подход?Это делает то, что я хотел бы?

...