Как включить непрерывные и категориальные предикторы в Keras LSTM? - PullRequest
0 голосов
/ 01 мая 2019

Я хочу использовать 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)

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

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