Neural Networks

En el siguiente ejercicio de neural networks vamos a utilizar la librería scikit-learn, si aún no cuentas con esta librería en tu computadora te recomiendo usar el siguiente comando en la anaconda-promt:

conda install scikit-learn

Para mayor información en cuanto a la instalación puedes visitar el siguiente link documentación

¿Qué es una neural network?

Las redes neuronales son un marco de aprendizaje automático que intenta imitar el patrón de aprendizaje de las redes neuronales biológicas naturales. Las redes neuronales biológicas tienen neuronas interconectadas con dendritas que reciben entradas, y luego, a partir de estas entradas, producen una señal de salida a través de un axón a otra neurona. Trataremos de imitar este proceso mediante el uso de Redes neuronales artificiales (ANN), que a partir de ahora llamaremos redes neuronales. El proceso de crear una red neuronal comienza con la forma más básica, un solo perceptrón

¿Qué es un perceptrón?

Un perceptron tiene una o más entradas, un sesgo, una función de activación y una única salida. El perceptron recibe entradas, las multiplica por un poco de peso y luego las pasa a una función de activación para producir una salida. Hay muchas funciones de activación posibles para elegir, como la función logística, una función trigonométrica, una función de paso, etc. También nos aseguramos de agregar un sesgo al perceptrón, esto evita problemas donde todas las entradas podrían ser iguales a cero (es decir, ningún peso multiplicativo tendría un efecto).

Una vez que tenemos el resultado, podemos compararlo con una etiqueta conocida y ajustar los pesos en consecuencia (los pesos usualmente comienzan con valores de inicialización aleatorios). Seguimos repitiendo este proceso hasta que hayamos alcanzado un número máximo de iteraciones permitidas, o una tasa de error aceptable.

Para crear una red neuronal, simplemente comenzamos a agregar capas de perceptrones, creando un modelo de perceptrón multicapa de una red neuronal. Tendrás una capa de entrada que tomará directamente tus entradas de funciones y una capa de salida que creará las salidas resultantes. Las capas intermedias se conocen como capas ocultas porque no "ven" directamente las entradas o salidas de características.

Tenga en cuenta que, debido a su naturaleza, las redes neuronales tienden a funcionar mejor en la GPU que en la CPU. El marco de aprendizaje de sci-kit no está diseñado para la optimización de GPU. Si desea continuar con la GPU y los modelos distribuidos, eche un vistazo a otros marcos, como el TensforFlow de fuente abierta de Google.

Información

Para este análisis, abordaremos el tema del fraude en el vino. Usaremos el conjunto de datos de vino del Repositorio de aprendizaje automático de UCI. Tiene varias características químicas de diferentes vinos, todos cultivados en la misma región en Italia, pero los datos están etiquetados por tres diferentes cultivares posibles. Trataremos de construir un modelo que pueda clasificar a qué cultivar pertenece un vino en función de sus características químicas utilizando redes neuronales. Puedes obtener los datos link


In [47]:
# librerias
import pandas as pd
data = pd.read_csv('../../data/wine.csv', names = ["Cultivator", "Alchol", "Malic_Acid", "Ash", "Alcalinity_of_Ash", "Magnesium", "Total_phenols", "Falvanoids", "Nonflavanoid_phenols", "Proanthocyanins", "Color_intensity", "Hue", "OD280", "Proline"])

In [48]:
# verificar la integridad de la información
data.head()


Out[48]:
Cultivator Alchol Malic_Acid Ash Alcalinity_of_Ash Magnesium Total_phenols Falvanoids Nonflavanoid_phenols Proanthocyanins Color_intensity Hue OD280 Proline
0 1 14.23 1.71 2.43 15.6 127 2.80 3.06 0.28 2.29 5.64 1.04 3.92 1065
1 1 13.20 1.78 2.14 11.2 100 2.65 2.76 0.26 1.28 4.38 1.05 3.40 1050
2 1 13.16 2.36 2.67 18.6 101 2.80 3.24 0.30 2.81 5.68 1.03 3.17 1185
3 1 14.37 1.95 2.50 16.8 113 3.85 3.49 0.24 2.18 7.80 0.86 3.45 1480
4 1 13.24 2.59 2.87 21.0 118 2.80 2.69 0.39 1.82 4.32 1.04 2.93 735

In [49]:
# realizar una descriptiva gráfica del dataframe
data.describe().transpose()


