Comenzamos con la carga y filtración de datos, para este ejercicio eliminamos las variables de id, device y dirección ip pues no aportan información al modelo. Además, se creó una nueva variable utilizando la diferencia de la fecha de compra menos la fecha de inicio de sesión en horas y se transformaron las variables categóricas por variables dummies.
data <- read.csv("fraud_data.csv", header = T)
data$diff <- as.numeric(difftime(as.POSIXct(data$purchase_time), as.POSIXct(data$signup_time), units = 'hours'))
data <- data[,c(12,4,6,7,8,9,11)]
data <- dummy_cols(data)
data <- data[,c(-3,-4,-5)]
Finalmente, como en el ejercicio de clase transformamos las variables utilizando max y min.
max <- apply(data, 2, max)
min <- apply(data, 2, min)
D1 <- as.data.frame(scale(data, center = min, scale = max - min))
Es la variable class la que nos interesa y es importante notar que los datos del modelo están muy cargados cuando class = 0. Siendo cercano a una proporción 90/10.
table(D1$class)
##
## 0 1
## 136961 14151
Aplicamos el modelo siendo este de 1 capa con 14 nodos en ella, creando los set de train y test. Además, calculamos las predicciones.
# Random Sampling
samplesize <- .75 * nrow(D1)
set.seed(10)
index <- sample(seq_len(nrow(D1)), size = samplesize)
D1train <- D1[index,]
D1test <- D1[-index,]
# Neural Network
set.seed(5)
NN <- neuralnet(class ~., D1train, hidden = 14, linear.output = F, threshold = 0.1, lifesign = 'full')
# Predict
pred1 <- compute(NN, D1test[,c(1:3,5:14)])
El modelo tomó cerca de una hora para completarse, eso fue ya que el threshold fua alto, con un threshold más pequeño le tomaba al modelo más de 12 horas. Una vez obtenido el modelo se elaboró la matriz de confusión.
# Matriz de confusión
tab <- table(D1test$class, round(pred1$net.result))
(tab)
##
## 0 1
## 0 34136 133
## 1 1679 1830
Con lo anterior podemos calcular los estadÃsticos derivados de las matrices de confusión para tratar de explicar el modelo.Nuestro Positivo será 1 y nuestro negativo 0.
\(Sensitivity = \frac{TP}{TP+FN} = 0.5215\hspace{2mm}\) (proporción de positivos predichos de entre los verdaderos reales.)
\(Specificity = \frac{TN}{TN+FP} = 0.9961\hspace{2mm}\) (proporción de negativos predichos de entre los negativos reales.)
\(Accuracy = \frac{TP + TN}{TP+FP+TN+FN} = 0.9520\hspace{2mm}\)
El modelo tiene un accuracy muy bueno, sin embargo, falla a la hora de calcular los 1, esto en parte se debe a lo que se mencionó anteriormente de la proporción de 0’s y 1’s en los datos, también es posible que esto ocurra por lo grande que es el threshold.
La gráfica del modelo es la siguiente.