web-dev-qa-db-ja.com

外部機能を備えた時系列マルチステップホライズンのLSTMへの入力データを構築する方法

LSTMを使用して店舗の売上予測を行おうとしています。これが私の生データがどのように見えるかです:

|     Date   | StoreID | Sales | Temperature |  Open   | StoreType |
|------------|---------|-------|-------------|---------|-----------|
| 01/01/2016 |   1     |   0   |      36     |    0    |     1     |
| 01/02/2016 |   1     | 10100 |      42     |    1    |     1     |
| ...
| 12/31/2016 |   1     | 14300 |      39     |    1    |     1     |
| 01/01/2016 |   2     | 25000 |      46     |    1    |     3     |
| 01/02/2016 |   2     | 23700 |      43     |    1    |     3     |
| ...
| 12/31/2016 |   2     | 20600 |      37     |    1    |     3     |
| ...
| 12/31/2016 |   10    | 19800 |      52     |    1    |     2     |

次の10日間の売上を予測する必要があります。この例では、2017年1月1日から2017年1月10日までの店舗の売上を予測する必要があります。他の時系列モデルまたは回帰モデルを使用してこの問題を解決する方法を知っていますが、RNN-LSTMがその候補として適しているかどうかを知りたいです。

LSTMをテストするためにstoreID = 1データのみを取得することから始めました。私のデータに日付と売上しかない場合。この方法でtrainXとtrainYを作成します(間違っている場合は修正してください)。

Window = 20
Horizon = 10

|         trainX                  |          trainY              |
| [Yt-10, Yt-11, Yt-12,...,Yt-29] | [Yt, Yt-1, Yt-2,...,Yt-9]    |
| [Yt-11, Yt-12, Yt-13,...,Yt-30] | [Yt-2, Yt-3, Yt-4,...,Yt-10] |
| [Yt-12, Yt-13, Yt-14,...,Yt-31] | [Yt-3, Yt-4, Yt-5,...,Yt-11] |
...

2つを作り直した後

trainX.shape
(300, 1, 20)
trainY.shape
(300, 10)

Question1:この場合、[サンプル、タイムステップ、機能] = [300、1、20]。これは正しいですか?または、サンプルを[300、20、1]として構築する必要がありますか?

Question2:Temperature、StoreTypeなどの生データで他の情報を使用したいのですが、LSTMの入力データをどのように作成すればよいですか?

Question3:これまでは、1つの店舗の予測についてのみ説明しました。

現在、私は ここ から例を流していますが、私が持っているシナリオをカバーするのに十分ではないようです。本当にありがとうございました!

17
Yijing Chen

私は最近、同様の問題を解決していました。あなたの場合:

  1. 入力の形状は_(300, 20, 1)_である必要があります-_20_機能を備えた長さ_1_の時系列があるためです。

  2. あなたはこのようにそれをするかもしれません:

    _sequential_input = Input(shape=(20, 1))
    feature_input = Input(shape=(feature_nb,))
    lstm_layer = LSTM(lstm_units_1st_layer, return_sequences=True)(sequential_input)
    lstm_layer = LSTM(lstm_units_2nd_layer, return_sequences=True)(lstm_layer)
    ...
    lstm_layer = LSTM(lstm_units_nth_layer, return_sequences=False)(lstm_layer)
    merged = merge([lstm_layer, feature_input], mode='concat')
    blend = Dense(blending_units_1st_layer, activation='relu')(merged)
    blend = Dense(blending_units_2nd_layer, activation='relu')(blend)
    ...
    output = Dense(10)(blend)
    _
  3. これが最も難しい部分です。 I しない複数のショップを1つの特徴ベクトルとしてネットワークにフィードすることにより、それらを予測することをお勧めします。この部分をスキップして、1つのモデルを使用してさまざまなショップを予測したり、たとえば、ある種のグラフィカルモデルまたは行が日次売上であるマトリックス上のPCA

更新:

複数の順次機能を処理するために、次のことを行うことができます。

_    sequential_input = Input(shape=(20, nb_of_sequental_features))
    feature_input = Input(shape=(feature_nb,))
    lstm_layer = LSTM(lstm_units_1st_layer, return_sequences=True)(sequential_input)
    lstm_layer = LSTM(lstm_units_2nd_layer, return_sequences=True)(lstm_layer)
    ...
    lstm_layer = LSTM(lstm_units_nth_layer, return_sequences=False)(lstm_layer)
    merged = merge([lstm_layer, feature_input], mode='concat')
    blend = Dense(blending_units_1st_layer, activation='relu')(merged)
    blend = Dense(blending_units_2nd_layer, activation='relu')(blend)
    ...
    output = Dense(10)(blend)
    model = Model(input=[sequential_input, feature_input], output=output])
_

この場合、入力は2つのテーブルのリストで構成する必要があります:_[sequential_data, features]_ where sequential_data.shape = (nb_of_examples, timesteps, sequential_features) and features.shape = (nb_of_examples, feature_nb)。そのため、salesまたはtemperatureは、featuresの_sequential_features_および_store_type_に格納する必要があります。

14
Marcin Możejko