2017-10-24 35 views
0

時系列を予測するためにkeras LSTMを作成しようとしています。私のx_trainは3000,15,10(例、タイムステップ、フィーチャー)、y_train(3000,15,1)のような形をしていて、多対多のモデル(シーケンスごとに10個の入力フィーチャを1出力/シーケンスにする)を構築しようとしています。ケラス - 予期しない予測結果

私が使用しているコードは、このです:

model = Sequential() 

model.add(LSTM(
    10, 
    input_shape=(15, 10), 
    return_sequences=True)) 
model.add(Dropout(0.2)) 
model.add(LSTM(
    100, 
    return_sequences=True)) 
model.add(Dropout(0.2)) 
model.add(Dense(1, activation='linear')) 
model.compile(loss="mse", optimizer="rmsprop") 
model.fit(
     x_train, y_train, 
     batch_size=1, nb_epoch=1, validation_split=0.05) 
predicted = model.predict(x_test) 

私のデータは次のようになります。

x_train = [ 
    [ 
     [3,4,3,1.5,0,7....], # 10 Features 
     [2,4,1,1,4,3....], 
     .... # 15 Timesteps 
    ], 
    .... # 3000 Examples 
] 
y_train = [ 
    [ 
     [0], 
     [5], 
     .... 
    ], 
    ..... 
] 

コードをコンパイルし、エラーなしで収まるが、予測値は現実的ではありません。

期待値は0〜15の整数です。しかし予測は-0.03と1の間の浮動小数点数です。また、予測には15のタイムステップがありますが、実際には16番目のタイムステップ(将来の予測結果)に興味があります。

例の予測:

predicted = [ 
    [ 
     [0.035478], 
     [0.046423], 
     [0.948723], 
     .... 
    ], 
    .... 
] 

マイkerasバージョンは2.0.6で、pythonはバージョン3.4.5です。

ご協力いただきありがとうございます。あなたはおそらくy_trainを想定すると、0と1の間であるためにあなたのy_trainを再スケールと予測しなければならない

答えて

1

はnumpyの配列です:作業が完了したときに

y_train = y_train/15.0 

次に、あなたの予測を再スケールすることができます。

predicted = (predicted*15).astype(int) 
+0

[OK]をおかげでたくさん、私はこれをしようとします。 16番目の予測を取得する方法はありますか? – sbz

+0

x_testについて予測しているので、x_testに16番目のタイムステップがあることを確認してください。 – Mark

+0

ありがとうございました、私は0と1の間になるようにデータを拡大しました。そして今、すべての結果がより現実的に見えるようになります。私はそれも終わったと思って、私はちょうど15のタイムステップに固執しますが、最後の入力タイムステップを切り捨て、最初に空のタイムスタンプを挿入することで入力と結果をシフトします。したがって、すべてのx値は次のy値に対応します。しかし、私はほとんどすべての結果に対して同じ数(〜0.018)を受け取っているため、結果はまだ正しくありません。あなたはそれが何であるか知っていますか? – sbz

0

私は多くのモデルに多くを構築しようとしている(シーケンスあたり10の入力機能は、1出力/シーケンスを作ります)。

あなたは多対1モデルを構築したいと思えます。このため(シーケンスにつき1つの出力のための10個の入力機能)

以下を行う必要があります。形状(3000,1)とy_train

  1. ビルド。 y_trainは将来の予測、t + 1時間の予測になります。より多くのタイムステップを予測したい場合は、y_trainと最後の密なレイヤーを調整します。
  2. ニューラルネットワークがスケールデータを必要とするため、まだトレーニングデータをスケールしていない場合は、スケーリングデータを調整します。
  3. このようなあなたの最後のLSTM層からreturn_sequencesを削除します。

コード

model = Sequential() 
model.add(LSTM(10, input_shape=(15, 10), return_sequences=True)) 
model.add(Dropout(0.2)) 
model.add(LSTM(100, return_sequences=False)) 
model.add(Dropout(0.2)) 
model.add(Dense(1, activation='linear')) 
+0

入力してくれてありがとうございましたが、実際にはそれを考えていました。基本的に、私のすべてのタイムステップのすべての次の結果を予測する必要があります。 'return_sequence'を変更する理由は何ですか? – sbz