Kgptalkie Com Multi Step Time Series Predicting Using RNN LSTM
Kgptalkie Com Multi Step Time Series Predicting Using RNN LSTM
Given the rise of smart electricity meters and the wide adoption of electricity generation technology
like solar panels, there is a wealth of electricity usage data available.
Problem Statement :
Given that power consumption data for the previous week, we have to predict the power
consumption for the next week.
Download dataset:
https://archive.ics.uci.edu/ml/machine-learning-
databases/00235/household_power_consumption.zip
Details:
https://archive.ics.uci.edu/ml/datasets/individual+household+electric+power+consumption
Dataset Description:
The data was collected between December 2006 and November 2010 and observations of power
consumption within the household were collected every minute.
It is a multivariate series comprised of seven variables
global_active_power: The total active power consumed by the household (kilowatts).
global_reactive_power: The total reactive power consumed by the household (kilowatts).
voltage: Average voltage (volts).
global_intensity: Average current intensity (amps).
sub_metering_1: Active energy for kitchen (watt-hours of active energy).
sub_metering_2: Active energy for laundry (watt-hours of active energy).
sub_metering_3: Active energy for climate control systems (watt-hours of active energy).
This data represents a multivariate time series of power-related variables that in turn could be used
to model and even forecast future electricity consumption
Time-series predictions play a major role in machine learning which is often neglected.
Nonetheless, there are lots of machine learning algorithms we could use for these problems. The
major machine learning algorithms involving Statsmodels and Econometric models etc. Today we
will take a look at how to use and apply Deep learning algorithms to predict the time series Data
For this Time series forecasting we will use Long- Short Term Memory unit
(LSTM).
Long Short Term Memory unit(LSTM) was typically created to overcome the limitations of a
Recurrent neural network (RNN). The Typical long data sets of Time series can actually be a time-
consuming process which could typically slow down the training time of RNN architecture. We
could restrict the data volume but this a loss of information. And in any time-series data sets, there
is a need to know the previous trends and the seasonality of data of the overall data set to make
the right predictions.
Before going into the brief explanation of LSTM cell, Let us see how the LSTM cell looks like :
The Architecture may look little complicated on the 몭rst glance, but it is pretty neat and clear and
easily understandable if we break it into parts.
Lets 몭rst start understanding what are our inputs and outputs. The typical input if you see on the
left-hand side of the diagram Ct‐1 which is the previous cell state and ht‐1 which is the output
from the previous cell and Xt which is the input of the present cell.
The output of the cell is Ct and ht which are the corresponding cell state and output of the present
cell. The 몭rst step of an LSTM is the forget gate layer (f) where we determine what are we going
to forget from the previous cell state. This typically takes the input ht‐1 and Xt and make a linear
transformation with some weights and bias terms and pass into the sigmoid function. As we are
aware the output of a sigmoid function is always between 0 and 1. Here 0 will be considered as
to forget it and 1 will represent to keep it
The second step is a two-part process and this is the step which tells us actually processing within
this layer. Here in the 몭rst part we take the same inputs as before the ht‐1 and Xt and make a
linear transformation with some weights and biases and pass on to a sigmoid function . And the
second part we will make a linear transformation again between ht‐1 and Xt with some weights
and biases but this time its going to be a hyperbolic tangent function (tanh). At the end of this
step, we will get vectors of values which can be new candidate values for this present cell.
The third step is the update step which helps us in deriving the new cell state Ct using our
previous steps. First, we will multiply the previous cell state with the forget gate layer and add the
vectors we got from the second step which forms the new cell state Ct of the present cell at t .
The 몭nal step is another main output of the cell, for this, we will directly form a linear
transformation with the previous output ht‐1 and input of the present cell Xt with some bias and
weight terms and pass on to a sigmoid layer. Finally, now we will multiply this output to the new cell
state Ct which is passed on to a hyperbolic tangent function. This gives us the present output ht .
Now we have a clear understanding of the step by step dissection of the LSTM
layer. Let's see how we apply our LSTM cell into a time series data.
Importing Libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from numpy import nan
data.head()
data.set_index(['date_time'], inplace=True)
data.head()
date_time
16/12/2006
4.216 0.418 234.840 18.400
17:24:00
16/12/2006
5.360 0.436 233.630 23.000
17:25:00
16/12/2006
5.374 0.498 233.290 23.000
17:26:00
16/12/2006
5.388 0.502 233.740 23.000
17:27:00
16/12/2006
3.666 0.528 235.680 15.800
17:28:00
Next, we can mark all missing values indicated with a ‘?‘ character with a NaN value, which is a
몭oat.
#This will allow us to work with the data as one array of floating point values rather than m
ixed types (less efficient.)
data = data.astype('float')
data.info()
<class 'pandas.core.frame.DataFrame'>
Index: 2075259 entries, 16/12/2006 17:24:00 to 26/11/2010 21:02:00
Data columns (total 7 columns):
Global_active_power float64
Global_reactive_power float64
Voltage float64
Global_intensity float64
Sub_metering_1 float64
Sub_metering_2 float64
Sub_metering_3 float64
dtypes: float64(7)
memory usage: 126.7+ MB
np.isnan(data).sum()
Global_active_power 25979
Global_reactive_power 25979
Voltage 25979
Global_intensity 25979
Sub_metering_1 25979
Sub_metering_2 25979
Sub_metering_3 25979
dtype: int64
We also need to 몭ll in the missing values now that they have been marked.
A very simple approach would be to copy the observation from the same time the day before. We
can implement this in a function named 몭ll_missing() that will take the NumPy array of the data
and copy values from exactly 24 hours ago.
def fill_missing(data):
one_day = 24*60
for row in range(data.shape[0]):
for col in range(data.shape[1]):
if np.isnan(data[row, col]):
data[row, col] = data[row‐one_day, col]
fill_missing(data.values)
np.isnan(data).sum()
Global_active_power 0
Global_reactive_power 0
Voltage 0
Global_intensity 0
Sub_metering_1 0
Sub_metering_2 0
Sub_metering_3 0
dtype: int64
data.info()
<class 'pandas.core.frame.DataFrame'>
Index: 2075259 entries, 16/12/2006 17:24:00 to 26/11/2010 21:02:00
Data columns (total 7 columns):
Global_active_power float64
Global_reactive_power float64
Voltage float64
Global_intensity float64
Sub_metering_1 float64
Sub_metering_2 float64
Sub_metering_3 float64
dtypes: float64(7)
memory usage: 126.7+ MB
data.shape
(2075259, 7)
Here, we can observe that we have 2075259 datapoints and 7 features
data.head()
date_time
16/12/2006
4.216 0.418 234.84 18.4
17:24:00
16/12/2006
5.360 0.436 233.63 23.0
17:25:00
16/12/2006
5.374 0.498 233.29 23.0
17:26:00
16/12/2006
5.388 0.502 233.74 23.0
17:27:00
16/12/2006
3.666 0.528 235.68 15.8
17:28:00
data.to_csv('cleaned_data.csv')
dataset.head()
Global_active_power Global_reactive_power Voltage Global_intensi
date_time
2006‐12‐16
4.216 0.418 234.84 18.4
17:24:00
2006‐12‐16
5.360 0.436 233.63 23.0
17:25:00
2006‐12‐16
5.374 0.498 233.29 23.0
17:26:00
2006‐12‐16
5.388 0.502 233.74 23.0
17:27:00
2006‐12‐16
3.666 0.528 235.68 15.8
17:28:00
dataset.tail()
date_time
2010‐11‐26
0.946 0.0 240.43 4.0
20:58:00
2010‐11‐26
0.944 0.0 240.00 4.0
20:59:00
2010‐11‐26
0.938 0.0 239.82 3.8
21:00:00
2010‐11‐26
0.934 0.0 239.70 3.8
21:01:00
2010‐11‐26
0.932 0.0 239.55 3.8
21:02:00
data = dataset.resample('D').sum()
#data after sampling it into daywise manner
data.head()
date_time
fig, ax = plt.subplots(figsize=(18,18))
for i in range(len(data.columns)):
plt.subplot(len(data.columns), 1, i+1)
name = data.columns[i]
plt.plot(data[name])
plt.title(name, y=0, loc = 'right')
plt.yticks([])
plt.show()
fig.tight_layout()
Exploring Active power consumption for each year
fig, ax = plt.subplots(figsize=(18,18))
for i in range(len(years)):
plt.subplot(len(years), 1, i+1)
year = years[i]
active_power_data = data[str(year)]
plt.plot(active_power_data['Global_active_power'])
plt.title(str(year), y = 0, loc = 'left')
plt.show()
fig.tight_layout()
#for year 2006
data['2006']
date_time
date_time
fig, ax = plt.subplots(figsize=(18,18))
for i in range(len(years)):
plt.subplot(len(years), 1, i+1)
year = years[i]
active_power_data = data[str(year)]
active_power_data['Global_active_power'].hist(bins = 200)
plt.title(str(year), y = 0, loc = 'left')
plt.show()
fig.tight_layout()
Histogram plot for All Features
fig, ax = plt.subplots(figsize=(18,18))
for i in range(len(data.columns)):
plt.subplot(len(data.columns), 1, i+1)
name = data.columns[i]
data[name].hist(bins=200)
plt.title(name, y=0, loc = 'right')
plt.yticks([])
plt.show()
fig.tight_layout()
Plot power consumption hist for each month of 2007
fig, ax = plt.subplots(figsize=(18,18))
for i in range(len(months)):
ax = plt.subplot(len(months), 1, i+1)
month = '2007‐' + str(months[i])
active_power_data = dataset[month]
active_power_data['Global_active_power'].hist(bins = 100)
ax.set_xlim(0,5)
plt.title(month, y = 0, loc = 'right')
plt.show()
fig.tight_layout()
Observation :
1. From the above diagram we can say that power consumption in the month of
Nov, Dec, Jan, Feb, Mar is more as there is a long tail as compare to other months.
2. It also shows that the during the winter seasons, the heating systems are used
and not in summer.
Modeling Methods
There are many modeling methods and few of those are as follows
Naive Methods -> Naive methods would include methods that make very simple, but often
very effective assumptions.
Classical Linear Methods -> Classical linear methods include techniques are very effective for
univariate time series forecasting
Machine Learning Methods -> Machine learning methods require that the problem be framed
as a supervised learning problem.
K-nearest neighbors.
SVM
Decision trees
Random forest
Gradient boosting machines
Deep Learning Methods -> combinations of CNN LSTM and ConvLSTM, have proven
effective on time series classi몭cation tasks
CNN
LSTM
CNN - LSTM
Problem Framing:
Given recent power consumption, what is the expected power consumption
for the week ahead?
This requires that a predictive model forecast the total active power for each day over the next
seven days
A model of this type could be helpful within the household in planning expenditures. It could also
be helpful on the supply side for planning electricity demand for a speci몭c household.
#top rows
data.head()
date_time
data.tail()
Global_active_power Global_reactive_power Voltage Global_intensi
date_time
date_time
2006‐12‐16 1209.176
2006‐12‐17 3390.460
2006‐12‐18 2203.826
2006‐12‐19 1666.194
2006‐12‐20 2225.748
Freq: D, Name: Global_active_power, dtype: float64
data_test = data['2010']['Global_active_power']
data_test.head()
date_time
2010‐01‐01 1224.252
2010‐01‐02 1693.778
2010‐01‐03 1298.728
2010‐01‐04 1687.440
2010‐01‐05 1320.158
Freq: D, Name: Global_active_power, dtype: float64
data_train.shape
(1112,)
data_test.shape
(345,)
Observation :
1. We have 1112 datapoints in train dataset and 345 datapoints in test dataset
#training data
data_train.head(14)
date_time
2006‐12‐16 1209.176
2006‐12‐17 3390.460
2006‐12‐18 2203.826
2006‐12‐19 1666.194
2006‐12‐20 2225.748
2006‐12‐21 1723.288
2006‐12‐22 2341.338
2006‐12‐23 4773.386
2006‐12‐24 2550.012
2006‐12‐25 2743.120
2006‐12‐26 3934.110
2006‐12‐27 1528.760
2006‐12‐28 2072.638
2006‐12‐29 3174.392
Freq: D, Name: Global_active_power, dtype: float64
data_train = np.array(data_train)
X_train.shape, y_train.shape
pd.DataFrame(y_train).head()
0 1 2 3 4 5 6
x_scaler = MinMaxScaler()
X_train = x_scaler.fit_transform(X_train)
y_scaler = MinMaxScaler()
y_train = y_scaler.fit_transform(y_train)
pd.DataFrame(X_train).head()
0 1 2 3 4 5 6
#converting to 3 dimension
X_train = X_train.reshape(1098, 7, 1)
X_train.shape
(1098, 7, 1)
reg = Sequential()
reg.add(LSTM(units = 200, activation = 'relu', input_shape=(7,1)))
reg.add(Dense(7))
#here we have considered loss as mean square error and optimizer as adam
reg.compile(loss='mse', optimizer='adam')
<tensorflow.python.keras.callbacks.History at 0x19ba56fc668>
Observation:
1. We have done with training and loss which we have got is 0.0232
#testing dataset
data_test = np.array(data_test)
X_test = x_scaler.transform(X_test)
y_test = y_scaler.transform(y_test)
#converting to 3 dimension
X_test = X_test.reshape(331,7,1)
X_test.shape
(331, 7, 1)
y_pred = reg.predict(X_test)
y_pred = y_scaler.inverse_transform(y_pred)
y_pred
y_true = y_scaler.inverse_transform(y_test)
y_true
evaluate_model(y_true, y_pred)
(579.2827596682928,
[598.0411885086157,
592.5770673397814,
576.1153945912635,
563.9396525162248,
576.5479538079353,
570.7699415990154,
576.2430188855649])
#standard deviation
np.std(y_true[0])
710.0253857243853
Conclusions:
1. From the above experiment, we have got root mean square error around 598 watts .
2. In order to check whether our model is performing good or bad, we need to
evaluate standard deviation which we have got here as 710 watts .
3. Here mean square error is less than standard deviation . Hence, we can say that our
model is performing good .
Tags: Deep Learning Keras lstm Multistep prediction numpy pandas Power consumption python
0 Comments
Leave a Reply
Search Articles
Search …
Python for Machine Learning: A Step-by-Step Guide
Learn to build Machine Learning and Deep Learning models using Python and its libraries like Scikit-
Learn, Keras, and TensorFlow.
Categories
Select Category
Recent Posts
Tags
aarya aarya tadvalkar api arm Batch Normalisation Classi몭cation classi몭er cnn data science
data visualization Deep Learning Embedded Feature selection imdb dataset iot
Archives
January 2023
December 2022
October 2020
September 2020
August 2020
October 2016
September 2016
Related Posts
MACHINE LEARNING
MACHINE LEARNING
Search Blogs
Search …
HOME DATA VISUALIZATION IN PYTHON ADVANCED NLP NLP IN PYTHON FOR BEGINNERS