Хобрук: Ваш путь к мастерству в программировании

Как включить непрерывные и категориальные предикторы в Keras LSTM?

Я хочу использовать Keras LSTM (или аналогичный) для прогнозирования энергопотребления предприятий на основе:

  1. исторические данные о потреблении
  2. некоторые числовые характеристики (например, общее годовое потребление)
  3. некоторые категориальные характеристики (например, тип бизнеса)

Это проблема холодного старта, потому что, хотя 2. и 3. присутствуют как для обучающего, так и для тестового набора, 1. нет, т. е. я пытаюсь предсказать потребление новых предприятий, для которых нет исторических данных.

Мой вопрос: как структурировать фрейм данных и RNN, чтобы разместить как 2. (числовые признаки), так и 3. (категориальные данные) в качестве моих предикторов?

Вот вымышленный пример данных:

# generate x (predictors dataframe)
import pandas as pd
x = pd.DataFrame({'ID':[0,1,2,3],'business_type':[0,2,2,1], 'contract_type':[0,0,2,1], 'yearly_consumption':[1000,200,300,900], 'n_sites':[9,1,2,5]})
print(x)

# note: the first 2 are categorical and the second 2 are numerical

   ID  business_type  contract_type  yearly_consumption  n_sites
0   0              0              0                1000        9
1   1              2              0                 200        1
2   2              2              2                 300        2
3   3              1              1                 900        5

# generate y (timeseries data)

import numpy as np
time_series = []
data_length = 6
period = 1
for k in range(4):
    level = 10 * np.random.rand()
    seas_amplitude = (0.1 + 0.3*np.random.rand()) * level
    sig = 0.05 * level # noise parameter (constant in time)
    time_ticks = np.array(range(data_length))
    source = level + seas_amplitude*np.sin(time_ticks*(2*np.pi)/period)
    noise = sig*np.random.randn(data_length)
    data = source + noise
    index = pd.DatetimeIndex(start=t0, freq=freq, periods=data_length)
    time_series.append(pd.Series(data=data, index=['t0','t1','t2','t3','t4','t5']))
y = pd.DataFrame(time_series)
print(y)

         t0        t1        t2        t3        t4        t5
0  9.611984  8.453227  8.153665  8.801166  8.208920  8.399184
1  2.139507  2.118636  2.160479  2.216049  1.943978  2.008407
2  0.131757  0.133401  0.135168  0.141212  0.136568  0.123730
3  5.990021  6.219840  6.637837  6.745850  6.648507  5.968953

# note: the real data has thousands of data points (one year with half hourly frequency)
# note: the first row belongs to ID = 0 in x, the second row to ID = 1 etc.

Я много искал в Интернете, и, кажется, нет примера, в котором использовались бы как категориальные, так и числовые данные и данные временных рядов. Для простой задачи прогнозирования используйте этот сообщение объясняет, что для извлечения уроков из предыдущего периода времени LSTM необходимо передать примерно так:

# process df for a classical forecasting problem for first ID
y_lstm = pd.DataFrame(y.iloc[0,:])
y_lstm.columns = ['t']
y_lstm['t-1'] = y_lstm['t'].shift()
print(y_lstm)

           t       t-1
t0  9.611984       NaN
t1  8.453227  9.611984
t2  8.153665  8.453227
t3  8.801166  8.153665
t4  8.208920  8.801166
t5  8.399184  8.208920

# note: t-1 represents the previous time point

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

Может ли кто-нибудь предоставить мне пример кода о том, как правильно структурировать данные для RNN и/или как будет выглядеть простая структура LSTM с Keras? Обратите внимание, что эта структура должна иметь возможность использовать данные временных рядов для обучения, но не для прогнозов (т. е. для тестового набора доступны только x, а не y).

Заранее большое спасибо.


  • Удалось ли вам найти решение? Поделись, пожалуйста. Спасибо 26.07.2020

Новые материалы

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..