Я хочу использовать Keras LSTM (или аналогичный) для прогнозирования энергопотребления предприятий на основе:
- исторических данных о потреблении
- некоторых числовых характеристик (например, общее годовое потребление)
- некоторые категориальные особенности (например, бизнес-тип)
Это проблема холодного запуска, потому что, хотя 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)
Заранее большое спасибо.