Out[49]:
count mean std min 25% 50% 75% max
Cultivator 178.0 1.938202 0.775035 1.00 1.0000 2.000 3.0000 3.00
Alchol 178.0 13.000618 0.811827 11.03 12.3625 13.050 13.6775 14.83
Malic_Acid 178.0 2.336348 1.117146 0.74 1.6025 1.865 3.0825 5.80
Ash 178.0 2.366517 0.274344 1.36 2.2100 2.360 2.5575 3.23
Alcalinity_of_Ash 178.0 19.494944 3.339564 10.60 17.2000 19.500 21.5000 30.00
Magnesium 178.0 99.741573 14.282484 70.00 88.0000 98.000 107.0000 162.00
Total_phenols 178.0 2.295112 0.625851 0.98 1.7425 2.355 2.8000 3.88
Falvanoids 178.0 2.029270 0.998859 0.34 1.2050 2.135 2.8750 5.08
Nonflavanoid_phenols 178.0 0.361854 0.124453 0.13 0.2700 0.340 0.4375 0.66
Proanthocyanins 178.0 1.590899 0.572359 0.41 1.2500 1.555 1.9500 3.58
Color_intensity 178.0 5.058090 2.318286 1.28 3.2200 4.690 6.2000 13.00
Hue 178.0 0.957449 0.228572 0.48 0.7825 0.965 1.1200 1.71
OD280 178.0 2.611685 0.709990 1.27 1.9375 2.780 3.1700 4.00
Proline 178.0 746.893258 314.907474 278.00 500.5000 673.500 985.0000 1680.00

In [50]:
# estructura de los datos
data.shape


Out[50]:
(178, 14)

In [51]:
# preparar los datos para su procesamiento
X = data.drop('Cultivator', axis=1)
y = data['Cultivator']

Train Test Split

Debemos de separar nuestra información entre entrenamiento y procesamiento, esto es muy fácil con el módulo de SciKit Learn y su función train_test_split del model_selection:


In [52]:
# importar función
from sklearn.model_selection import train_test_split

In [53]:
# generar la información para su procesamiento
X_train, X_test, y_train, y_test = train_test_split(X,y)

Preprocesamiento de la información

La red neuronal puede tener dificultades para converger antes de la cantidad máxima de iteraciones permitidas si los datos no están normalizados. El Perceptron multicapa es sensible a las incrustaciones de características, por lo que es muy recomendable escalar sus datos. Tenga en cuenta que debe aplicar la misma escala al conjunto de prueba para obtener resultados significativos. Hay muchos métodos diferentes para la normalización de los datos, utilizaremos el StandardScaler incorporado para la estandarización.


In [54]:
from sklearn.preprocessing import StandardScaler

In [55]:
scaler = StandardScaler()

In [56]:
# ajustar la información de entrenamiento
scaler.fit(X_train)


Out[56]:
StandardScaler(copy=True, with_mean=True, with_std=True)

In [57]:
# aplicar la transformación a toda la información
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

Entrenamiento del modelo

Ahora entrenaremos nuestro modelo, el módulo SciKit Learn hace esta tarea muy fácil, con el uso de el estimador de objetos, en este caso particular importaremos nuestro estimador (Multi-Layer Perceptron Classifier model) from the neural_network library of SciKit-Learn


In [58]:
# importar librería
from sklearn.neural_network import MLPClassifier

In [59]:
# crear la instancía que nos permitira definir el número de capaz y el máximo número de iteraciones
mlp = MLPClassifier(hidden_layer_sizes=(15,15,15),max_iter=1000)

In [60]:
# ahora que tenemos el modelo generardo, ya podemos ajustar la información al modelo
mlp.fit(X_train,y_train)


Out[60]:
MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(15, 15, 15), learning_rate='constant',
       learning_rate_init=0.001, max_iter=1000, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=None,
       shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,
       verbose=False, warm_start=False)

Predicciones y Evaluación

Ya que tenemos nuestro modelo, podemos realizar predicciones.


In [61]:
predictions = mlp.predict(X_test)

In [62]:
# importar los métodos de reporte
from sklearn.metrics import classification_report,confusion_matrix

In [63]:
print(confusion_matrix(y_test,predictions))


[[19  0  0]
 [ 0 13  1]
 [ 0  0 12]]

In [64]:
print(classification_report(y_test,predictions))


             precision    recall  f1-score   support

          1       1.00      1.00      1.00        19
          2       1.00      0.93      0.96        14
          3       0.92      1.00      0.96        12

avg / total       0.98      0.98      0.98        45

Nada mal, parece ser que solo perdimos una sola botella de vino en nuestra información de prueba.


In [ ]: