Separación en bloques de entrenamiento y validación

Ahora, en nuestro método .fit deberemos comprobar el valor del parámetro validation_split y, si ha recibido algún valor (si no toma el valor None), dividir nuestro dataset.

Esto, para empezar, nos obliga a reconsiderar nuestra estrategia de desordenación del dataset: estábamos desordenándolo al comienzo de cada epoch pero, si queremos reservar un bloque para validación, convendría desordenar también el dataset antes de separarlo en los dos bloques, cosa que podemos hacer con el siguiente código:

if self.shuffle:                          # Desordenación del dataset
    data = pd.concat([X, y], axis = 1)    # Unimos caract. predictivas y variable objetivo
    data = data.sample(frac = 1)          # Desordenamos el conjunto
    y = data.iloc[:, -1]                  # Volvemos a extraer las características predictivas
    X = data.iloc[:, :-1]                 # Y el resultado

A continuación, comprobamos si se desea desordenar el dataset. En caso positivo dividimos las estructuras X e y con la función train_test_split (que habremos importado previamente). Eso sí, para calcular la predicción sobre el conjunto de validación y, posteriormente, la exactitud de ésta, necesitaremos conservar el dataframe x_test y la serie y_test, por lo que almacenaremos en variables terminadas en "_transformed" el resultado de transformar en listas nuestras estructuras pandas:

if self.validation_split:
    x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = self.validation_split)
    x_train_transformed = [x.values.reshape(-1, 1) for (i, x) in x_train.iterrows()]
    y_train_transformed = [to_categorical(n, self.sizes[-1]) for n in y_train]
else:
    x_train_transformed = [x.values.reshape(-1, 1) for (i, x) in X.iterrows()]
    y_train_transformed = [to_categorical(n, self.sizes[-1]) for n in y]
training_data = [(x, y) for (x, y) in zip(x_train_transformed, y_train_transformed)]

El objetivo sigue siendo el generar una lista de tuplas con las muestras y la variable objetivo codificada.

Y volvemos a almacenar en la variable n el número de muestras del bloque de entrenamiento (necesario para la extracción de los "batches"):

n = len(training_data)