La detección de fraudes con tarjetas de crédito es una plaga que afecta a todas las instituciones financieras. En general, la detección del fraude es un gran desafío porque los estafadores están ideando formas nuevas e innovadoras de detectar el fraude, por lo que es difícil encontrar un patrón que podamos detectar. Por ejemplo, en el diagrama todos los íconos se ven iguales, pero hay un ícono que es ligeramente diferente del resto y tenemos que elegir ese. ¿Puedes detectarlo?
Aquí lo tienes:
Con estos antecedentes, permítame brindarle un plan para hoy y lo que aprenderá en el contexto de nuestro caso de uso ‘Detección de fraude con tarjetas de crédito’:
1. ¿Qué es el desequilibrio de datos?
2. Posibles causas del desequilibrio de datos
3. ¿Por qué el desequilibrio de clases es un problema en el aprendizaje automático?
4. Actualización rápida sobre el algoritmo de bosque aleatorio
5. Diferentes métodos de muestreo para abordar el desequilibrio de datos
6. Comparación de qué método funciona bien en nuestro contexto con una demostración práctica con Python
7. ¿Visión empresarial sobre qué modelo elegir y por qué?
En la mayoría de los casos, debido a que la cantidad de transacciones fraudulentas no es enorme, tenemos que trabajar con datos que generalmente contienen muchas transacciones no fraudulentas en comparación con los casos de fraude. En términos técnicos, un conjunto de datos de este tipo se denomina “datos desequilibrados”. Pero sigue siendo esencial detectar los casos de fraude, porque sólo una transacción fraudulenta puede causar millones de pérdidas a los bancos/instituciones financieras. Ahora, profundicemos en qué es el desequilibrio de datos.
Consideraremos el conjunto de datos sobre fraude con tarjetas de crédito de https://www.kaggle.com/mlg-ulb/creditcardfraud (Licencia de Datos Abiertos).
Formalmente esto significa que la distribución de muestras entre diferentes clases es desigual. En nuestro caso del problema de clasificación binaria, hay 2 clases.
a) Clase mayoritaria: las transacciones no fraudulentas/genuinas
b) Clase minoritaria: las transacciones fraudulentas
En el conjunto de datos considerado, la distribución de clases es la siguiente (Tabla 1):
Como podemos observar, el conjunto de datos está muy desequilibrado y solo el 0,17% de las observaciones se encuentran en la categoría Fraudulenta.
Puede haber dos causas principales de desequilibrio de datos:
a) Errores sesgados de muestreo/medición: esto se debe a la recolección de muestras solo de una clase o de una región particular o a una clasificación errónea de las muestras. Esto se puede resolver mejorando los métodos de muestreo.
b) Caso de uso/característica de dominio: Un problema más pertinente como en nuestro caso podría deberse al problema de la predicción de un evento raro, que automáticamente introduce sesgo hacia la clase mayoritaria porque la ocurrencia de la clase menor no es una práctica frecuente.
Esto es un problema porque la mayoría de los algoritmos del aprendizaje automático se centran en aprender de los sucesos que ocurren con frecuencia, es decir, la clase mayoritaria. Esto se llama sesgo de frecuencia. Por lo tanto, en casos de conjuntos de datos desequilibrados, es posible que estos algoritmos no funcionen bien. Normalmente, pocas técnicas que funcionarán bien son los algoritmos basados en árboles o los algoritmos de detección de anomalías. Tradicionalmente, en los problemas de detección de fraude se suelen utilizar métodos basados en reglas de negocio. Los métodos basados en árboles funcionan bien porque un árbol crea una jerarquía basada en reglas que puede separar ambas clases. Los árboles de decisión tienden a sobreajustar los datos y para eliminar esta posibilidad utilizaremos un método de conjunto. Para nuestro caso de uso, hoy utilizaremos el algoritmo de bosque aleatorio.
Random Forest funciona construyendo múltiples predictores de árboles de decisión y la moda de las clases de estos árboles de decisión individuales es la clase o resultado final seleccionado. Es como votar por la clase más popular. Por ejemplo: si dos árboles predicen que la regla 1 indica fraude mientras que otro árbol indica que la regla 1 predice no fraude, entonces, de acuerdo con el algoritmo de bosque aleatorio, la predicción final será fraude.
Definición formal: un bosque aleatorio es un clasificador que consta de una colección de clasificadores estructurados en árbol {h(x,Θk), k=1,…} donde los {Θk} son vectores aleatorios independientes distribuidos de forma idéntica y cada árbol emite un voto unitario. para la clase más popular en la entrada x . (Fuente)
Cada árbol depende de un vector aleatorio que se muestrea de forma independiente y todos los árboles tienen una distribución similar. El error de generalización converge a medida que aumenta el número de árboles. En sus criterios de división, el bosque aleatorio busca la mejor característica entre un subconjunto aleatorio de características y también podemos calcular la importancia de la variable y, en consecuencia, realizar la selección de características. Los árboles se pueden cultivar utilizando la técnica de embolsado donde las observaciones se pueden seleccionar aleatoriamente (sin reemplazo) del conjunto de entrenamiento. El otro método puede ser la selección de división aleatoria, donde se selecciona una división aleatoria entre las K mejores divisiones en cada nodo.
Puedes leer más sobre esto. aquí
Ahora ilustraremos tres métodos de muestreo que pueden solucionar el desequilibrio de datos.
a) Submuestreo aleatorio: Se toman sorteos aleatorios de las observaciones sin fraude, es decir, la clase mayoritaria, para compararlas con las observaciones de fraude, es decir, la clase minoritaria. Esto significa que estamos desperdiciando información del conjunto de datos que puede no ser siempre ideal.
b) Sobremuestreo aleatorio: En este caso, hacemos exactamente lo contrario del submuestreo, es decir, duplicamos la clase minoritaria, es decir, observaciones de fraude al azar para aumentar el número de la clase minoritaria hasta obtener un conjunto de datos equilibrado. La posible limitación es que estamos creando muchos duplicados con este método.
c) SMOTE: (técnica de sobremuestreo de minoría sintética) es otro método que utiliza datos sintéticos con KNN en lugar de utilizar datos duplicados. Se considera cada ejemplo de clase minoritaria junto con sus k vecinos más cercanos. Luego, a lo largo de los segmentos de línea que unen cualquiera o todos los ejemplos de clases minoritarias y los ejemplos sintéticos de k vecinos más cercanos, se crean. Esto se ilustra en la figura 3 a continuación:
Con solo un sobremuestreo, el límite de decisión se vuelve más pequeño, mientras que con SMOTE podemos crear regiones de decisión más grandes, mejorando así las posibilidades de capturar mejor a la clase minoritaria.
Una posible limitación es que, si la clase minoritaria, es decir, las observaciones fraudulentas, se distribuyen en todos los datos y no son distintas, entonces el uso de vecinos más cercanos para crear más casos de fraude introduce ruido en los datos y esto puede llevar a una clasificación errónea.
Algunas de las métricas que son útiles para juzgar el rendimiento de un modelo se enumeran a continuación. Estas métricas proporcionan una vista de qué tan bien y con qué precisión el modelo es capaz de predecir/clasificar las variables objetivo:
· TP (Verdadero positivo)/TN (Verdadero negativo) son los casos de predicciones correctas, es decir, predecir casos de fraude como fraude (TP) y predecir casos sin fraude como no fraude (TN).
· FP (falso positivo) son aquellos casos que en realidad no son fraude pero que el modelo predice como fraude
· FN (falso negativo) son aquellos casos que en realidad son fraude pero que el modelo predice que no son fraude.
Precisión = TP / (TP + FP): La precisión mide con qué precisión el modelo es capaz de capturar el fraude, es decir, del total de casos de fraude previstos, cuántos realmente resultaron ser fraude.
Recuperar = TP/ (TP+FN): medidas de recuperación de todos los casos de fraude reales, cuántos el modelo podría predecir correctamente como fraude. Esta es una métrica importante aquí.
Precisión = (TP +TN)/(TP+FP+FN+TN): Mide cuántas clases mayoritarias y minoritarias podrían clasificarse correctamente.
Puntuación F = 2*TP/ (2*TP + FP +FN) = 2* Precisión *Recordar/ (Precisión *Recordar); Este es un equilibrio entre precisión y recuperación. Tenga en cuenta que la precisión y la recuperación están inversamente relacionadas, por lo que la puntuación F es una buena medida para lograr un equilibrio entre ambas.
Primero, entrenaremos el modelo de bosque aleatorio con algunas características predeterminadas. Tenga en cuenta que la optimización del modelo con selección de funciones o validación cruzada se ha mantenido fuera del alcance aquí por razones de simplicidad. Publique que entrenamos el modelo usando submuestreo, sobremuestreo y luego SMOTE. La siguiente tabla ilustra la matriz de confusión junto con las métricas de precisión, recuperación y exactitud para cada método.
a) Sin interpretación del resultado del muestreo: Sin ningún muestreo podemos capturar 76 transacciones fraudulentas. Aunque la precisión general es del 97%, el retiro es del 75%. Esto significa que hay bastantes transacciones fraudulentas que nuestro modelo no puede capturar.
A continuación se muestra el código que se puede utilizar:
# Training the model
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=10,criterion='entropy', random_state=0)
classifier.fit(x_train,y_train)# Predict Y on the test set
y_pred = classifier.predict(x_test)
# Obtain the results from the classification report and confusion matrix
from sklearn.metrics import classification_report, confusion_matrix
print('Classifcation report:\n', classification_report(y_test, y_pred))
conf_mat = confusion_matrix(y_true=y_test, y_pred=y_pred)
print('Confusion matrix:\n', conf_mat)
b) Interpretación de resultados de submuestreo: Con un submuestreo, aunque el modelo puede capturar 90 casos de fraude con una mejora significativa en la recuperación, la exactitud y la precisión disminuyen drásticamente. Esto se debe a que los falsos positivos han aumentado fenomenal y el modelo está penalizando muchas transacciones genuinas.
Fragmento de código de submuestreo:
# This is the pipeline module we need from imblearn
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline # Define which resampling method and which ML model to use in the pipeline
resampling = RandomUnderSampler()
model = RandomForestClassifier(n_estimators=10,criterion='entropy', random_state=0)
# Define the pipeline,and combine sampling method with the RF model
pipeline = Pipeline([('RandomUnderSampler', resampling), ('RF', model)])
pipeline.fit(x_train, y_train)
predicted = pipeline.predict(x_test)
# Obtain the results from the classification report and confusion matrix
print('Classifcation report:\n', classification_report(y_test, predicted))
conf_mat = confusion_matrix(y_true=y_test, y_pred=predicted)
print('Confusion matrix:\n', conf_mat)
do) Interpretación de resultados de sobremuestreo: El método de sobremuestreo tiene la mayor precisión y exactitud y la recuperación también es buena, del 81%. Podemos capturar 6 casos de fraude más y los falsos positivos también son bastante bajos. En general, desde la perspectiva de todos los parámetros, este modelo es un buen modelo.
Fragmento de código de sobremuestreo:
# This is the pipeline module we need from imblearn
from imblearn.over_sampling import RandomOverSampler# Define which resampling method and which ML model to use in the pipeline
resampling = RandomOverSampler()
model = RandomForestClassifier(n_estimators=10,criterion='entropy', random_state=0)
# Define the pipeline,and combine sampling method with the RF model
pipeline = Pipeline([('RandomOverSampler', resampling), ('RF', model)])
pipeline.fit(x_train, y_train)
predicted = pipeline.predict(x_test)
# Obtain the results from the classification report and confusion matrix
print('Classifcation report:\n', classification_report(y_test, predicted))
conf_mat = confusion_matrix(y_true=y_test, y_pred=predicted)
print('Confusion matrix:\n', conf_mat)
d) SMOTE: Smote mejora aún más el método de sobremuestreo con 3 fraudes más detectados en la red y, aunque los falsos positivos aumentan un poco, el retiro es bastante saludable con un 84%.
Fragmento de código SMOTE:
# This is the pipeline module we need from imblearnfrom imblearn.over_sampling import SMOTE
# Define which resampling method and which ML model to use in the pipeline
resampling = SMOTE(sampling_strategy='auto',random_state=0)
model = RandomForestClassifier(n_estimators=10,criterion='entropy', random_state=0)
# Define the pipeline, tell it to combine SMOTE with the RF model
pipeline = Pipeline([('SMOTE', resampling), ('RF', model)])
pipeline.fit(x_train, y_train)
predicted = pipeline.predict(x_test)
# Obtain the results from the classification report and confusion matrix
print('Classifcation report:\n', classification_report(y_test, predicted))
conf_mat = confusion_matrix(y_true=y_test, y_pred=predicted)
print('Confusion matrix:\n', conf_mat)
En nuestro caso de uso de detección de fraude, la métrica más importante es la recuperación. Esto se debe a que los bancos/instituciones financieras están más preocupados por detectar la mayoría de los casos de fraude porque el fraude es costoso y podrían perder mucho dinero por ello. Por lo tanto, incluso si hay pocos falsos positivos, es decir, marcar a clientes genuinos como fraude, puede que no sea demasiado engorroso porque esto sólo significa bloquear algunas transacciones. Sin embargo, bloquear demasiadas transacciones genuinas tampoco es una solución factible, por lo que, dependiendo del apetito de riesgo de la institución financiera, podemos optar por el método de sobremuestreo simple o SMOTE. También podemos ajustar los parámetros del modelo para mejorar aún más los resultados del modelo mediante la búsqueda en cuadrícula.
Para obtener detalles sobre el código, consulte este enlace en Github.
Referencias:
[1] Mythili Krishnan, Madhan K. Srinivasan, Detección de fraude con tarjetas de crédito: una exploración de diferentes métodos de muestreo para resolver el problema del desequilibrio de clases (2022), Puerta de la investigación
[1] Bartosz Krawczyk, Aprender de datos desequilibrados: desafíos abiertos y direcciones futuras (2016), Springer
[2] Nitesh V. Chawla, Kevin W. Bowyer, Lawrence O. Hall y W. Philip Kegelmeyer, SMOTE: Técnica de sobremuestreo de minorías sintéticas (2002), Revista de investigación en inteligencia artificial.
[3] Leo Breiman, Bosques aleatorios (2001), stat.berkeley.edu
[4] Jeremy Jordán, Aprender de datos desequilibrados (2018)