De Python a Julia Ingeniería de características y Aprendizaje Automático

From Python to Julia Feature Engineering and Machine Learning

Foto de CardMapr.nl en Unsplash

Un enfoque basado en Julia para construir un modelo de detección de fraude

Este es el segundo artículo de mi serie de dos partes sobre cómo empezar con Julia para la ciencia de datos aplicada. En el primer artículo, repasamos algunos ejemplos de manipulación de datos simples y análisis exploratorio de datos con Julia. En este blog, continuaremos con la tarea de construir un modelo de detección de fraude para identificar transacciones fraudulentas.

Para resumir brevemente, utilizamos un conjunto de datos de detección de fraude de tarjeta de crédito obtenido de Kaggle. El conjunto de datos contiene 30 características, incluyendo el tiempo de transacción, la cantidad y 28 características principales obtenidas con PCA. A continuación se muestra una captura de pantalla de las primeras 5 instancias del conjunto de datos, cargadas como un dataframe en Julia. Tenga en cuenta que la característica de tiempo de transacción registra el tiempo transcurrido (en segundos) entre la transacción actual y la primera transacción en el conjunto de datos.

Ingeniería de características

Antes de entrenar el modelo de detección de fraude, prepararemos los datos para que el modelo los pueda consumir. Dado que el objetivo principal de este blog es presentar Julia, no realizaremos ninguna selección o síntesis de características aquí.

División de datos

Cuando se entrena un modelo de clasificación, los datos se dividen típicamente para el entrenamiento y la prueba de manera estratificada. El objetivo principal es mantener la distribución de los datos con respecto a la variable de clase objetivo tanto en los datos de entrenamiento como en los de prueba. Esto es especialmente necesario cuando estamos trabajando con un conjunto de datos con un desequilibrio extremo. El paquete MLDataUtils en Julia proporciona una serie de funciones de preprocesamiento, incluyendo la división de datos, la codificación de etiquetas y la normalización de características. El siguiente código muestra cómo realizar el muestreo estratificado utilizando la función stratifiedobs de MLDataUtils. Se puede establecer una semilla aleatoria para que se pueda reproducir la misma división de datos.

Dividir datos para entrenamiento y prueba – Implementación en Julia

El uso de la función stratifiedobs es bastante similar a la función train_test_split de la biblioteca sklearn en Python. Tenga en cuenta que las características de entrada X deben pasar dos veces por la transposición para restaurar las dimensiones originales del conjunto de datos. Esto puede ser confuso para un novato en Julia como yo. No estoy seguro de por qué el autor de MLDataUtils desarrolló la función de esta manera.

La implementación equivalente en Python sklearn es la siguiente:

Dividir datos para entrenamiento y prueba - Implementación en Python (Imagen del autor)

Escalado de características

Como práctica recomendada en el aprendizaje automático, el escalado de características lleva las características a los mismos o similares rangos de valores o distribución. El escalado de características ayuda a mejorar la velocidad de convergencia al entrenar redes neuronales, y también evita la dominación de cualquier característica individual durante el entrenamiento.

Aunque no estamos entrenando un modelo de red neuronal en este trabajo, aún me gustaría saber cómo se puede realizar el escalado de características en Julia. Desafortunadamente, no pude encontrar una biblioteca de Julia que proporcione funciones tanto para ajustar el escalador como para transformar características. Las funciones de normalización de características proporcionadas en el paquete MLDataUtils permiten a los usuarios derivar la media y la desviación estándar de las características, pero no se pueden aplicar fácilmente a los conjuntos de datos de entrenamiento / prueba para transformar las características. Dado que la media y la desviación estándar de las características se pueden calcular fácilmente en Julia, podemos implementar el proceso de escala estándar manualmente.

El siguiente código crea una copia de X_train y X_test, y calcula la media y la desviación estándar de cada característica en un bucle.

Estandarizar características – Implementación en Julia

Las características transformadas y originales se muestran a continuación.

Características escaladas vs. características originales - Implementación en Julia (Imagen del autor)

En Python, sklearn proporciona varias opciones para el escalado de características, incluyendo la normalización y la estandarización. Al declarar un escalador de características, el escalado se puede hacer con dos líneas de código. El siguiente código da un ejemplo de cómo utilizar un RobustScaler.

Realizar escalado robusto a las características - Implementación en Python (Imagen del autor)

Sobre muestreo (por PyCall)

Un conjunto de datos de detección de fraude suele estar severamente desequilibrado. Por ejemplo, la proporción de ejemplos negativos sobre positivos de nuestro conjunto de datos es superior a 500:1. Dado que no es posible obtener más puntos de datos, el submuestreo resultará en una gran pérdida de puntos de datos de la clase mayoritaria, por lo que el sobremuestreo se convierte en la mejor opción en este caso. Aquí aplico el método SMOTE popular para crear ejemplos sintéticos para la clase positiva.

Actualmente, no hay una biblioteca de Julia que proporcione la implementación de SMOTE. El paquete ClassImbalance no ha sido mantenido durante dos años y no se puede utilizar con las versiones más recientes de Julia. Afortunadamente, Julia nos permite llamar a los paquetes de Python listos para usar utilizando una biblioteca envolvente llamada PyCall.

Para importar una biblioteca de Python a Julia, necesitamos instalar PyCall y especificar PYTHONPATH como una variable de entorno. Intenté crear un entorno virtual de Python aquí pero no funcionó. Por alguna razón, Julia no puede reconocer la ruta de Python del entorno virtual. Es por eso que tengo que especificar la ruta predeterminada de Python del sistema. Después de esto, podemos importar la implementación de SMOTE de Python, que se proporciona en la biblioteca imbalanced-learn. La función pyimport proporcionada por PyCall se puede utilizar para importar bibliotecas de Python en Julia. El siguiente código muestra cómo activar PyCall y pedir ayuda a Python en un kernel de Julia.

Upsample training data with SMOTE – Implementación en Julia

La implementación equivalente en Python es la siguiente. Podemos ver que la función fit_resample se usa de la misma manera en Julia.

Datos de entrenamiento Upsample con SMOTE - Implementación en Python (Imagen del autor)

Entrenamiento del modelo

Ahora llegamos a la etapa de entrenamiento del modelo. Estaremos entrenando un clasificador binario, que se puede hacer con una variedad de algoritmos de aprendizaje automático, incluyendo regresión logística, árbol de decisiones y redes neuronales. Actualmente, los recursos para el aprendizaje automático en Julia se distribuyen en múltiples bibliotecas de Julia. Permítanme listar algunas de las opciones más populares con su conjunto especializado de modelos.

  • MLJ: algoritmos de aprendizaje automático tradicionales
  • ScikitLearn: algoritmos de aprendizaje automático tradicionales
  • Mocha: redes neuronales
  • Flux: redes neuronales

Aquí voy a elegir XGBoost, considerando su simplicidad y su rendimiento superior sobre los problemas de regresión y clasificación tradicionales. El proceso de entrenamiento de un modelo XGBoost en Julia es el mismo que en Python, aunque hay algunas diferencias menores en la sintaxis.

Entrenar un modelo de detección de fraude con XGBoost – Implementación en Julia

La implementación equivalente en Python es la siguiente.

Entrenar un modelo de detección de fraude con XGBoost - Implementación en Python (Imagen del autor)

Evaluación del modelo

Finalmente, veamos cómo se desempeña nuestro modelo al observar la precisión, la recuperación obtenida en los datos de prueba, así como el tiempo dedicado a entrenar el modelo. En Julia, la precisión, las métricas de recuperación se pueden calcular utilizando la biblioteca EvalMetrics. Un paquete alternativo es MLJBase con el mismo propósito.

Hacer predicciones y calcular métricas – Implementación en Julia

En Python, podemos emplear sklearn para calcular las métricas.

Hacer predicciones y calcular métricas - Implementación en Python (Imagen del autor)

¿Entonces quién es el ganador entre Julia y Python? Para hacer una comparación justa, ambos modelos fueron entrenados con los hiperparámetros predeterminados, y una tasa de aprendizaje de 0,1 y 1000 estimadores. Las métricas de rendimiento se resumen en la siguiente tabla.

Se puede observar que el modelo de Julia logra una mejor precisión y recall con un tiempo de entrenamiento ligeramente más largo. Dado que la biblioteca XGBoost utilizada para entrenar el modelo de Python está escrita en C++ bajo el capó, mientras que la biblioteca XGBoost de Julia está completamente escrita en Julia, ¡Julia se ejecuta tan rápido como C++, tal como se afirma!

El hardware utilizado para la prueba mencionada anteriormente: 11th Gen Intel® Core™ i7–1165G7 @ 2.80GHz — 4 núcleos.

Se puede encontrar el cuaderno de Jupyter en Github.

Conclusiones

Me gustaría terminar esta serie con un resumen de las bibliotecas de Julia mencionadas para diferentes tareas de ciencia de datos.

Debido a la falta de soporte comunitario, la usabilidad de Julia no se puede comparar con Python en este momento. No obstante, dada su superioridad en rendimiento, Julia aún tiene un gran potencial en el futuro.

Referencias

  • Machine Learning Group of ULB (Université Libre de Bruxelles) . (sin fecha). Credit Card Fraud Detection [Dataset]. H i i (Database Contents License (DbCL))
  • Akshay Gupta. 13 de mayo de 2021. Comience el aprendizaje automático con Julia: las mejores bibliotecas de Julia para el aprendizaje automático. https://www.analyticsvidhya.com/blog/2021/05/top-julia-machine-learning-libraries/