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
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
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.
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]:
In [49]:
# realizar una descriptiva gráfica del dataframe
data.describe().transpose()
Out[49]:
In [50]:
# estructura de los datos
data.shape
Out[50]:
In [51]:
# preparar los datos para su procesamiento
X = data.drop('Cultivator', axis=1)
y = data['Cultivator']
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)
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]:
In [57]:
# aplicar la transformación a toda la información
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
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]:
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))
In [64]:
print(classification_report(y_test,predictions))
Nada mal, parece ser que solo perdimos una sola botella de vino en nuestra información de prueba.
In [ ]: