Después de lo que comentado en clase, parece que más allá de la extensión o las faltas de ortografía en el correo, el factor más determinante para identificar a un correo como spam es el contenido, así que se hizo uso de una lista de spam trigger words que, como su nombre lo dice, son palabras que suelen estar presentes en los correos spam. Usando estás palabras se transformó la variable “Text” a la variable “Count” que cuenta el número de veces que aparece una de estas palabras en el correo. Finalmente los datos que se usaron son los de D1. A continuación se muestra el procedimiento.

data <- read.csv("fraud_email.csv", header = T)
data$Text <- str_to_lower(data$Text)
data$Class <- factor(data$Class, levels = c(0,1))

triggers <- c('exclusive', 'price', 'click', 'http', 'delete', 'expire', 'limited', 'only', 'free', 'million',
              'billion', 'life', 'urgent', 'opportunity', 'winner', 'won', 'prize' )

count <- c()
for(i in 1:length(data$Text)){
  count[i] <- sum(str_detect(data$Text[i], triggers))
}

D1 <- cbind(count, data[2])

Con estos datos el modelo fue ajustado y se realizaron las predicciones como en las tareas anteriores. El paquete e1071 fue utilizado para el cálculo del modelo SVM. Además se probó con kernel polinomial, lineal y sigmoide, el lineal y sigmoide fueron los de mejor ajuste y por practicidad se presenta el modelo lineal.

# Random Sampling

samplesize <- .75 * nrow(D1)
set.seed(10)
index <- sample(seq_len(nrow(D1)), size = samplesize)

D1train <- D1[index,]
D1test <- D1[-index,]

# SVM

set.seed(5)
model <- svm(Class ~., D1train, kernel = 'linear') 

# Predict 

pred <- predict(model, newdata = D1test[-2])

Con las predicciones se obtuvo la siguiente matriz de confusión

##    pred
##        0    1
##   0 1622   68
##   1  428  865

Con lo anterior los estadísticos derivados de las matrices de confusión son calculados siendo 1 positivo y 0 negativo.

Podemos ver que le modelo ajusta bastante bien y es preciso en ambos casos de predicción tanto para negativos como positivos.