Introducci贸n a las redes neuronales con Scikit-Learn

    驴Qu茅 es una red neuronal?

    Los seres humanos tienen la capacidad de identificar patrones dentro de la informaci贸n accesible con un grado asombrosamente alto de precisi贸n. Siempre que vea un autom贸vil o una bicicleta, podr谩 reconocer inmediatamente lo que son. Esto se debe a que hemos aprendido durante un per铆odo de tiempo c贸mo se ven un autom贸vil y una bicicleta y cu谩les son sus caracter铆sticas distintivas. Las redes neuronales artificiales son sistemas de computaci贸n que intentan imitar las capacidades de aprendizaje humano a trav茅s de una arquitectura compleja que se asemeja al sistema nervioso humano.

    En este art铆culo, revisaremos brevemente qu茅 son las redes neuronales, cu谩les son los pasos computacionales que atraviesa una red neuronal (sin entrar en las complejas matem谩ticas detr谩s de ella) y c贸mo se pueden implementar utilizando Scikit-Learn, que es una biblioteca de IA popular para Python.

    El sistema nervioso humano

    El sistema nervioso humano consta de miles de millones de neuronas. Estas neuronas procesan colectivamente la informaci贸n recibida de los 贸rganos sensoriales, procesan la informaci贸n y decide qu茅 hacer en reacci贸n a la informaci贸n. Una neurona t铆pica del sistema nervioso humano tiene tres partes principales: dendritas, n煤cleo y axones. La informaci贸n que se pasa a una neurona es recibida por las dendritas. El n煤cleo se encarga de procesar esta informaci贸n. La salida de una neurona pasa a otras neuronas a trav茅s del ax贸n, que est谩 conectado a las dendritas de otras neuronas m谩s abajo en la red.

    Perceptrones

    Las redes neuronales artificiales se inspiran en la arquitectura de la red neuronal humana. La red neuronal m谩s simple consta de una sola neurona y se llama perceptr贸n , como se muestra en la siguiente figura:

    Un perceptr贸n tiene una capa de entrada y una neurona. La capa de entrada act煤a como dendritas y es responsable de recibir las entradas. El n煤mero de nodos en la capa de entrada es igual al n煤mero de entidades en el dataset de entrada. Cada entrada se multiplica por un peso (que normalmente se inicializa con alg煤n valor aleatorio) y los resultados se suman. Luego, la suma pasa a trav茅s de una funci贸n de activaci贸n . La funci贸n de activaci贸n de un perceptr贸n se asemeja al n煤cleo de la neurona del sistema nervioso humano. Procesa la informaci贸n y produce una salida. En el caso de un perceptr贸n, esta salida es el resultado final. Sin embargo, en el caso de perceptrones multicapa, la salida de las neuronas de la capa anterior sirve como entrada a las neuronas de la capa anterior.

    Red neuronal artificial (perceptr贸n multicapa)

    Ahora que sabemos qu茅 es un perceptr贸n de una sola capa, podemos extender esta discusi贸n a los perceptrones de m煤ltiples capas, o m谩s com煤nmente conocidas como redes neuronales artificiales. Un perceptr贸n de una sola capa puede resolver problemas simples donde los datos se pueden separar linealmente en an ‘n’ dimensiones, donde ‘n’ es el n煤mero de entidades en el conjunto de datos. Sin embargo, en el caso de datos separables de forma no lineal, la precisi贸n del perceptr贸n de una sola capa disminuye significativamente. Los perceptrones multicapa, por otro lado, pueden trabajar de manera eficiente con datos separables de forma no lineal.

    Los perceptrones multicapa, o m谩s com煤nmente denominados redes neuronales artificiales, son una combinaci贸n de m煤ltiples neuronas conectadas en forma de red. Una red neuronal artificial tiene una capa de entrada, una o m谩s capas ocultas y una capa de salida. Esto se muestra en la siguiente imagen:

    Una red neuronal se ejecuta en dos fases: Feed-Forward y Back Propagation.

    Feed-Forward

    Los siguientes son los pasos realizados durante la fase de feed-forward:

    • Los valores recibidos en la capa de entrada se multiplican por los pesos. Se agrega un sesgo a la suma de las entradas y los pesos para evitar valores nulos.
    • Cada neurona en la primera capa oculta recibe diferentes valores de la capa de entrada dependiendo de los pesos y el sesgo. Las neuronas tienen una funci贸n de activaci贸n que opera sobre el valor recibido de la capa de entrada. La funci贸n de activaci贸n puede ser de muchos tipos, como funci贸n escalonada, funci贸n sigmoidea, funci贸n relu o funci贸n tanh . Como regla general, la funci贸n relu se usa en las neuronas de la capa oculta y la funci贸n sigmoidea se usa para la neurona de la capa de salida.
    • Las salidas de las neuronas de la primera capa oculta se multiplican por los pesos de la segunda capa oculta; los resultados se suman y pasan a las neuronas de las capas anteriores. Este proceso contin煤a hasta que se alcanza la capa exterior. Los valores calculados en la capa exterior son los resultados reales del algoritmo.

    La fase de retroalimentaci贸n consta de estos tres pasos. Sin embargo, la salida prevista no es necesariamente correcta de inmediato; puede estar mal y debemos corregirlo. El prop贸sito de un algoritmo de aprendizaje es hacer predicciones lo m谩s precisas posible. Para mejorar estos resultados predichos, una red neuronal pasar谩 por una fase de retropropagaci贸n. Durante la retropropagaci贸n, los pesos de las diferentes neuronas se actualizan de manera que la diferencia entre la salida deseada y la predicha sea lo m谩s peque帽a posible.

    Propagaci贸n hacia atr谩s

    La fase de retropropagaci贸n consta de los siguientes pasos:

    • El error se calcula cuantificando la diferencia entre la salida prevista y la salida deseada. Esta diferencia se llama “p茅rdida” y la funci贸n utilizada para calcular la diferencia se llama “funci贸n de p茅rdida”. Las funciones de p茅rdida pueden ser de diferentes tipos, por ejemplo, el error cuadr谩tico medio o las funciones de entrop铆a cruzada. Recuerde, las redes neuronales son algoritmos de aprendizaje supervisados que necesitan las salidas deseadas para un conjunto dado de entradas, que es lo que le permite aprender de los datos.
    • Una vez calculado el error, el siguiente paso es minimizar ese error. Para ello, se calcula la derivada parcial de la funci贸n de error con respecto a todos los pesos y sesgos. Esto se llama degradado decente. Las derivadas se pueden usar para encontrar la pendiente de la funci贸n de error. Si la pendiente es positiva, el valor de los pesos se puede reducir o si la pendiente es negativa, se puede aumentar el valor del peso. Esto reduce el error general. La funci贸n que se utiliza para reducir este error se denomina funci贸n de optimizaci贸n.

    Este ciclo de propagaci贸n de retroalimentaci贸n hacia adelante y hacia atr谩s se llama una “茅poca”. Este proceso contin煤a hasta que se logra una precisi贸n razonable. No existe un est谩ndar para una precisi贸n razonable, lo ideal ser铆a que se esforzara por lograr una precisi贸n del 100%, pero esto es extremadamente dif铆cil de lograr para cualquier conjunto de datos no trivial. En muchos casos, se considera aceptable una precisi贸n de m谩s del 90%, pero realmente depende de su caso de uso.

    Implementando una red neuronal con Scikit-Learn

    Ahora sabemos qu茅 son las redes neuronales y cu谩les son los diferentes pasos que debemos realizar para construir una red neuronal simple y densamente conectada. En esta secci贸n intentaremos construir una red neuronal simple que prediga la clase a la que pertenece una determinada planta de iris. Usaremos la biblioteca Scikit-Learn de Python para crear nuestra red neuronal que realiza esta tarea de clasificaci贸n. Las instrucciones de descarga e instalaci贸n de la biblioteca Scikit-Learn est谩n disponibles en: http://scikit-learn.org/stable/install.html

    Nota : Los scripts proporcionados con este tutorial se han ejecutado y probado en un cuaderno de Python Jupyter.

    Conjunto de datos

    El conjunto de datos que vamos a utilizar para este tutorial es el popular conjunto de datos Iris, disponible en https://archive.ics.uci.edu/ml/datasets/iris . Los detalles del conjunto de datos est谩n disponibles en el enlace mencionado anteriormente.

    Pasemos directamente al c贸digo. El primer paso es importar este conjunto de datos a nuestro programa. Para hacerlo, usaremos la biblioteca pandas de Python .

    Ejecute el siguiente comando para cargar el conjunto de datos de iris en un marco de datos de Python:

    import pandas as pd
    
    # Location of dataset
    url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
    
    # Assign colum names to the dataset
    names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
    
    # Read dataset to pandas dataframe
    irisdata = pd.read_csv(url, names=names)
    

    El script anterior simplemente descarga los datos del iris, asigna los nombres, es decir, ‘sepal-length’, ‘s茅pal-width’, ‘petal-length’, ‘petal-width’ y ‘Class’ a las columnas del conjunto de datos, y luego lo carga en el irisdatamarco de datos.

    Para ver c贸mo se ve realmente este conjunto de datos, ejecute el siguiente comando:

    irisdata.head()
    

    La ejecuci贸n del script anterior mostrar谩 las primeras cinco filas de nuestro conjunto de datos, como se muestra a continuaci贸n:

    de longitud s茅palo
    s茅palo ancho de
    p茅talo de longitud
    p茅talo de ancho de
    Clase

    05.13.51.40.2Iris-setosa
    14.93.01.40.2Iris-setosa
    24.73.21.30.2Iris-setosa
    34.63.11.50.2Iris-setosa
    45.03.61.40.2Iris-setosa

    Preprocesamiento

    Puede ver que nuestro conjunto de datos tiene cinco columnas. La tarea es predecir la clase (que son los valores en la quinta columna) a la que pertenece la planta de iris, que se basa en la longitud del s茅palo, el ancho del s茅palo, la longitud del p茅talo y el ancho del p茅talo (las primeras cuatro columnas) . El siguiente paso es dividir nuestro conjunto de datos en atributos y etiquetas. Ejecute el siguiente script para hacerlo:

    # Assign data from first four columns to X variable
    X = irisdata.iloc[:, 0:4]
    
    # Assign data from first fifth columns to y variable
    y = irisdata.select_dtypes(include=[object])
    

    Para ver c贸mo se yve, ejecute el siguiente c贸digo:

    y.head()
    

    Clase

    0Iris-setosa
    1Iris-setosa
    2Iris-setosa
    3Iris-setosa
    4Iris-setosa

    Puede ver que los valores de la yserie son categ贸ricos. Sin embargo, las redes neuronales funcionan mejor con datos num茅ricos. Nuestra siguiente tarea es convertir estos valores categ贸ricos en valores num茅ricos. Pero primero veamos cu谩ntos valores 煤nicos tenemos en nuestra yserie. Ejecute el siguiente script:

    y.Class.unique()
    

    Salida:

    array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)
    

    Tenemos tres clases 煤nicas ‘Iris-setosa’, ‘Iris-versicolor’ e ‘Iris-virginica’. Convirtamos estos valores categ贸ricos en valores num茅ricos. Para ello usaremos la LabelEncoderclase de Scikit-Learn .

    Ejecute el siguiente script:

    from sklearn import preprocessing
    le = preprocessing.LabelEncoder()
    
    y = y.apply(le.fit_transform)
    

    Ahora, si vuelve a comprobar valores 煤nicos en la yserie, ver谩 los siguientes resultados:

    array([0, 1, 2], dtype=int64)
    

    Puede ver que los valores categ贸ricos se han codificado en valores num茅ricos, es decir, 0, 1 y 2.

    Prueba de tren dividida

    Para evitar un ajuste excesivo , dividiremos nuestro conjunto de datos en divisiones de entrenamiento y de prueba. Los datos de entrenamiento se usar谩n para entrenar la red neuronal y los datos de prueba se usar谩n para evaluar el rendimiento de la red neuronal. Esto ayuda con el problema de sobreajuste porque estamos evaluando nuestra red neuronal con datos que no ha visto (es decir, en los que no se ha entrenado) antes.

    Para crear divisiones de entrenamiento y prueba, ejecute el siguiente script:

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
    

    El script anterior divide el 80% del conjunto de datos en nuestro conjunto de entrenamiento y el otro 20% en datos de prueba.

    Escala de funciones

    Antes de hacer predicciones reales, siempre es una buena pr谩ctica escalar las caracter铆sticas para que todas puedan evaluarse de manera uniforme. El escalado de caracter铆sticas se realiza solo en los datos de entrenamiento y no en los datos de prueba. Esto se debe a que en el mundo real, los datos no se escalan y el prop贸sito final de la red neuronal es hacer predicciones sobre datos del mundo real. Por lo tanto, intentamos mantener nuestros datos de prueba lo m谩s reales posible.

    El siguiente script realiza el escalado de caracter铆sticas:

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    scaler.fit(X_train)
    
    X_train = scaler.transform(X_train)
    X_test = scaler.transform(X_test)
    

    Entrenamiento y predicciones

    Y ahora finalmente es el momento de hacer lo que ha estado esperando, entrenar una red neuronal que realmente pueda hacer predicciones. Para hacer esto, ejecute el siguiente script:

    from sklearn.neural_network import MLPClassifier
    mlp = MLPClassifier(hidden_layer_sizes=(10, 10, 10), max_iter=1000)
    mlp.fit(X_train, y_train.values.ravel())
    

    S铆, con Scikit-Learn, puede crear una red neuronal con estas tres l铆neas de c贸digo, que manejan gran parte del trabajo por usted. Veamos qu茅 est谩 sucediendo en el script anterior. El primer paso es importar la MLPClassifierclase de la sklearn.neural_networkbiblioteca. En la segunda l铆nea, esta clase se inicializa con dos par谩metros.

    El primer par谩metro, hidden_layer_sizesse utiliza para establecer el tama帽o de las capas ocultas. En nuestro script crearemos tres capas de 10 nodos cada una. No existe una f贸rmula est谩ndar para elegir la cantidad de capas y nodos para una red neuronal y var铆a bastante seg煤n el problema en cuesti贸n. La mejor manera es probar diferentes combinaciones y ver cu谩l funciona mejor.

    El segundo par谩metro MLPClassifierespecifica el n煤mero de iteraciones, o 茅pocas, que desea que ejecute su red neuronal. Recuerde, una 茅poca es una combinaci贸n de un ciclo de fase de propagaci贸n de retroalimentaci贸n y retroalimentaci贸n.

    Por defecto, la funci贸n de activaci贸n ‘relu’ se usa con el optimizador de costos ‘adam’. Sin embargo, puede cambiar estas funciones utilizando los par谩metros activationy solver, respectivamente.

    En la tercera l铆nea, la fitfunci贸n se usa para entrenar el algoritmo en nuestros datos de entrenamiento, es decir, X_trainy y_train.

    El paso final es hacer predicciones sobre nuestros datos de prueba. Para hacerlo, ejecute el siguiente script:

    predictions = mlp.predict(X_test)
    

    Evaluar el algoritmo

    Creamos nuestro algoritmo e hicimos algunas predicciones sobre el conjunto de datos de prueba. Ahora es el momento de evaluar qu茅 tan bien funciona nuestro algoritmo. Para evaluar un algoritmo, las m茅tricas m谩s com煤nmente utilizadas son una matriz de confusi贸n, precisi贸n, recuperaci贸n y puntuaci贸n f1. Los m茅todos confusion_matrixy classification_reportde la sklearn.metricsbiblioteca pueden ayudarnos a encontrar estas partituras. El siguiente script genera un informe de evaluaci贸n para nuestro algoritmo:

    from sklearn.metrics import classification_report, confusion_matrix
    print(confusion_matrix(y_test,predictions))
    print(classification_report(y_test,predictions))
    

    Este c贸digo anterior genera el siguiente resultado:

    [[11  0  0]
       0  8  0]
       0  1 10]]
                 precision   recall   f1-score   support
              0       1.00     1.00       1.00        11
              1       0.89     1.00       0.94         8
              2       1.00     0.91       0.95        11
    
    avg / total       0.97     0.97       0.97        30
    

    Puede ver en la matriz de confusi贸n que nuestra red neuronal solo clasific贸 err贸neamente una planta de las 30 plantas en las que probamos la red. Adem谩s, el puntaje f1 de 0.97 es muy bueno, dado que solo ten铆amos 150 instancias para entrenar.

    Sus resultados pueden ser ligeramente diferentes de estos porque train_test_splitdivide aleatoriamente los datos en conjuntos de entrenamiento y prueba, por lo que nuestras redes pueden no haber sido entrenadas / probadas con los mismos datos. Pero, en general, la precisi贸n tambi茅n deber铆a ser superior al 90% en sus conjuntos de datos.

    Conclusi贸n

    En este art铆culo, brindamos una breve descripci贸n general de qu茅 son las redes neuronales y explicamos c贸mo crear una red neuronal muy simple que se entren贸 en el conjunto de datos del iris. Le recomendar铆a que intente jugar con la cantidad de capas ocultas, las funciones de activaci贸n y el tama帽o de la divisi贸n de entrenamiento y prueba para ver si puede lograr mejores resultados que los que presentamos aqu铆.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *