Este relatório tem como objetivo inserir o conceito de Rede Neural Artificial. Para tal, usaremos o famigerado dataset iris.
Primeiro, vamos estimar outros modelos e depois compara-los com a RN.
suppressMessages(suppressWarnings(library(tidyverse)))
library(keras)
# Funcao para calcular a acuracia
acc_confusion <- function(m,d){
diagonal <- sum(diag(table(predict(m,d),d$Species)))
den <- sum(table(predict(m,d),d$Species))
return(diagonal/den)
}
# Criar novas features/variaveis explicativas
irisg <- iris %>%
mutate(x1 = Sepal.Length*Sepal.Width,
x2 = Sepal.Length/Sepal.Width,
x3 = Petal.Width*Sepal.Width,
x4 = Petal.Width/Sepal.Width,
x5 = Sepal.Length + Sepal.Width,
x6 = Petal.Width + Sepal.Width)Primeiro vamos testar a técnica de SVM (suport vector machines) sem fazer nenhum tipo de grid search, somente mudando o kernel.
library(e1071)
set.seed(10092019)
vec_train <- sample(1:nrow(irisg),size = nrow(irisg)*0.75,replace = FALSE)
vec_test <- setdiff(1:nrow(irisg),vec_train)
iris_train <- irisg[vec_train,]
iris_test <- irisg[vec_test,]
# Kernel linear sem grid search
mod_svm1 <- e1071::svm(Species~.,data = iris_train,kernel = "linear")
mod_svm1 %>%
acc_confusion(iris_test) ## [1] 0.9473684
# Kernel polinomial sem grid search
mod_svm2 <- e1071::svm(Species~.,data = iris_train,kernel = "polynomial")
mod_svm2 %>%
acc_confusion(iris_test) ## [1] 0.8421053
# Kernel radial sem grid search
mod_svm3 <- e1071::svm(Species~.,data = iris_train,kernel = "radial")
mod_svm3 %>%
acc_confusion(iris_test) ## [1] 0.9473684
# Kernel sigmoid sem grid search
mod_svm4 <- e1071::svm(Species~.,data = iris_train,kernel = "sigmoid")
mod_svm4 %>%
acc_confusion(iris_test) # The best## [1] 0.9736842
O SVM alcançou 97,37% de acurácia com kernel utilizando a função sigmoid. Vamos ver a RN.
Train_Features <- data.matrix(iris_train[,-5])
Train_Labels <- iris_train[,5]
Test_Features <- iris_test[,-5]
Test_Labels <- iris_test[,5]
Train_Labels <- to_categorical(as.numeric(Train_Labels))[, c(-1)]
Test_Labels <- to_categorical(as.numeric(Test_Labels))[, c(-1)]
Train_Features <- as.matrix(apply(Train_Features, 2, function(x) (x-min(x))/(max(x) - min(x))))
Test_Features <- as.matrix(apply(Test_Features, 2, function(x) (x-min(x))/(max(x) - min(x))))
# Usando RNN
model <- keras_model_sequential()
model %>%
layer_dense(units = 200,activation = "relu",
input_shape = 10) %>%
layer_dense(units = 100,
activation = "linear",
input_shape = 5) %>%
layer_dense(units = 3, activation = "softmax")
model %>% compile(loss = "categorical_crossentropy",
optimizer = optimizer_adagrad(),
metrics = c('accuracy')
)
history <- model %>% fit(Train_Features, Train_Labels,
validation_split = 0.15,
epochs = 50, batch_size = 5,
shuffle = TRUE)
model %>% evaluate(Test_Features,Test_Labels)## $loss
## [1] 0.2013577
##
## $acc
## [1] 0.8947368
Veja que a RN não superou o SVM =/. As RN não se saem bem em todas as aplicações.
SVM wins !!!