Я новичок в этой области и RNN-LSTM.
Описание проблемы:
1-) У меня есть файл CSV с 2 столбцами: («Общее потребление (кВтч)», «Спрос (кВт)»)
2-) Я пытаюсь дать 2 входа для LSTM.
3-) Общее потребление является основным входом. Требование является вторичным входом.
4-) Суть этой работы - прогнозируемое общее потребление. Когда я запускаю эти коды с 1 столбцом, я получаю хорошие результаты и график прогноза.
Но теперь я даю 2 входа в lstm, как я уже говорил, вы можете видеть коды и параметры вниз. Я не могу принять никакого прогноза.
У меня есть 2 вопроса:
1-) Как я могу взять только прогноз общего потребления с 2 входами? И я хочу увидеть связь между этими входами.
2-) Как вы думаете, есть ли другая проблема с этими кодами, пожалуйста, дайте мне знать.
Прогнозируемый график:
И я взял какой-то результат, надеюсь, все сделал правильно. Если у вас возникли проблемы в этой модели, пожалуйста, дайте мне.
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()