我想使用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.
我在网上进行了广泛的浏览,似乎没有使用分类,数字和时间序列数据的示例。对于一个简单的预测问题,此post解释说,为了从上一个时间段中学习,必须向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
但是,尽管这适用于单个时间序列,但尚不清楚在存在多个时间序列时如何构造数据集,以及如何在此结构中包括其余预测变量。 post讨论了如何通过嵌入同时包含类别变量和数字变量,但是不适合我的问题,即还必须包含时间序列数据。 post在没有任何示例代码的情况下在一次性编码和嵌入之间进行了讨论,并且没有回答我的问题。
任何人都可以向我提供示例代码,说明如何为RNN适当地构造数据和/或使用Keras的简单LSTM结构如何?请注意,该结构应该能够将时间序列数据用于训练,但不能用于预测(即,测试集仅提供x而不提供y)
非常感谢您。