Blog
Proyecto: Clasificación Multiclase de Especies de flores
- Publicado por: Rafael Fernandez
- Categoría: Deep Learning
-En este tutorial descubrirá cómo puede utilizar Keras para desarrollar y evaluar los modelos neuronales para problemas de clasificación multiclase.
-Cómo cargar datos desde CSV y ponerlos a disposición de Keras.
-Cómo preparar datos de clasificaciones multiclase para modelar con redes neuronales.
-Cómo evaluar los modelos de redes neuronales de Keras con scikit-learn.
Conjunto de datos de clasificación de flores de iris
En este tutorial utilizaremos el problema standar de Machine Learning llamado flores de iris. Este conjunto de datos está bien estudiado y es un buen problema para practicar en redes neuronales porque todas las 4 variables de entrada son numéricas y tienen la misma escala en centímetros. Cada instancia describe las propiedades de las mediciones observadas y la variable de salida es una especie específica de iris. Los atributos para este set de datos pueden resumirse como se indica a continuación:
- Longitud del sépalo en centímetros.
- Ancho del sépalo en centímetros.
- Longitud del pétalo en centímetros.
- Ancho del pétalo en centímetros.
- Clase.
Este es un problema de clasificación multiclase, lo que significa que hay más de dos clases a predecir, de hecho hay tres especies de flores. Este es un tipo de problema importante en el que practicar con redes neuronales porque los tres valores de clase requieren conocimientos especializados de manejo. A continuación se muestra una muestra de la primera de las 150 instancias:
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
…..
El conjunto de datos de la flor del iris es un problema bien estudiado y, por lo tanto, podemos esperar lograr una precisión del modelo en el rango del 95% al 97%. Esto proporciona un buen objetivo a alcanzar en el desarrollo de nuestros modelos. El conjunto de datos se se puede descargar desde aquí o también puede descargar estos datos del iris del repositorio de ICS (http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data).
Cargar el conjunto de datos
El conjunto de datos se puede cargar directamente. Debido a que la variable de salida contiene cadenas, es más fácil cargar los datos utilizando pandas. Luego podemos dividir los atributos (columnas) en variables de entrada (X) y variables de salida (Y).
import numpy from pandas import read_csv # carga de los datos dataframe = read_csv("iris.csv", header=None) dataset = dataframe.values X = dataset[:,0:4].astype(float) Y = dataset[:,4]
Codificar la variable de salida
La variable de salida contiene tres valores de cadena diferentes. Al modelar problemas de clasificaciones multiclase usando redes neuronales, es una buena práctica reformar el atributo de salida que contiene valores para cada valor de clase al ser una matriz con un booleano para cada clase y si una instancia dada que tiene o no ese valor de clase. Esto se llama un hot encoding o crear variables ficticias a partir de una variable categórica. Por ejemplo, en este problema los tres valores de clase son Iris-setosa, Iris-versicolor e Iris-virginica.
Podemos convertir esto en una matriz binaria codificada en caliente hot encoding para cada instancia de datos que tendría el siguiente aspecto:
Iris-setosa | Iris-versicolor | Iris-virginica |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
Podemos hacer esto por primera vez codificando las cadenas consistentemente a números enteros usando la clase LabelEncoder de scikit-learn. Luego convierta el vector de enteros a una codificación en caliente usando la función Keras to_categorical().
# codificamos encoder = LabelEncoder() encoder.fit(Y) encoded_Y = encoder.transform(Y) # codificacion en caliente ( hot encoded) dummy_y = np_utils.to_categorical(encoded_Y)
Definir el Modelo de Red Neural
La biblioteca Keras proporciona clases de envoltura que permite usar modelos de redes neuronales desarrollados con Keras en scikit-learn como vimos en el post anterior. Hay una clase de keras el KerasClassifier que puede ser usada como un Estimador en scikit-learn, el tipo base de modelo en la biblioteca. El KerasClassifier toma el nombre de una función como argumento. Esta función debe devolver el modelo de red neuronal construido, listo para el entrenamiento.
A continuación se muestra una función que creará una red neural de referencia para la clasificación del problema del iris. Creamos una red simple completamente conectada con una capa oculta que contiene 8 neuronas. La capa oculta utiliza una función de activación de rectifier que es una buena práctica. Debido a que usamos una codificación en caliente para nuestro conjunto de datos de iris, la capa de salida debe crear 3 valores de salida, uno por cada clase. El valor de salida con el valor más alto se tomará como la clase pronosticada por el modelo. La topología de red de esta sencilla red neuronal de una sola capa puede resumirse de la siguiente manera como:
4 entradas –> [8 nodos ocultos] –> 3 salidas
Tenga en cuenta que utilizamos una función de activación softmax en la capa de salida. Esto es para asegurar que los valores de salida están en el rango de 0 y 1 y pueden ser usados como probabilidades pronosticadas. Finalmente, la red utiliza el algoritmo de optimización del descenso del gradiente de Adam con una función de pérdida logarítmica, que en Keras se denomina categorical_crossentropy.
# define baseline del modelo def baseline_model(): # crea el modelo model = Sequential() model.add(Dense(8, input_dim=4, activation='relu')) model.add(Dense(3, activation='softmax')) # Compila el modelo model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model
Ahora podemos crear nuestro KerasClassifier para su uso en scikit-learn. También podemos pasar argumentos en la construcción de la clase KerasClassifier que serán pasados a la función fit() usada internamente para entrenar la red neuronal. Aquí, pasamos el número de epochs como 200 y el batch_size como 5 para utilizar cuando se entrena el modelo. La depuración también se activa cuando se entrena poniendo verbose a 0.
estimator = KerasClassifier(build_fn=baseline_model, epochs=200, batch_size=5, verbose=0)
Ahora podemos evaluar el modelo de red neural en nuestros datos de entrenamiento. La biblioteca scikit-learn tiene una excelente capacidad para evaluar modelos utilizando una serie de técnicas. El estándar de oro para la evaluación de modelos de aprendizaje de máquinas es la validación cruzada k-fold. En primer lugar, podemos estudiar el procedimiento de evaluación del modelo. Aquí, establecemos el número de pliegues (fold) para que sea 10 (un valor por defecto excelente) y para pegar los datos antes de particionarlos.
results = cross_val_score(estimator, X, dummy_y, cv=kfold)
print(“Accuracy: %.2f%% (%.2f%%)” % (results.mean()*100, results.std()*100))
La lista completa de códigos se proporciona a continuación:
# Clasificacion multiclase import numpy from pandas import read_csv from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasClassifier from keras.utils import np_utils from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold from sklearn.preprocessing import LabelEncoder # semilla aleatoria seed = 7 numpy.random.seed(seed) # cargamos los datos dataframe = read_csv("iris.csv", header=None) dataset = dataframe.values X = dataset[:,0:4].astype(float) Y = dataset[:,4] # codificamos encoder = LabelEncoder() encoder.fit(Y) encoded_Y = encoder.transform(Y) # codificacion en caliente ( hot encoded) dummy_y = np_utils.to_categorical(encoded_Y) # defino el baseline del modelo def baseline_model(): # crea el modelo model = Sequential() model.add(Dense(8, input_dim=4, activation='relu')) model.add(Dense(3, activation='softmax')) # Compile el modelo model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model estimator = KerasClassifier(build_fn=baseline_model, epochs=200, batch_size=5, verbose=0) kfold = KFold(n_splits=10, shuffle=True, random_state=seed) results = cross_val_score(estimator, X, dummy_y, cv=kfold) print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
Los resultados se resumen como la desviación media y la desviación estándar de la precisión del modelo en el conjunto de datos. Esta es una estimación razonable del modelo sobre datos no vistos. También está dentro del ámbito de los mejores resultados conocidos para este problema.
Accuracy: 97.33% (4.42%)
Resumen de la Clasificación Multiclase
En esta lección usted descubrió cómo desarrollar y evaluar una red neuronal usando el Keras. Al completar este tutorial, usted aprendió:
- Cómo cargar datos y ponerlos a disposición de Keras.
- Cómo preparar datos de clasificaciones multiclase para el modelado utilizando una codificación en caliente.
- Cómo usar los modelos de redes neuronales de Keras con scikit-learn.
- Cómo crear una red neuronal utilizando Keras para la clasificación multiclase.
- Cómo evaluar un modelo de red neural Keras usando scikit-aprender con k-fold cross validación.
➡ Aprende mucho mas de Deep Learning con nuestro curso:
Luego de tener este modelo como se salva para usarlo posteriormente en predicción?
Gracias por tu comentarios Jorge. En este ejemplo no salvamos el modelo pero en este curso mas adelante hay un post donde si enseñamos a guardar el modelo para poder predecir si tener que enseñar de nuevo a la red neuronal.
Rafael muchas gracias por la respuesta.
Realmente estoy iniciando con este fascinante campo. por favor me puede ayudar con la siguiente claridad:
No tengo claro la diferencia entre fit(), evaluate() y predict().
Lo que he logrado entender es que con fit() se entrena el modelo, con evaluate() se revisa que tan preciso es el modelo y predict() se utiliza con un nuevo cjunto de datos sobre el cual se quiere predecir con el modelo entrenado. Esto es asï?
Gracias
Jorge lo has entendido perfectamente! con fit() se entrena el modelo, con evaluate() se revisa que tan preciso es el modelo y predict() se utiliza para predecir con el modelo entrenado.
Rafael cordial saludo. He revisado atentamente los temas de clasificación binaria y clasificación multiclase, en particular con este modelo de Clasificación de flores de iris, he intentado predecir con otro conjunto de datos utilizando la instrucción
y_pred = cross_val_predict(X), pero el programa me arroja un error.
Me podría ayudar indicándome con que instrucciones (código) se puede realizar la predicción en estos modelos multiclase. y como se presentan los resultados teniendo en cuenta que se ha utilizado codificación en caliente para las variables categóricas.
Gracias por su atención.