En este artículo exploraremos las posibilidades que ofrece Python junto con TensorFlow para resolver un caso de uso de banca. Python se ha convertido en uno de los lenguajes de programación más populares para data science y machine learning, ya que ofrece una gran colección de librerías y herramientas para que los desarrolladores implementen modelos complejos de forma sencilla. Una de esas librerías es TensorFlow, cuya popularidad ha aumentado en los últimos años.
En este artículo introduciremos TensorFlow y comentaremos un caso de uso en el ámbito de banca que se puede resolver usando modelos de machine learning, entre ellos modelos de TensorFlow, para detectar fraudes en movimientos con tarjetas de crédito. Para apoyar al artículo se incluye un notebook con el código que se ha usado para resolver el problema del caso de uso.
TensorFlow es una librería de machine learning desarrollada por Google que permite a los desarrolladores construir y desplegar modelos complejos, entre los que se encuentran redes neuronales. Su popularidad ha aumentado mucho en los últimos años, y se usa en muchas industrias, como en finanzas o e-commerce. Tensorflow tiene implementación en Python, por lo que se ha vuelto mucho más accesible para un gran número de desarrolladores. La arquitectura de Tensorflow está basada en gráficos de flujo de datos que representan computaciones como una serie de nodos conectados por aristas. Esta estructura permite que TensorFlow pueda escalar los procesos a múltiples CPUs y GPUs.
TensorFlow ofrece integración con Keras, que es una API para redes neuronales que ofrece una forma simplificada de construir y entrenar modelos de deep learning. En este artículo vamos a construir una red neuronal usando Keras para resolver un caso de uso de detección de fraude en transferencias con tarjetas.
El fraude con tarjetas de crédito causa pérdidas de miles de millones de dólares a bancos y otros negocios cada año, y las pérdidas aumentan cada año. Según el Nilson Report de 2020, los emisores de tarjetas de crédito, negocios y cajeros automáticos sufrieron pérdidas de 28 mil millones de dólares.
A pesar de que no hay casos seguros de fraude de transacciones, dado que hay un gran número de posibles escenarios en los que puede ocurrir, se han detectado algunos patrones que ocurren más a menudo que otros en casos de fraude. Aún así, es un gran desafío diseñar un sistema de detección de fraude fiable.
Dada la estricta confidencialidad del tema de este caso de uso, las compañías que lo trabajan regularmente no hacen públicos sus datasets. El dataset de este caso de uso se llama Credit Card Fraud Detection y es de Kaggle. Este dataset contiene transacciones de tarjetas de crédito realizadas en septiembre de 2013. Las transacciones se realizaron en dos días consecutivos, siendo 492 de las 284807 fraudulentas. El dataset está muy desbalanceado, por tanto, ya que las transacciones fraudulentas solo conforman el 0.172% del total.
Dado que vamos a trabajar con un dataset muy desbalanceado, es muy importante escoger un modelo o hacer uso de técnicas que nos permitan trabajar con ese desbalanceo de los datos de forma efectiva. Algunas de las opciones que se pueden emplear son:
El objetivo será construir un modelo de machine learning usando TensorFlow en Python para predecir si las transacciones serán fraudulentas o no. La estructura de la resolución del caso de uso es la siguiente:
El trabajo comienza con la ingesta de los datos. El dataset se encuentra en Kaggle y se puede descargar en el siguiente link. Los datos ya están pre-procesados en cierta medida (aunque no conocemos el contexto del que provienen estas features) según la documentación, ya que las 28 features numéricas son resultado de una transformación PCA. Estas features además ya se han escalado; las únicas features que no se han escalado son Amount y Time. Por tanto, en este caso, el único pre-procesado que tenemos que hacer es dividir el dataset en conjuntos de entrenamiento, test y validación.
# Load the dataset
df = pd.read_csv('creditcard.csv')
# Split the dataset into train, validation, and test sets
X_train, X_test, y_train, y_test = train_test_split(
df.drop(['Class', 'Time'], axis=1), df['Class'], test_size=0.2, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42)
Entrenar modelos de machine learning con datasets muy desbalanceados normalmente conlleva unos resultados pobres. En la sección del caso de uso se han mencionado dos métodos para resolver este problema. Dos métodos muy populares de sampling son Random Under Sampling y Synthetic Minority Over-Sampling (SMOTE). Estas técnicas solo se hacen efectivas cuando se use fit en los modelos.
En cuanto a los modelos, además de una red neuronal creada con Keras y TensorFlow, en el notebook se incluye un Random Forest Classifier y un XGBoost Classifier.
El último paso del workflow será evaluar los modelos con el conjunto de datos de test. Vamos a evaluar las siguientes métricas:
La red neuronal, construida con Keras, contiene diferentes capas de nodos conectadas:
# Define the neural network architecture
model = tf.keras.Sequential([
tf.keras.layers.Dense(256, activation='relu', input_shape=(X_train.shape[1],)),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense(1, activation='sigmoid')
])
A la hora de compilar la red neuronal se ha especificado binary cross entropy como función de pérdida, ya que funciona bien para casos con datasets desbalanceados.
# Compile the model with binary crossentropy loss and class weights
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy', precision, recall, auc])
callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
# Train the model
history = model.fit(X_train,
y_train,
epochs=20,
batch_size=512,
validation_data=(X_val, y_val),
callbacks=[callback]
)
Los resultados de la evaluación de la red neuronal en el conjunto de datos de test han dado los siguientes resultados:
# Evaluate the model
test_prec, test_rec, test_auc = model.evaluate(X_test, y_test)
print('Test Precision:', test_prec)
print('Test Recall:', test_rec)
print('Test AUC:', test_auc)
A pesar de que las métricas son buenas, se podrían mejorar optimizando la red neuronal. Encontrar la red neuronal ideal implica modificar la complejidad de la red, probar distintas técnicas de regularización y tunear los hiperparámetros. Por ejemplo, se podrían modificar el número de capas de la red o el número de neuronas de cada capa. Aún así, aunque los resultados han sido buenos, es importante explorar otras estrategias y posibilidades para mejorar el modelo.
En este artículo hemos presentado TensorFlow y Python y cómo se pueden usar los dos en un caso de uso del ámbito de banca, construyendo una red neuronal que predice si una transacción con una tarjeta de crédito es fraudulenta o no. Esperamos que haya sido útil para empezar a usar TensorFlow y Python para resolver otros casos de uso.