Каков наилучший подход к нормализации данных для модели LSTM (с использованием Tensorflow) с таким широким диапазоном значений? - PullRequest
0 голосов
/ 26 января 2020

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

Я создаю модель Tensorflow JS со слоями LSTM для прогнозирования временных рядов (RNN).

Используемый набор данных проверяется каждые несколько сотен миллисекунд (через случайные интервалы). Однако полученные данные могут иметь очень широкие диапазоны, например, большинство полученных данных будет иметь значение 20, 40, 45 и т. Д. c. Однако иногда это значение достигает 75 000 в крайнем конце.

Таким образом, диапазон данных составляет от 1 до 75 000.

Когда я нормализую эти данные, используя стандартный метод min / max для получения значения в диапазоне от 0 до 1, нормализованные данные для большинства запросов данных будут иметь много маленьких значащих десятичных разрядов. например: '0,0038939328722009236'

Итак, мой вопрос (ы):

1) Является ли этот минимум / максимум лучшим подходом для нормализации данных этого типа?

2) Будет ли модель RNN хорошо работать с таким количеством значащих десятичных разрядов и точностью?

3) Должен ли я также нормализовать метку вывода? (из которых будет 1 выходной)

Обновление

Я только что обнаружил очень хороший ресурс по быстрому курсу Google, посвященный подготовке данных для ML. Один из предложенных методов заключается в том, чтобы «обрезать» данные в крайних случаях. Думаю, я бы добавил это сюда для справки: https://developers.google.com/machine-learning/data-prep

1 Ответ

0 голосов
/ 27 января 2020

Проведя немного больше исследований, я думаю, что теперь у меня есть приличное решение;

Я буду выполнять два шага, первый из которых будет использовать 'квантильное группирование' (или иногда называемое 'binning' ref: https://developers.google.com/machine-learning/data-prep/transform/bucketing).

Эффективно включает в себя разбиение диапазона значений на более мелкие подмножества и применение целочисленного значения к каждому меньшему диапазону значений. Например, начальный диапазон от 1 до 1 000 000 может быть разбит на диапазоны 100 КБ. Таким образом, от 1 до 100 000 будет диапазоном № 1, от 100 001 до 200 000 будет диапазоном № 2.

Чтобы обеспечить равномерное распределение выборок в пределах каждого диапазона сегментов, из-за искаженного набора данных, который я имею, я изменяю диапазоны подмножеств, чтобы они захватывали примерно одинаковые выборки в каждом диапазоне «сегмента». Например, первый диапазон приведенного выше примера может составлять от 1 до 1000 вместо 1 до 100 000. Следующий диапазон ковша будет от 1 001 до 2 000. Третий может быть от 2 001 до 10 000 и т. Д.

В моем случае я получил 22 различных диапазона сегментов. Следующим шагом является моя собственная адаптация, так как я не хочу иметь 22 различных функции (как кажется, предлагается в ссылке). Вместо этого я применяю стандартное минимальное / максимальное масштабирование к этим диапазонам сегментов, в результате чего требуется только одна функция. Это дает мне окончательный результат нормализованных данных между 0 и 1, который идеально соответствует моему искаженному набору данных.

Теперь самое низкое нормализованное значение, которое я получаю (кроме 0), равно 0,05556.

Надеюсь это помогает другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...