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.

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.