如何在Keras LSTM中包含连续的和分类的预测变量?

时间:2019-04-30 21:32:11

标签: python keras lstm forecasting

我想使用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.

我在网上进行了广泛的浏览,似乎没有使用分类,数字和时间序列数据的示例。对于一个简单的预测问题,此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)

非常感谢您。

0 个答案:

没有答案