Прогнозируемые данные с помощью Lstm - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в этой области и RNN-LSTM.

Описание проблемы:

1-) У меня есть файл CSV с 2 столбцами: («Общее потребление (кВтч)», «Спрос (кВт)»)

2-) Я пытаюсь дать 2 входа для LSTM.

3-) Общее потребление является основным входом. Требование является вторичным входом.

4-) Суть этой работы - прогнозируемое общее потребление. Когда я запускаю эти коды с 1 столбцом, я получаю хорошие результаты и график прогноза.

Но теперь я даю 2 входа в lstm, как я уже говорил, вы можете видеть коды и параметры вниз. Я не могу принять никакого прогноза.

У меня есть 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()
...