Función modelos() | Ejemplo sin parámetros | Ejemplo con parámetros
La función modelos(), ajusta 10 modelos diferentes:
  1. Red neuronal: nnet
  2. C5.0
  3. Máquinas de vectores de soporte: svm
  4. Bootstrapped Aggregation: bagging
  5. Random Forest: randomForest
  6. Adaptative Boosting: boosting
  7. Árboles de clasificación: rpart
  8. Clasificador bayesiano ingenuo: naiveBayes
  9. Análisis disciminane lineal: lda
  10. Análisis disciminane cuadrático: qda

Presenta como resultado por pantalla las matrices de confusión y el porcentaje de casos correctamente clasificados. Devuelve como valor invisible una lista con todos los modelos ajustados. Como datos admite data frames de variables explicativas (independientes) cuantitativas o cualitativas y como variable respuesta (dependiente) una cualitativa.
Los parámetros son:
  • datos: data frame con las variables. Valor por defeco: iris
  • dep: valor numérico que indica el número de la variable respuesta (dependiente). Valor por defecto 5 (variable Species de los datos iris)
  • p: es la proporción usada para el entrenamiento (el resto se usa para probarlo). Valor por defecto p = 0.75 (75% de los datos usados para entrenamiento)
  • ad: 1 si se realizarán los análisis discriminantes lineal y cuadrático, 0 si se omiten. Valor por defecto ad = 1

Si no se indica ningún data frame usa los datos de iris para clasificar las especies que contiene.

Esta función requiere las librerías:
  • caret
  • nnet
  • C50
  • e1071
  • ipred
  • randomForest
  • adabag
  • rpart
  • MASS

Función modelos()

modelos <- function(datos = iris, dep = 5, p = 0.75, ad=1) {
 
  # Creación del subgrupo de entrenamiento y de prueba
  library(caret)
  datos.indices <- createDataPartition(datos[,dep],p = p, list=F)
  datos.train <- datos[datos.indices,]
 
  if(p != 1) {
    datos.test <- datos[-datos.indices,]
  } else {
    datos.test <- datos.train
  }
  # Fórmula
  f <- as.formula(paste(names(datos[dep]),"~."))
 
 
 
  # Redes neuronales
  library(nnet)
  parametros <- train(f, data=datos.train, method="nnet", trace=F)
  size <- parametros$bestTune$size
  decay <- parametros$bestTune$decay
  modelo.nnet <- nnet(f,trace=F, data=datos.train, size=size, decay=decay)
  pred.nnet <- predict(modelo.nnet, datos.test, type="class")
  # Matriz de confusión
  mc <- table(pred.nnet,datos.test[,dep], dnn = c("Asignado","Real"))
  # Ordenar tabla alfabéticamente
  # Por algún motivo a veces sale desordenada
  mc <- mc[order(rownames(mc)),order(colnames(mc))]
  cat("** Red neuronal: nnet\n")
  print(mc)
  # Aciertos en %
  aciertos1 <- sum(diag(mc)) / sum(mc) * 100
  cat("\nCorrectamente clasificados:",round(aciertos1,2),"%\n\n\n")
 
 
 
  # C5.0
  library(C50)
  modelo.c50 <- C5.0(f, data=datos.train)
  pred <- predict(modelo.c50, datos.test, type="class")
  # Matriz de confusión
  mc <- table(pred,datos.test[,dep], dnn = c("Asignado","Real"))
  # Ordenar tabla alfabéticamente
  # Por algún motivo a veces sale desordenada
  mc <- mc[order(rownames(mc)),order(colnames(mc))]
  cat("** Árbol de clasificación C5.0\n")
  print(mc)
  # Aciertos en %
  aciertos2 <- sum(diag(mc)) / sum(mc) * 100
  cat("\nCorrectamente clasificados:",round(aciertos2,2),"%\n\n\n")
 
 
 
  # SVM
  library(e1071)
  modelo.svm <- svm(f, data=datos.train)
  pred <- predict(modelo.svm, datos.test, type="class")
  # Matriz de confusión
  mc <- table(pred,datos.test[,dep], dnn = c("Asignado","Real"))
  # Ordenar tabla alfabéticamente
  # Por algún motivo a veces sale desordenada
  mc <- mc[order(rownames(mc)),order(colnames(mc))]
  cat("** SVM\n")
  print(mc)
  # Aciertos en %
  aciertos3 <- sum(diag(mc)) / sum(mc) * 100
  cat("\nCorrectamente clasificados:",round(aciertos3,2),"%\n\n\n")
 
 
 
  # Bootstrapped Aggregation: Bagging
  library(ipred)
  modelo.ba <- ipred::bagging(f, data=datos.train)
  pred <- predict(modelo.ba, datos.test, type="class")
  # Matriz de confusión
  mc <- table(pred,datos.test[,dep], dnn = c("Asignado","Real"))
  # Ordenar tabla alfabéticamente
  # Por algún motivo a veces sale desordenada
  mc <- mc[order(rownames(mc)),order(colnames(mc))]
  cat("** Bootstrapped Aggregation: bagging\n")
  print(mc)
  # Aciertos en %
  aciertos4 <- sum(diag(mc)) / sum(mc) * 100
  cat("\nCorrectamente clasificados:",round(aciertos4,2),"%\n\n\n")
 
 
 
  # Random Forest
  library(randomForest)
  modelo.rf <- randomForest(f, data=datos.train)
  pred <- predict(modelo.rf, datos.test, type="class")
  # Matriz de confusión
  mc <- table(pred, datos.test[,dep], dnn = c("Asignado","Real"))
  # Ordenar tabla alfabéticamente
  # Por algún motivo a veces sale desordenada
  mc <- mc[order(rownames(mc)),order(colnames(mc))]
  cat("Random Forest\n")
  print(mc)
  # Aciertos en %
  aciertos5 <- sum(diag(mc)) / sum(mc) * 100
  cat("\nCorrectamente clasificados:",round(aciertos5,2),"%\n\n\n")
 
 
 
  # AdaBoost - Adaptative Boosting
  library(adabag)
  modelo.ad <- boosting(f, data=datos.train)
  pred <- predict(modelo.ad, datos.test, type="class")
  # Matriz de confusión
  mc <- table(pred$class, datos.test[,dep], dnn = c("Asignado","Real"))
  # Ordenar tabla alfabéticamente
  # Por algún motivo a veces sale desordenada
  mc <- mc[order(rownames(mc)),order(colnames(mc))]
  cat("** Adaptative Boosting: boosting\n")
  print(mc)
  # Aciertos en %
  aciertos6 <- sum(diag(mc)) / sum(mc) * 100
  cat("\nCorrectamente clasificados:",round(aciertos6,2),"%\n\n\n")
 
 
 
  # Árboles de clasificación: rpart
  library(rpart)
  modelo.rp <- rpart(f, data=datos.train)
  pred <- predict(modelo.rp, datos.test, type="class")
  # Matriz de confusión
  mc <- table(pred, datos.test[,dep], dnn = c("Asignado","Real"))
  # Ordenar tabla alfabéticamente
  # Por algún motivo a veces sale desordenada
  mc <- mc[order(rownames(mc)),order(colnames(mc))]
  cat("** Árboles de clasificación: rpart\n")
  print(mc)
  # Aciertos en %
  aciertos7 <- sum(diag(mc)) / sum(mc) * 100
  cat("\nCorrectamente clasificados:",round(aciertos7,2),"%\n\n\n")
 
 
  # Clasificador bayesiano ingenuo (Naive Bayes classifier): naiveBayes
 
  modelo.nb <- naiveBayes(f, data=datos.train)
  pred <- predict(modelo.nb, datos.test, type="class")
  # Matriz de confusión
  mc <- table(pred, datos.test[,dep], dnn = c("Asignado","Real"))
  # Ordenar tabla alfabéticamente
  # Por algún motivo a veces sale desordenada
  mc <- mc[order(rownames(mc)),order(colnames(mc))]
  cat("** Clasificador bayesiano ingenuo: naiveBayes\n")
  print(mc)
  # Aciertos en %
  aciertos10 <- sum(diag(mc)) / sum(mc) * 100
  cat("\nCorrectamente clasificados:",round(aciertos10,2),"%\n\n\n")
 
  if(ad != 0) {
    library(MASS)
    # Análisis disciminane lineal
    modelo.lda <- rpart(f, data=datos.train)
    pred <- predict(modelo.lda, datos.test, type="class")
    # Matriz de confusión
    mc <- table(pred, datos.test[,dep], dnn = c("Asignado","Real"))
    # Ordenar tabla alfabéticamente
    # Por algún motivo a veces sale desordenada
    mc <- mc[order(rownames(mc)),order(colnames(mc))]
    cat("** Análisis disciminane lineal: lda\n")
    print(mc)
    # Aciertos en %
    aciertos8 <- sum(diag(mc)) / sum(mc) * 100
    cat("\nCorrectamente clasificados:",round(aciertos8,2),"%\n\n\n")
 
 
 
    # Análisis disciminane cuadrático
    modelo.qda <- rpart(f, data=datos.train)
    pred <- predict(modelo.qda, datos.test, type="class")
    # Matriz de confusión
    mc <- table(pred, datos.test[,dep], dnn = c("Asignado","Real"))
    # Ordenar tabla alfabéticamente
    # Por algún motivo a veces sale desordenada
    mc <- mc[order(rownames(mc)),order(colnames(mc))]
    cat("** Análisis disciminane cuadrático: qda\n")
    print(mc)
    # Aciertos en %
    aciertos9 <- sum(diag(mc)) / sum(mc) * 100
    cat("\nCorrectamente clasificados:",round(aciertos9,2),"%\n\n\n")
  }
 
  resumen <- c(aciertos1,aciertos2,aciertos3,aciertos4,aciertos5,aciertos6,aciertos7,aciertos10)
  names(resumen) <- c("nnet","C5.0","svm","bagging","randomForest","boosting","rpart","naiveBayes")
  mod.list <- list(nnet=modelo.nnet, C5.0=modelo.c50, svm=modelo.svm, bagging=modelo.ba, randomForest=modelo.rf, boosting=modelo.ad, rpart=modelo.rp,naiveBayes=modelo.nb)
  if(ad != 0) {
    resumen <- c(resumen,aciertos8,aciertos9)
    names(resumen) <- c(names(resumen[1:8]),"lda","qda")
    mod.list <- list(nnet=modelo.nnet, C5.0=modelo.c50, svm=modelo.svm, bagging=modelo.ba, randomForest=modelo.rf, boosting=modelo.ad, rpart=modelo.rp, naiveBayes=modelo.nb, lda=modelo.lda, qda=modelo.qda)
  }
  resumen <- sort(resumen,decreasing=T)
  resumen <- as.matrix(resumen,nc=1)
  colnames(resumen) <- "% correctos"
  cat("Resumen:\n")
 
  print(resumen)
 
 
  return(invisible(mod.list))
}


Ejemplo sin parámetros


> modelos()
Loading required package: lattice
Loading required package: ggplot2
** Red neuronal: nnet
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         11         0
  virginica       0          1        12
 
Correctamente clasificados: 97.22 %
 
 
** Árbol de clasificación C5.0
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         10         0
  virginica       0          2        12
 
Correctamente clasificados: 94.44 %
 
 
** SVM
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         11         0
  virginica       0          1        12
 
Correctamente clasificados: 97.22 %
 
 
** Bootstrapped Aggregation: bagging
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         11         0
  virginica       0          1        12
 
Correctamente clasificados: 97.22 %
 
 
randomForest 4.6-10
Type rfNews() to see new features/changes/bug fixes.
Random Forest
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         11         0
  virginica       0          1        12
 
Correctamente clasificados: 97.22 %
 
 
Loading required package: rpart
Loading required package: mlbench
 
Attaching package: ‘adabag’
 
The following object is masked from ‘package:ipred’:
 
    bagging
 
** Adaptative Boosting: boosting
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         11         0
  virginica       0          1        12
 
Correctamente clasificados: 97.22 %
 
 
** Árboles de clasificación: rpart
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         10         0
  virginica       0          2        12
 
Correctamente clasificados: 94.44 %
 
 
** Clasificador bayesiano ingenuo: naiveBayes
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         12         0
  virginica       0          0        12
 
Correctamente clasificados: 100 %
 
 
** Análisis disciminane lineal: lda
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         10         0
  virginica       0          2        12
 
Correctamente clasificados: 94.44 %
 
 
** Análisis disciminane cuadrático: qda
            Real
Asignado     setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         10         0
  virginica       0          2        12
 
Correctamente clasificados: 94.44 %
 
 
Resumen:
             % correctos
naiveBayes     100.00000
nnet            97.22222
svm             97.22222
bagging         97.22222
randomForest    97.22222
boosting        97.22222
C5.0            94.44444
rpart           94.44444
lda             94.44444
qda             94.44444



Ejemplo con parámetros

Con estos datos se pueden tardar varios minutos en finalizar el programa

> library(C50)
> data(churn)
> modelos(churnTrain,20)
 
** Red neuronal: nnet
        Real
Asignado  no yes
     no  711 120
     yes   1   0
 
Correctamente clasificados: 85.46 %
 
 
** Árbol de clasificación C5.0
        Real
Asignado  no yes
     no  698  32
     yes  14  88
 
Correctamente clasificados: 94.47 %
 
 
** SVM
        Real
Asignado  no yes
     no  710  93
     yes   2  27
 
Correctamente clasificados: 88.58 %
 
 
** Bootstrapped Aggregation: bagging
        Real
Asignado  no yes
     no  698  35
     yes  14  85
 
Correctamente clasificados: 94.11 %
 
 
randomForest 4.6-10
Type rfNews() to see new features/changes/bug fixes.
Random Forest
        Real
Asignado  no yes
     no  676  15
     yes  36 105
 
Correctamente clasificados: 93.87 %
 
 
Loading required package: rpart
Loading required package: mlbench
 
Attaching package: ‘adabag’
 
The following object is masked from ‘package:ipred’:
 
    bagging
 
** Adaptative Boosting: boosting
        Real
Asignado  no yes
     no  697  37
     yes  15  83
 
Correctamente clasificados: 93.75 %
 
 
** Árboles de clasificación: rpart
        Real
Asignado  no yes
     no  701  40
     yes  11  80
 
Correctamente clasificados: 93.87 %
 
 
** Clasificador bayesiano ingenuo: naiveBayes
        Real
Asignado  no yes
     no  674  58
     yes  38  62
 
Correctamente clasificados: 88.46 %
 
 
** Análisis disciminane lineal: lda
        Real
Asignado  no yes
     no  701  40
     yes  11  80
 
Correctamente clasificados: 93.87 %
 
 
** Análisis disciminane cuadrático: qda
        Real
Asignado  no yes
     no  701  40
     yes  11  80
 
Correctamente clasificados: 93.87 %
 
 
Resumen:
             % correctos
C5.0            94.47115
bagging         94.11058
randomForest    93.87019
rpart           93.87019
lda             93.87019
qda             93.87019
boosting        93.75000
svm             88.58173
naiveBayes      88.46154
nnet            85.45673