Rneuronales2.ipynb - Colaboratory
Rneuronales2.ipynb - Colaboratory
ipynb - Colaboratory
Integrantes
Allccahuaman Quichua, Paul
# cargamos las librerias a utilizar
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
plt.rcParams['figure.figsize'] = (16, 9)
plt.style.use('fast')
from keras.models import Sequential
from keras.layers import Dense,Activation,Flatten
from sklearn.preprocessing import MinMaxScaler
#cargar data
df = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vTQSnzVBCPj-s0wRGIJrkO-cwY4
df.head()
activo_cod ciclos s1 s2 s3 s4 s5 s6 s7 s8
avion2 = df[df['activo_cod'] == 2]
avion2
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 1/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
activo_cod ciclos s1 s2 s3 s4 s5 s6 s7 s8
... ... ... ... ... ... ... ... ... ... ...
474 2 283 518.67 643.78 1602.03 1429.67 14.62 21.61 551.46 2388.16 90
475 2 284 518.67 643.91 1601.35 1430.04 14.62 21.61 551.96 2388.22 90
476 2 285 518.67 643.67 1596.84 1431.17 14.62 21.61 550.85 2388.20 90
477 2 286 518.67 643.44 1603.63 1429.57 14.62 21.61 551.61 2388.18 9
avion2 = avion2.loc[:, ['ciclos','s2']]
avion2478 2 287 518.67 643.85 1608.50 1430.84 14.62 21.61 551.66 2388.20 9
192 1 641.89
193 2 641.82
194 3 641.55
195 4 641.68
196 5 641.73
avion2.set_index('ciclos', inplace=True)
avion2
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 2/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
s2
ciclos
1 641.89
2 641.82
3 641.55
4 641.68
5 641.73
... ...
283 643.78
284 643.91
285 643.67
286 643.44
287 643.85
s2 float64
dtype: object
avion2.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f8216a0e2d0>
## iniciamos la NN
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 3/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
## PASOS es la cantidad de predictores DE x1 hasta x12
PASOS = 12
# convert series to supervised learning
def series_to_supervised(data, n_in = 1, n_out=1, dropnan=True):
n_vars = 1 if type(data) is list else data.shape[1]
avion1 = pd.DataFrame(data)
cols, names = list(), list()
# input sequence (t-n, ... t-1)
for i in range(n_in, 0, -1):
cols.append(avion1.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(avion1.shift(-i))
if i == 0:
names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
else:
names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
# put it all together
agg = pd.concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
return agg
# load dataset
values = avion2.values
# ensure all data is float
values = values.astype('float32')
# normalize features
scaler = MinMaxScaler(feature_range=(-1, 1))
values=values.reshape(-1, 1) # esto lo hacemos porque tenemos 1 sola dimension
scaled = scaler.fit_transform(values)
# frame as supervised learning
reframed = series_to_supervised(scaled, PASOS, 1)
reframed.head()
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 4/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
# split into train and test sets
values = reframed.values
n_train_days = 287 - (80 + PASOS) # considera 30 dias test
train = values[:n_train_days, :]
test = values[n_train_days:, :]
# split into input and outputs
x_train, y_train = train[:, :-1], train[:, -1]
x_val, y_val = test[:, :-1], test[:, -1]
# reshape input to be 3D [samples, timesteps, features]
x_train = x_train.reshape((x_train.shape[0], 1, x_train.shape[1]))
x_val = x_val.reshape((x_val.shape[0], 1, x_val.shape[1]))
print(x_train.shape, y_train.shape, x_val.shape, y_val.shape)
def crear_modeloFF():
model = Sequential()
model.add(Dense(PASOS, input_shape=(1,PASOS), activation='tanh'))
model.add(Flatten())
model.add(Dense(1, activation='tanh'))
model.compile(loss='mean_absolute_error',optimizer='Adam',metrics=["mse"])
model.summary()
return model
EPOCHS = 100
model = crear_modeloFF()
history = model.fit(x_train,y_train,epochs=EPOCHS,validation_data=(x_val,y_val),batch_size =
17/17 [==============================] - 0s 2ms/step - loss: 0.1937 - mse: 0.0592 -
Epoch 73/100
# VOY A ESTIMAR CON LOS VALORES DE TESTING
results = model.predict(x_val)
plt.figure(figsize=(15,12))
plt.plot(range(len(y_val)),y_val,c='g',label='real')
plt.plot(range(len(results)),results,c='r',label='modelo',ls ='--')
plt.title('validate')
plt.legend(loc='best')
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 6/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
<matplotlib.legend.Legend at 0x7f820c3e6950>
len(y_val)
80
ultimos_periodos= avion2[263:287]
ultimos_periodos
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 7/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
s2
ciclos
264 643.47
265 643.03
266 643.14
267 642.96
268 643.10
269 643.11
270 643.12
271 643.87
272 643.27
273 643.71
274 643.18
275 643.67
276 643.82
277 643.91
278 643.44
279 643.64
280 643.63
281 643.60
282 643.94
283 643.78
284 643.91
285 643.67
ultimos_periodos.shape
286 643.44
(24, 1)
287 643.85
# elimino la columna 12 porque deseo predecirla
values = ultimos_periodos.values
values = values.astype('float32')
# normalize features
values=values.reshape(-1, 1) # esto lo hacemos porque tenemos 1 sola dimension
scaled = values
reframed = series_to_supervised(scaled, PASOS, 1)
reframed.drop(reframed.columns[[12]], axis=1, inplace=True) # elimino la columna 'y pred' po
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 8/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
reframed.drop(reframed.columns[[12]], axis 1, inplace True) # elimino la columna y_pred po
reframed # modificar acorde al numero de predictores
# escalando los valores
values = ultimos_periodos.values
values = values.astype('float32')
# normalize features
values=values.reshape(-1, 1) # esto lo hacemos porque tenemos 1 sola dimension
scaled = scaler.fit_transform(values)
reframed = series_to_supervised(scaled, PASOS, 1)
reframed.drop(reframed.columns[[12]], axis=1, inplace=True)
reframed.head() # modificar acorde al numero de predictores
len(reframed)
12
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 9/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
# X_test es la última fila de reframed
# x_test servirá para hacer las predicciones a futuro
values = reframed.values
x_test = values[-1:,:]
x_test = x_test.reshape((x_test.shape[0], 1, x_test.shape[1]))
x_test
dtype=float32)
# con esto lleno la diagonal de la matriz para seguir calculando los días de pronostico
periodos = 12
def agregarNuevoValor(x_test,nuevoValor):
for i in range(x_test.shape[2]-1):
x_test[0][0][i] = x_test[0][0][i+1]
x_test[0][0][x_test.shape[2]-1] = nuevoValor
return x_test
results=[]
for i in range(periodos):
parcial=model.predict(x_test)
results.append(parcial[0])
print(x_test)
x_test=agregarNuevoValor(x_test,parcial[0])
0.4489746 -0.02038574]]]
-0.02038574 0.29713687]]]
0.1957471 0.36165273]]]
0.36165273 0.29956776]]]
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 10/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
0.29956776 0.33490598]]]
0.3661718 0.36071187]]]
len(results)
12
# invierto los valores pronosticados para que se entienda original valores escalados
adimen = [x for x in results]
inverted = scaler.inverse_transform(adimen)
inverted
array([[643.59557807],
[643.6509359 ],
[643.6148587 ],
[643.54589808],
[643.62719021],
[643.59676918],
[643.61408456],
[643.63689866],
[643.62940451],
[643.6267292 ],
[643.61609 ],
[643.56431157]])
len(inverted)
12
y_pred=pd.DataFrame(inverted,columns=['Forecast'],index = [288,289,290,291,292,293,294,295,29
len(y_pred)
12
y_pred.tail()
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 11/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
Forecast
295 643.636899
296 643.629405
297 643.626729
298 643.616090
299 643.564312
df2=pd.concat([avion2,y_pred])
df2
s2 Forecast
1 641.89 NaN
2 641.82 NaN
3 641.55 NaN
4 641.68 NaN
5 641.73 NaN
df2=pd.concat([avion2,y_pred])
df2.plot(figsize=(12,8))
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 12/13
21/6/2021 Rneuronales2.ipynb - Colaboratory
<matplotlib.axes._subplots.AxesSubplot at 0x7f820c737c50>
https://colab.research.google.com/drive/1uU3cU4iZMcLl7zixo82Kx5VaWLRJKqeD#scrollTo=kUlEklb2ZXO6&printMode=true 13/13