library(RSNNS) library(data.table) set.seed(1) #CARGA DE LOS DATOS trainSet <- data.table(read.csv("DatosTrain.csv",dec=",",sep=";",header = T)) validSet <- data.table(read.csv("DatosValid.csv",dec=",",sep=";",header = T)) testSet <- data.table(read.csv( "DatosTest.csv",dec=",",sep=";",header = T)) #SELECCION DE LA SALIDA target <- "cloudType" #TRANSFORMAR LA SALIDA DISCRETA A NUMÉRICA (Matriz con 3 columnas, una por etiqueta única, hay un 1 por cada fila en la columna que pertenece a la clase) trainTarget <- decodeClassLabels(unlist(trainSet[,target,with=F])) validTarget <- decodeClassLabels(unlist(validSet[,target,with=F])) testTarget <- decodeClassLabels(unlist(testSet[,target,with=F])) #SEPARAR ENTRADA DE LA SALIDA trainInput <- trainSet[,-target,with=F] validInput <- validSet[,-target,with=F] testInput <- testSet[,-target,with=F] #SELECCION DE LOS PARAMETROS topologia <- c(50) razonAprendizaje <- 0.01 ciclosMaximos <- 1000 #EJECUCION DEL APRENDIZAJE Y GENERACION DEL MODELO model <- mlp(x= trainInput, y= trainTarget, inputsTest= validInput, targetsTest= validInput, size= topologia, maxit=ciclosMaximos, learnFuncParams=c(razonAprendizaje), shufflePatterns = F ) #GRAFICO DE LA EVOLUCION DEL ERROR plotIterativeError(model) #GENERAR LAS PREDICCIONES trainPred <- predict(model,trainInput) validPred <- predict(model,validInput) testPred <- predict(model,testInput) #CALCULO DE LAS MATRICES DE CONFUSION trainCm <- confusionMatrix(as.matrix(trainTarget),trainPred) validCm <- confusionMatrix(as.matrix(validTarget),validPred) testCm <- confusionMatrix(as.matrix(testTarget), testPred) #METRICAS DE ERROR accuracy <- function (cm) sum(diag(cm))/sum(cm) macroAvg <- function (cm) mean(diag(cm)/rowSums(cm)) #VECTOR DE PRECISIONES accuracies <- c(TrainAccuracy= accuracy(trainCm), TrainMacroAvg= macroAvg(trainCm), ValidAccuracy= accuracy(validCm), ValidMacroAvg= macroAvg(validCm), TestAccuracy= accuracy(testCm) , TestMacroAvg= macroAvg(testCm)) #TABLA CON LOS ERRORES POR CICLO iterativeErrors <- data.table(RMSETrain= (model$IterativeFitError/nrow(trainSet)) ^(1/2), RMSEValid= (model$IterativeTestError/nrow(validSet))^(1/2)) #UTILIDADES PARA GENERAR LAS TABLAS DE SALIDAS targets <- unlist(unique(trainSet[,target,with=F])) padMatrix <- function(m) rbind(m,matrix(rep(NA,(nrow(trainSet)-nrow(m))*ncol(trainPred)),ncol=ncol(trainPred))) predictClass <- function(predMat,targets) as.character(unlist(data.table(predMat)[,targets[apply(.SD,1,which.max)]])) #SALIDA DE LA RED EN BRUTO, SIN ELEGIR LA CLASE rawOutputs <- data.table(train= trainPred, valid= padMatrix(validPred), test= padMatrix(testPred)) names <- data.table(expand.grid(c("train","valid","test"),unlist(unique(trainSet[,target,with=F])))) colnames(rawOutputs) <- apply(rbind(names[Var1=="train"],names[Var1=="valid"],names[Var1=="test"]),1,paste,collapse=".") #SALIDA DE LA RED ETIQUETADA (Eleccion del maximo por fila y asignar etiqueta) outputs <- data.table(train= predictClass(trainPred,targets), valid= c(predictClass(validPred,targets),rep(NA,nrow(trainSet)-nrow(validSet))), test= c(predictClass(testPred,targets),rep(NA,nrow(trainSet)-nrow(testSet)))) colnames(outputs) <- c("train","validation","test") #GUARDADO DE RESULTADOS saveRDS(model,"nnet.rds") write.csv2(accuracies,"finalAccuracies.csv") write.csv2(iterativeErrors,"iterativeErrors.csv") write.csv2(outputs,"netOutputs.csv") write.csv2(rawOutputs,"netRawOutputs.csv") write.csv2(trainCm,"trainCm.csv") write.csv2(validCm,"validCm.csv") write.csv2(testCm,"testCm.csv")