Este conjunto de datos contiene transacciones realizadas con tarjetas de crédito en septiembre de 2013 por titulares europeos. Este conjunto de datos prescribe transacciones que ocurrieron en dos días, donde tenemos 492 fraudes de 284.807 transacciones.
Contiene sólo variables numéricas de entrada que son el resultado de una transformación ACP (Análisis de componentes principales). Las características V1, V2, … V28 son los componentes principales, las únicas características que no han sido transformadas con ACP son ‘Tiempo’ y ‘Cantidad’. La característica ‘Tiempo’ contiene los segundos transcurridos entre cada transacción y la primera transacción en el conjunto de datos. La característica ‘Clase’ es la variable de respuesta y toma el valor 1 en caso de fraude y 0 en caso contrario.
library(readr)
library(dplyr)
library(ggplot2)
library(caret)
fraud <- read_csv(file = "creditcard.csv", progress = FALSE)
fraud <- fraud %>%
filter(complete.cases(.)) %>%
mutate(Class = factor(Class))
glimpse(fraud)
Observations: 284,806
Variables: 31
$ Time <int> 0, 0, 1, 1, 2, 2, 4, 7, 7, 9, 10, 10, 10, 11, 12, 12, ...
$ V1 <dbl> -1.3598071, 1.1918571, -1.3583541, -0.9662717, -1.1582...
$ V2 <dbl> -0.07278117, 0.26615071, -1.34016307, -0.18522601, 0.8...
$ V3 <dbl> 2.53634674, 0.16648011, 1.77320934, 1.79299334, 1.5487...
$ V4 <dbl> 1.37815522, 0.44815408, 0.37977959, -0.86329128, 0.403...
$ V5 <dbl> -0.33832077, 0.06001765, -0.50319813, -0.01030888, -0....
$ V6 <dbl> 0.46238778, -0.08236081, 1.80049938, 1.24720317, 0.095...
$ V7 <dbl> 0.239598554, -0.078802983, 0.791460956, 0.237608940, 0...
$ V8 <dbl> 0.098697901, 0.085101655, 0.247675787, 0.377435875, -0...
$ V9 <dbl> 0.3637870, -0.2554251, -1.5146543, -1.3870241, 0.81773...
$ V10 <dbl> 0.09079417, -0.16697441, 0.20764287, -0.05495192, 0.75...
$ V11 <dbl> -0.5515995, 1.6127267, 0.6245015, -0.2264873, -0.82284...
$ V12 <dbl> -0.61780086, 1.06523531, 0.06608369, 0.17822823, 0.538...
$ V13 <dbl> -0.99138985, 0.48909502, 0.71729273, 0.50775687, 1.345...
$ V14 <dbl> -0.31116935, -0.14377230, -0.16594592, -0.28792375, -1...
$ V15 <dbl> 1.468176972, 0.635558093, 2.345864949, -0.631418118, 0...
$ V16 <dbl> -0.47040053, 0.46391704, -2.89008319, -1.05964725, -0....
$ V17 <dbl> 0.207971242, -0.114804663, 1.109969379, -0.684092786, ...
$ V18 <dbl> 0.02579058, -0.18336127, -0.12135931, 1.96577500, -0.0...
$ V19 <dbl> 0.40399296, -0.14578304, -2.26185710, -1.23262197, 0.8...
$ V20 <dbl> 0.25141210, -0.06908314, 0.52497973, -0.20803778, 0.40...
$ V21 <dbl> -0.018306778, -0.225775248, 0.247998153, -0.108300452,...
$ V22 <dbl> 0.277837576, -0.638671953, 0.771679402, 0.005273597, 0...
$ V23 <dbl> -0.110473910, 0.101288021, 0.909412262, -0.190320519, ...
$ V24 <dbl> 0.06692807, -0.33984648, -0.68928096, -1.17557533, 0.1...
$ V25 <dbl> 0.12853936, 0.16717040, -0.32764183, 0.64737603, -0.20...
$ V26 <dbl> -0.18911484, 0.12589453, -0.13909657, -0.22192884, 0.5...
$ V27 <dbl> 0.133558377, -0.008983099, -0.055352794, 0.062722849, ...
$ V28 <dbl> -0.021053053, 0.014724169, -0.059751841, 0.061457629, ...
$ Amount <dbl> 149.62, 2.69, 378.66, 123.50, 69.99, 3.67, 4.99, 40.80...
$ Class <fctr> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
A continuación se ajustan y comparan tres modelos de Machine Learning para la clasificación de eventos de fraude sobre los datos ejemplo, se escogen los modelos de:
Regresión Logística: Modelo que ayuda a la clasificación y permite interpretar sus coeficientes lo que ayuda a determinar las relaciones entre las variables explicativas y la respuesta (Hacer inferencia).
Árboles de decisión: Es un modelo no parametrico que permite determinar reglas de asociación entre las variables del modelo, ademas de ser muy bueno para las predicciones
Bosques aleatorios: Predicen muy bien, pero no permiten la interpretación del modelo, utilizan remuestreo (Son computacionalmente exhaustivos, por eso son buenos con la predicción)
A continuación se configura el estudio de predicción mediante el entrenamiento del modelo utilizando la librería de ML caret.
Primero se crea la data de entrenamiento y prueba para el modelo, luego se realizan los procesos de validación cruzada para reducir los problemas de sobre ajuste (Para que el modelo no se acostumbre siempre a los datos donde se entreno y funcione bien cuando lleguen nuevas observaciones), por ultimo se ajusta el modelo y se calculan las predicciones en conjunto con la matriz de confusión y el AUC.
library(ROCR)
set.seed(8585)
inTrain <- createDataPartition(y = fraud$Class,
p = 0.75, list = FALSE)
training <- fraud[inTrain,]
testing <- fraud[-inTrain,]
glm_model <- train(Class ~ ., training, method = "glm",
trControl = trainControl(
method = "cv", number = 10,
verboseIter = FALSE
)
)
pred_class <- predict(glm_model, testing)
confusionMatrix(pred_class, testing$Class)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 71069 45
1 9 78
Accuracy : 0.9992
95% CI : (0.999, 0.9994)
No Information Rate : 0.9983
P-Value [Acc > NIR] : 2.018e-12
Kappa : 0.7425
Mcnemar's Test P-Value : 1.908e-06
Sensitivity : 0.9999
Specificity : 0.6341
Pos Pred Value : 0.9994
Neg Pred Value : 0.8966
Prevalence : 0.9983
Detection Rate : 0.9981
Detection Prevalence : 0.9988
Balanced Accuracy : 0.8170
'Positive' Class : 0
Como se puede observar en la matriz de confusión la precisión del modelo se encuentra en el 99% un buen indicador de la calidad del modelo.
#### Calculos AUC
####
pred_probs <- predict(glm_model, testing, type = "prob")
probs <- pred_probs[, 2]
auc_glm <- prediction(probs, testing$Class)
### Valor del área bajo la curva
###
perf_auc <- performance(auc_glm, "auc")
perf_auc@y.values[[1]]
[1] 0.9662719
perf <- performance(auc_glm, "tpr", "fpr")
plot(perf)
En este caso observamos que un área bajo la curva para este modelo queda en 0.9662719 lo que se tendrá en cuenta para escoger del modelo a utilizar.
Primero se crea la data de entrenamiento y prueba para el modelo, luego se realizan los procesos de validación cruzada para reducir los problemas de sobre ajuste (Para que el modelo no se acostumbre siempre a los datos donde se entreno y funcione bien cuando lleguen nuevas observaciones), por ultimo se ajusta el modelo y se calculan las predicciones en conjunto con la matriz de confusión y el AUC.
library(ROCR)
library(rpart)
library(rattle)
library(rpart.plot)
library(RColorBrewer)
set.seed(8585)
inTrain <- createDataPartition(y = fraud$Class,
p = 0.75, list = FALSE)
training <- fraud[inTrain,]
testing <- fraud[-inTrain,]
tree_model <- train(Class ~ ., training, method = "rpart",
trControl = trainControl(
method = "cv", number = 10,
verboseIter = FALSE
)
)
pred_class <- predict(tree_model, testing)
confusionMatrix(pred_class, testing$Class)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 71064 35
1 14 88
Accuracy : 0.9993
95% CI : (0.9991, 0.9995)
No Information Rate : 0.9983
P-Value [Acc > NIR] : 2.53e-14
Kappa : 0.7819
Mcnemar's Test P-Value : 0.004275
Sensitivity : 0.9998
Specificity : 0.7154
Pos Pred Value : 0.9995
Neg Pred Value : 0.8627
Prevalence : 0.9983
Detection Rate : 0.9981
Detection Prevalence : 0.9986
Balanced Accuracy : 0.8576
'Positive' Class : 0
Como se puede observar en la matriz de confusión la precisión del modelo se encuentra en el 99% un buen indicador de la calidad del modelo. A continuación se muestra el gráfico para las principales reglas mostradas por el algoritmo.
fancyRpartPlot(tree_model$finalModel)
#### Calculos AUC
####
pred_probs <- predict(tree_model, testing, type = "prob")
probs <- pred_probs[, 2]
auc_tree <- prediction(probs, testing$Class)
### Valor del área bajo la curva
###
perf_auc <- performance(auc_tree, "auc")
perf_auc@y.values[[1]]
[1] 0.8576071
perf <- performance(auc_tree, "tpr", "fpr")
plot(perf)
En este caso observamos que un área bajo la curva para este modelo queda en 0.8576071 lo que se tendrá en cuenta para escoger del modelo a utilizar.
Para observar de una forma más adecuada el desempeño de los modelos se propone una comparación mediante el criterio AUC, para determinar el modelo que da los mejores resultados
model_list <- list(item1 = glm_model, item2 = tree_model)
resamples <- resamples(model_list)
summary(resamples)
Call:
summary.resamples(object = resamples)
Models: item1, item2
Number of resamples: 10
Accuracy
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
item1 0.9989233 0.9991573 0.9992041 0.9991807 0.9992509 0.9992978 0
item2 0.9989233 0.9991222 0.9991573 0.9991714 0.9992510 0.9992978 0
Kappa
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
item1 0.5960002 0.7113878 0.7324638 0.7191762 0.7486942 0.7688859 0
item2 0.6561831 0.7198024 0.7456050 0.7415539 0.7757716 0.7834086 0
Los modelos propuestos aquí son de los más utilizados para el ajuste de funciones de clasificación y predicción no obstante al poseer una mejor infraestructura TI, se sugiere el uso de otros modelos que igual realizan la misma tarea de una manera más precisa como los modelos (random forest, bagging o boosting), sin embargo es de notar que ambos modelos propuestos son muy buenos en términos de precisión, pero la regresión logística da mayor área bajo la curva por lo que para este caso en especifico se sugiere su uso en producción. Por ultimo al escoger este modelo se recomienda entrar a detallar las importancia de variables y otras técnicas de reducción de sesgo y varianza para la afinación del modelo.