<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Guia4 ejercicio4</span> por <a xmlns:cc="http://creativecommons.org/ns#" href="http://nbviewer.ipython.org/urls/raw.githubusercontent.com/elsuizo/Redes_neuronales_Fuzzy/master/guia1.ipynb?create=1" property="cc:attributionName" rel="cc:attributionURL">Martin Noblía</a> se distribuye bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.
La idea de este ejercicio es estudiar el fenómeno de overfitting. Supongamos que tenemos una serie de datos que vamos ajustar con una red (una capa hidden). Los datos se encuentran en el archivo datos_guia4_ej4.mat. Nuestro objetivo es determinar el número optimo de neuronas en la capa hidden.
b) Ajuste Nest redes neuronales con Nneuro neuronas en la capa hidden
c) Grafique el error absoluto promedio para los ajustes de entrenamiento {ptrain,ttrain} y para los ajustes con los datos de testeo {ptest,ttest}.
d) Explique el comportamiento de ambos errores.
In [1]:
# Imports
import neurolab as nl
import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt
from sklearn import cross_validation
# Parametros
%matplotlib inline
plt.rcParams['figure.figsize'] = 8,6 #parámetros de tamaño
In [2]:
datos = sio.loadmat('datos_guia4_ej4.mat')
t = datos['t']
p = datos['p']
t = t.reshape(47,1)
p = p.reshape(47,1)
In [3]:
X_train, X_test, y_train, y_test = cross_validation.train_test_split(p, t, test_size=0.10, random_state=0)
In [4]:
neuronas = 50
net = nl.net.newff([[0, 1]], [1, neuronas, 1])
In [5]:
net.trainf = nl.train.train_gdx
In [6]:
net.out_minmax = np.array([[0,1]])
In [7]:
e = net.train(X_train, y_train, show=100, epochs=500, goal=0.01)
In [8]:
# Simulo con el set de prueba
out = net.sim(X_test)
out.shape
Out[8]:
In [9]:
# Comparo con el set de test
plt.plot(y_test, 'ro-')
plt.plot(out, 'go-')
plt.show()
In [10]:
plt.plot(e)
Out[10]:
In [11]:
# Simulo para varios numeros de neuronas
#plt.subplots_adjust(hspace=0.000)
neuronas = np.arange(10, 300, 10)
e = np.zeros((500, len(neuronas)))
X_train, X_test, y_train, y_test = cross_validation.train_test_split(p, t, test_size=0.10, random_state=0)
for i,n in enumerate(neuronas):
# Simulamos para varios numeros de neuronas
net = nl.net.newff([[0, 1]], [1, n, 1])
net.trainf = nl.train.train_gdm
net.out_minmax = np.array([[0,1]])
e[:,i] = np.asarray(net.train(X_train, y_train, show=500, epochs=500, goal=0.001))
#e = net.train(X_train, y_train, show=500, epochs=500, goal=0.01)
out = net.sim(X_test)
# Plots
fig,ax1 = plt.subplots(1,2)
ax1[0].plot(y_test, 'ro-')
ax1[0].plot(out, 'go-')
ax1[0].set_title('Red entrenada con:%s neuronas'% n)
ax1[0].legend('y_test','salida de la red')
ax1[1].plot(e[:,i])
ax1[1].set_title('error')
In [12]:
for i,v in enumerate(neuronas):
plt.plot(v, e[:,i].mean(),'go')
plt.grid()
plt.title('Error promedio para cada numero de neuronas')
Out[12]:
In [ ]: