De Python a Julia Ingeniería de características y Aprendizaje Automático
From Python to Julia Feature Engineering and Machine Learning

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
- Atlas de los vasos sanguíneos del cerebro humano destaca cambios en...
- La variable PATH para el científico de datos confundido Cómo gestio...
- ¿Cuál es la diferencia entre Ciencia de Datos y Aprendizaje Automát...
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:

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.

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.

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.

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.

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.

¿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/