用Lstm预测数据

时间:2018-08-27 14:56:21

标签: keras lstm prediction rnn

我是该地区和rnn-lstm的新手。

问题说明:

1-)我有两列CSV文件:(“总消耗量(kWh)”,“需求量(kW)”)

2-)我正在尝试为LSTM提供2个输入。

3-)消费总额是主要输入需求是次要输入。

4-)这项工作的重点是预测的总消费量。当我用1列运行这些代码时,我会得到良好的结果和预测图。

但是,正如我之前所说的,现在我给lstm提供2个输入,您可以看到代码和参数。我无法接受任何预测。

我有2个问题:

1-)如何仅获取2个输入的总消费预测图?我想看看这些输入之间的关系。

2-)您认为这些代码还有其他问题吗?

预测图:

Predicted Graph

我取得了一些结果,我希望我正确地完成了所有工作。如果您在此模型中发现任何问题,请让我来。

    import numpy
    import matplotlib.pyplot as plt
    import pandas
    import math
    import random
    from keras.models import Sequential
    from keras.layers import Dense, LSTM, Dropout
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.metrics import mean_squared_error
    import pandas as pd
    import numpy as np
    import matplotlib.pylab as plt 
    import matplotlib.patches as mpatches
    from keras.layers.core import Dense,Activation,Dropout,Flatten,Reshape
    from keras.layers import LSTM
    from keras.models import Sequential
    from sklearn.preprocessing import MinMaxScaler



    data_orjinal = pandas.read_csv('aaa.csv', engine='python', usecols=['Consumption Total (kWh)','Demand (kW)'])


scaler = MinMaxScaler(feature_range=(0,1))
ts = scaler.fit_transform(data_orjinal)

# Toplam Veri sayımız
len(data_orjinal)


timestep=4
X=[]
Y=[]

data = ts

for i in range(len(data)-timestep):
    X.append(data[i:i+timestep])
    Y.append(data[i+timestep])

X = np.asanyarray(X)
Y = np.asanyarray(Y)

X = X.reshape((X.shape[0],X.shape[1],2))


k = int(0.7*len(Y))
Xtrain = X[:k,:,:]
Xtest = X[k:,:,:]

Ytrain = Y[:k]
Ytest = Y[k:]

print(data.shape)



model = Sequential()
model.add(LSTM(64,
               batch_input_shape=(None,timestep,2),     
               return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(32,
               return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(2))
model.compile(loss='mse', optimizer='adam')

# Eğitim işlemi kısmı
history= model.fit(Xtrain,
          Ytrain,
          batch_size=32,
          validation_data=(Xtest,Ytest),
          verbose=1,
          nb_epoch=10,
          shuffle=False)


# ileriye doğru zincirleme tahmin için Kullanacağımız fonksiyon
# Giriş vektörüne hesaplanmış tahmini sonuna ekler
# fonksiyon içindeki yorum satırlarını kaldırırsanız çalışmasını görebilirsiniz
def insert_end(Xin,new_input):
    print ('Before: \n', Xin , new_input) 
    for i in range(timestep-1):
        Xin[:,i,:] = Xin[:,i+1,:]
    Xin[:,timestep-1,:] = new_input
    print ('After :\n', Xin)
    return Xin



# Rast gele bir başlangıç noktası seçilir.# Rast g 
beg = random.randint(0,len(Ytest)-100)
forcasted_output = []
# Başlangıç giriş verisi alınır
Xin = Xtest[beg:beg+1,:,:]
for i in range(100):
    # Giriş verisi ile tahmin yaptırılır.
    out = model.predict(Xin, batch_size=1)    
    forcasted_output.append(out[0])
    # Tahmin edilen enerji değeri giriş verisinin sonuna eklenir 
    Xin = insert_end(Xin,out[0])
# Ölçeklendirilmiş verimiz tekrar enerji değerlerine çevrilir
forcasted_output = scaler.inverse_transform(forcasted_output)


# Başlangıç Noktasından veriler alınır ve sırayla tahminleri hesaplanır.
selected_input = Xtest[beg:beg+100,:,:] 
real_output = scaler.inverse_transform(Ytest[beg:beg+100])
predicted_output = model.predict(selected_input, batch_size=1)
predicted_output = scaler.inverse_transform(predicted_output)
# Sonuçlar Grafik halinde gösterilir.
print('Plotting Results')
plt.figure(figsize=(12,5))
xpos = range(len(predicted_output))
plt.plot(xpos,real_output,'r',xpos,predicted_output,'b',)
plt.legend(('Real','Predicted','Forcasted'))
plt.savefig('out.jpg',dpi=400)
plt.show()

0 个答案:

没有答案