SML - Clasificación

Diferencias entre SVN y KNN

Investigar un poco… hay artículos en internet que lo explican

El modelo entrenado con una muestra de entrenamiento se pone a prueba con una muestra distinta de la misma población (muestra de prueba).

En ocasiones se segmenta la muestra original (una parte se utiliza para entrenar el modelo y la otra para comprobar su bondad).

flowchart LR
     original["Muestra o<br>población"] ==> train
     original --> test
     train["Datos de<br>entrenamiento"] ==> m(("Modelo"))
     test("Datos de prueba") -.-> m -.-> testc("Datos de prueba<br>categorizados")
     test ---> eval(("Evaluación"))
     testc -.-> eval

Máquinas de vectores de soporte (SVM)

Respecto a KNN

  • útil en espacios multi-dimensionales
  • útil cuando hay más dimensiones que casos
  • evitar overfitting
  • más sensible al ruido
  • computacionalmente complejo

SVM es útil en espacios multi-dimensionales o donde el número de dimensiones sea mayor que el de casos.

Generar training y testing data

caTools::sample.split() recibe un vector factorizado y un porcentaje. Devuelve dos grupos donde las proporciones del factor están preservadas (sirve para crear grupos de entrenamiento y comprobación).

split <- caTools::sample.split(iris$Species, SplitRatio = 0.7)
data_train <- iris[split, ]
data_test <- iris[!split, ]

Modelado

El paquete e1071 contiene una función para modelar SVM

svm_iris <- e1071::svm(Species ~ ., data = data_train)

Se realiza las predicciones

pred_iris <- predict(svm_iris, newdata = data_test)
pred_iris
         9         13         14         17         20         21         30 
    setosa     setosa     setosa     setosa     setosa     setosa     setosa 
        31         37         39         41         42         47         48 
    setosa     setosa     setosa     setosa     setosa     setosa     setosa 
        50         54         61         68         71         72         73 
    setosa versicolor versicolor versicolor versicolor versicolor versicolor 
        74         75         90         91         93         95         96 
versicolor versicolor versicolor versicolor versicolor versicolor versicolor 
        98         99        102        107        122        125        126 
versicolor versicolor  virginica versicolor  virginica  virginica  virginica 
       129        135        138        139        141        143        144 
 virginica  virginica  virginica versicolor  virginica  virginica  virginica 
       145        149        150 
 virginica  virginica  virginica 
Levels: setosa versicolor virginica

Evaluación del modelo

caret

El paquete caret (Classification And REgression Training) contiene muchas herramientas útiles en SML

Después comprobamos las predicciones con las etiquetas contenidas en los datos de prueba:

conf_matr_iris <- caret::confusionMatrix(pred_iris, data_test$Species)
conf_matr_iris
Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         15         2
  virginica       0          0        13

Overall Statistics
                                          
               Accuracy : 0.9556          
                 95% CI : (0.8485, 0.9946)
    No Information Rate : 0.3333          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.9333          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 1.0000            1.0000           0.8667
Specificity                 1.0000            0.9333           1.0000
Pos Pred Value              1.0000            0.8824           1.0000
Neg Pred Value              1.0000            1.0000           0.9375
Prevalence                  0.3333            0.3333           0.3333
Detection Rate              0.3333            0.3333           0.2889
Detection Prevalence        0.3333            0.3778           0.2889
Balanced Accuracy           1.0000            0.9667           0.9333

k-nearest neighbours (KNN)

Respecto a SVM:

  • el modelo se construye durante la fase de predicción
  • menos sensible al ruido
  • sensible a outliers
  • peor rendimiento en espacios multidimensionales

La clasifiación se realiza midiendo la distancia entre observaciones no categorizadas e infieriendo sus clases por sus vecinos más cercanos

La función knn entrena el modelo y hace las predicciones en un mismo tiempo

knn(train,    # el modelo de entrenamiento
    test,     # los datos de prueba
    cl,       # las etiquetas de 'train'
    k = 1)    # el número de 'vecinos' que se consideran
# Selecciona 50 filas aleatorias de 'iris' para los datos de entrenamiento...
trn <- sample(150,50)

# ... y para poner a prueba el modelo
new <- sample(150,50)

# Entrena el modelo
iris_knn <- class::knn(iris[trn, -5], 
                       iris[new,-5],
                       iris$Species[trn],
                       k = 20,
                       prob = TRUE)

# Comprueba:
table(iris_knn,             # - las conclusiones del modelo
      iris$Species[new])    # - con la realidad
            
iris_knn     setosa versicolor virginica
  setosa         16          0         0
  versicolor      0         18         3
  virginica       0          1        12
# Esto devuelve la tasa de aciertos: 
mean(iris_knn == iris$Species[new])
[1] 0.92

Random forest

Los modelos random forest son modelos no-lineales robustos que previene el over-fitting, pero requiere un ajuste manual de los parámetros.

Están basados en árboles de decisiones, que segmentan los datos y los clasifican en cada rama. Un número excesivo de ramas lleva a over-fitting (considerar que el ruido de la muestra es relevante).

Para evitar esto se puede “podar” el árbol limitando el número de iteraciones posibles, o limitando el número de ramas que se consideran una vez generado el modelo.