Trabajo Final / Programación y análisis económico y social con R

Integrantes:

Felipe Roldan Ferrin / Rachell Valentina Rodriguez Prada / Nathaly Henao Lugo

Árboles de clasificación

Los árboles de clasificación son una alternativa al análisis tradicional de clasificación o a la predicción tradicional regresión. No tenemos que estimar un modelo estadístico formal, ya que son algoritmos para clasificar utilizando particiones sucesivas,las variables resultantes en los nodos terminales son tan homogéneas como sea posible. Por lo tanto, podemos decir que son modelos de predicción, similares a los diagramas de flujo que son la representación gráfica de un algoritmo o proceso. La variable objeto o de entrada es cualitativa.

¿Cómo decide un árbol ramificarse?

La ramificación de un árbol es muy importante, la creación de sub-nodos incrementa la homogeneidad de los sub-nodos resultantes. Es decir, la pureza del nodo se incrementa respecto a la variable objetivo.

Respecto a la terminología

El árbol de ilustración tiene tres niveles de nodos, el primer nivel tiene un único nodo llamado raíz: población completa o muestra. Dos nodos internos o de decisión en el segundo nivel. La idea es que si, por ejemplo, el nodo X en este caso se divide en xl y xr, la pureza de estos dos nodos hijos debe ser mayor al nodo anterior. Finalmente, cuatro nodos terminales en el tercer nivel. La completa homogeneidad es un ideal raramente alcanzado en el análisis de datos real; sin embargo, el objetivo del algoritmo de segmentación recursiva es hacer las variables resultantes tan homogéneas como sea posible.

Metodología

Existen principalmente tres procedimientos: Detección automática de interacciones (CHAID), árbol estadístico eficiente insesgado y rápido (QUEST) y árbol de clasificación y regresión (CART). En este último, nos centraremos por ser relativamente sencillo y mejor para implementarse en R. Los árboles de decisión son binarios, admiten variables de entrada y salida cualitativas y cuantitativas. De manera general, lo que realiza este algoritmo es encontrar la variable independiente que mejor separa nuestros datos en grupos. Esta mejor separación es expresada con una reglaada y a cada regla corresponde un nodo.

Su metodología consiste en tres pasos: construcción del árbol, elección del tamaño correcto y clasificación de nuevos datos a partir del árbol construido, pasos que serán desarrollados más adelante.

##Ventajas y Desventajas

Ahora bien, respecto a las ventajas y desventajas, se tiene que a favor: es muy interpretable y visualmente estimulante, pues nos da un conjunto de reglas a partir de las cuales se pueden tomar decisiones. Es un algoritmo que no es demandante en poder de cómputo comparado con procedimientos más sofisticados y, a pesar de ello, tiende a dar buenos resultados de predicción para muchos tipos de datos. Es reconocido en el campo de la analítica, sus reglas son simples y legibles y el tipo de dato no es una restricción, se trabaja con datos tanto cualitativos como cuantitativos.

Sus principales desventajas son:resulta ser un tipo de clasificación “débil”, pues sus resultados pueden variar mucho dependiendo de la muestra de datos usados para entrenar un modelo, es decir, las reglas son sensibles a pequeñas perturbaciones en los datos. Se presenta también dificultad para elegir el árbol óptimo y requiere de un gran número de datos para que sea significativo.

Diferencias entre árbol de regresión y árbol de clasificación

La variable dependiente, cuantitativa en regresión y cualitativa en clasificación.

De esta forma los valores de los nodos terminales en el primer caso se reducen a la media de las observaciones de esa región y en el caso del árbol de clasificación a la moda de estas observaciones.

Aplicación

Instalamos los paquetes pertinentes, rpart para usar el algoritmo chart y el otro para plotear.

install.packages(“rpart”) install.packages(“rpart.plot”)

Paquetes a usar.

library(rpart)
## Warning: package 'rpart' was built under R version 4.0.5
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.0.5
library(MASS)
## Warning: package 'MASS' was built under R version 4.0.5
library(caret)
## Warning: package 'caret' was built under R version 4.0.5
## Loading required package: lattice
## Loading required package: ggplot2
library(ggplot2)

Cargamos la base de datos que se encuentra en el paquete MASS.

data("Pima.tr");data("Pima.te")
Pima <- rbind(Pima.tr,Pima.te)
View(Pima)
rm(Pima.tr,Pima.te)
str(Pima)                           
## 'data.frame':    532 obs. of  8 variables:
##  $ npreg: int  5 7 5 0 0 5 3 1 3 2 ...
##  $ glu  : int  86 195 77 165 107 97 83 193 142 128 ...
##  $ bp   : int  68 70 82 76 60 76 58 50 80 78 ...
##  $ skin : int  28 33 41 43 25 27 31 16 15 37 ...
##  $ bmi  : num  30.2 25.1 35.8 47.9 26.4 35.6 34.3 25.9 32.4 43.3 ...
##  $ ped  : num  0.364 0.163 0.156 0.259 0.133 ...
##  $ age  : int  24 55 35 26 23 52 25 24 63 31 ...
##  $ type : Factor w/ 2 levels "No","Yes": 1 2 1 1 1 2 1 1 1 2 ...
summary(Pima)
##      npreg             glu               bp              skin      
##  Min.   : 0.000   Min.   : 56.00   Min.   : 24.00   Min.   : 7.00  
##  1st Qu.: 1.000   1st Qu.: 98.75   1st Qu.: 64.00   1st Qu.:22.00  
##  Median : 2.000   Median :115.00   Median : 72.00   Median :29.00  
##  Mean   : 3.517   Mean   :121.03   Mean   : 71.51   Mean   :29.18  
##  3rd Qu.: 5.000   3rd Qu.:141.25   3rd Qu.: 80.00   3rd Qu.:36.00  
##  Max.   :17.000   Max.   :199.00   Max.   :110.00   Max.   :99.00  
##       bmi             ped              age         type    
##  Min.   :18.20   Min.   :0.0850   Min.   :21.00   No :355  
##  1st Qu.:27.88   1st Qu.:0.2587   1st Qu.:23.00   Yes:177  
##  Median :32.80   Median :0.4160   Median :28.00            
##  Mean   :32.89   Mean   :0.5030   Mean   :31.61            
##  3rd Qu.:36.90   3rd Qu.:0.6585   3rd Qu.:38.00            
##  Max.   :67.10   Max.   :2.4200   Max.   :81.00
## La base de datos acota 8 variables que utilizaremos como covariables y una (1) variable con nombre type que utilizaremos como variable dependiente.

##La base de datos consta de variables que hacen referencia a la enfermedad "diabetes". Contiene 532 observaciones de mujeres mayores a 21 años sometidas a pruebas segun la OMS.

Definimos las variables.Para comodidad del programador se puede usar el comando attach con el fin de definir todas las variables de forma automática.

Age<-Pima$age
Npreg<-Pima$npreg
Glu<-Pima$glu
Bp<-Pima$bp
Skin<-Pima$skin
Bmi<-Pima$bmi
Ped<-Pima$ped
Type<-Pima$type

Metodología CART / classification trees

Usamos una semilla predeterminada para que los resultados sean iguales.

set.seed(123)

Vamos a crear el primer árbol donde se usarán las siguientes variables:

Age: Edad

Npreg:número de embarazos

Bmi:índice de masa corporal

Glu: concentración de glucosa en plasma.

Estas variables son elegidas de forma aleatoria

Tree_1<-rpart(Type ~ Age + Npreg + Bmi +Glu,
              data = Pima,
              method = "class")

rpart.plot(Tree_1,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE)

##Si quiere realizar un análisis de regresión se debe usar en el tipo de método method="anova"

Ahora saquemos la variable Glu y veamos que sucede.

Tree_1.1<-rpart(Type ~ Age + Npreg + Bmi,
              data = Pima,
              method = "class")

rpart.plot(Tree_1.1,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE)

##El algoritmo trabaja con las variables disponibles y va escogiendo según le sirvan para clasificar. El árbol ahora que la variable Glu no está, usa la edad como variable inicial para clasificar.

Veamos la confusion Matrix del primer arbol.

Aquí podemos ver la bondad de ajuste del árbol para ver su facultad para clasificar.

Predicción_1<-predict(Tree_1, newdata=Pima,type="class")

caret::confusionMatrix(Predicción_1,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  324  54
##        Yes  31 123
##                                           
##                Accuracy : 0.8402          
##                  95% CI : (0.8063, 0.8703)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.6281          
##                                           
##  Mcnemar's Test P-Value : 0.01702         
##                                           
##             Sensitivity : 0.6949          
##             Specificity : 0.9127          
##          Pos Pred Value : 0.7987          
##          Neg Pred Value : 0.8571          
##              Prevalence : 0.3327          
##          Detection Rate : 0.2312          
##    Detection Prevalence : 0.2895          
##       Balanced Accuracy : 0.8038          
##                                           
##        'Positive' Class : Yes             
## 
## Se pueden apreciar el kappa, la sensibilidad, la sensitividad y demás factores que hablan sobre la bondad de ajuste del árbol.

Alternativas / Hiperparámetros

Los hiperparámetros son características que se pueden cambiar de los árboles, para mejorar su capacidad de clasificación. Todo esto gira entorno a los objetivos del usuario.

con minbucket y minsplit

Tree_2<-rpart(Type ~Age + Npreg + Bmi + Glu,
                      data = Pima,
                      control = rpart.control(minsplit = 50,minbucket = 25),
                      method = "class")

rpart.plot(Tree_2,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE)

Predicción_2<-predict(Tree_2, newdata=Pima,type="class")
caret::confusionMatrix(Predicción_2,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  324  64
##        Yes  31 113
##                                           
##                Accuracy : 0.8214          
##                  95% CI : (0.7862, 0.8531)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : 1.356e-15       
##                                           
##                   Kappa : 0.5781          
##                                           
##  Mcnemar's Test P-Value : 0.001027        
##                                           
##             Sensitivity : 0.6384          
##             Specificity : 0.9127          
##          Pos Pred Value : 0.7847          
##          Neg Pred Value : 0.8351          
##              Prevalence : 0.3327          
##          Detection Rate : 0.2124          
##    Detection Prevalence : 0.2707          
##       Balanced Accuracy : 0.7755          
##                                           
##        'Positive' Class : Yes             
## 
#Aquí nos volvemos más exigentes con el modelo y vemos cómo cambian algunos de sus elementos de ajuste.

Controlando el Cp / cp=0.05.

Tree_3<-rpart(Type ~Age + Npreg+ Bmi + Glu,
                      data = Pima,
                      control = rpart.control(minsplit = 50,minbucket = 25,cp=0.05),
                      method = "class")

rpart.plot(Tree_3,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE)

Predicción_3<-predict(Tree_3, newdata=Pima,type="class")
caret::confusionMatrix(Predicción_3,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  311  66
##        Yes  44 111
##                                           
##                Accuracy : 0.7932          
##                  95% CI : (0.7563, 0.8269)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : 9.62e-11        
##                                           
##                   Kappa : 0.5194          
##                                           
##  Mcnemar's Test P-Value : 0.04526         
##                                           
##             Sensitivity : 0.6271          
##             Specificity : 0.8761          
##          Pos Pred Value : 0.7161          
##          Neg Pred Value : 0.8249          
##              Prevalence : 0.3327          
##          Detection Rate : 0.2086          
##    Detection Prevalence : 0.2914          
##       Balanced Accuracy : 0.7516          
##                                           
##        'Positive' Class : Yes             
## 
#Aqui nos volvemos más exigentes con el modelo y vemos como cambian algunos de sus elementos de ajuste.

Controlando el Cp / cp=0.001.

Tree_4<-rpart(Type ~Age + Npreg+ Bmi + Glu,
              data = Pima,
              control = rpart.control(minsplit = 50,minbucket = 25,cp=0.001),
              method = "class")
  
rpart.plot(Tree_4,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE) 

Predicción_4<-predict(Tree_4, newdata=Pima,type="class")
caret::confusionMatrix(Predicción_4,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  324  64
##        Yes  31 113
##                                           
##                Accuracy : 0.8214          
##                  95% CI : (0.7862, 0.8531)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : 1.356e-15       
##                                           
##                   Kappa : 0.5781          
##                                           
##  Mcnemar's Test P-Value : 0.001027        
##                                           
##             Sensitivity : 0.6384          
##             Specificity : 0.9127          
##          Pos Pred Value : 0.7847          
##          Neg Pred Value : 0.8351          
##              Prevalence : 0.3327          
##          Detection Rate : 0.2124          
##    Detection Prevalence : 0.2707          
##       Balanced Accuracy : 0.7755          
##                                           
##        'Positive' Class : Yes             
## 
##Relajamos un poco el cp en este árbol.

Tambien se pueden podar los arboles.

Tree_5<-prune(Tree_4,cp=0.03)
rpart.plot(Tree_5,digits = -1,type = 2,extra = 101,cex = 0.8, nn=TRUE)  

Predicción_5<-predict(Tree_5, newdata=Pima,type="class")
caret::confusionMatrix(Predicción_5,Pima$type,positive="Yes")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  332  81
##        Yes  23  96
##                                           
##                Accuracy : 0.8045          
##                  95% CI : (0.7682, 0.8374)
##     No Information Rate : 0.6673          
##     P-Value [Acc > NIR] : 1.519e-12       
##                                           
##                   Kappa : 0.5203          
##                                           
##  Mcnemar's Test P-Value : 2.280e-08       
##                                           
##             Sensitivity : 0.5424          
##             Specificity : 0.9352          
##          Pos Pred Value : 0.8067          
##          Neg Pred Value : 0.8039          
##              Prevalence : 0.3327          
##          Detection Rate : 0.1805          
##    Detection Prevalence : 0.2237          
##       Balanced Accuracy : 0.7388          
##                                           
##        'Positive' Class : Yes             
## 

Todas las modificaciones y alteraciones a los hiperparámetros del árbol, serán con el fin de lograr un gran clasificador.

K vecinos más cercanos.

INTRODUCCIÓN

El método de K vecinos más cercanos es uno de los algoritmos de clasificación más básicos y esenciales en Machine Learning. Pertenece al dominio del aprendizaje supervisado y encuentra una aplicación intensa en el reconocimiento de patrones, la minería de datos y la detección de intrusos.

El clasificador KNN, por sus siglas en inglés, es también un algoritmo de aprendizaje no paramétrico y basado en instancias

*No paramétrico hace referencia a que no hace suposiciones explícitas sobre la forma funcional de los datos, evitando modelar mal la distribución subyacente de los datos.

*El aprendizaje basado en la instancia significa que nuestro algoritmo no aprende explícitamente un modelo. En lugar de ello, opta por memorizar las instancias de formación que posteriormente se utilizan como “conocimiento” para la fase de predicción. Esto significa que solo cuando se realiza una consulta a nuestra base de datos, es decir, cuando le pedimos que prediga una etiqueta con una entrada, el algoritmo utilizará las instancias de formación para dar una respuesta.

EJEMPLO

Supongamos que Z es el punto el cual se necesita predecir. Primero, se encuentra el punto K más cercano a Z y luego se clasifican los puntos para el voto mayoritario de sus vecinos K. Cada objeto vota por su clase y la clase con más votos se toma como la predicción.

Para encontrar los puntos similares más cercanos, se encuentra la distancia entre puntos utilizando las medidas de distancia. Una opción popular es la distancia euclidiana, pero también hay otras medidas que pueden ser más adecuadas para un entorno dado e incluyen la distancia de Mahattan y Minkowski.

¿Cuándo usar KNN?

El algoritmo kNN sirve tanto para problemas de clasificación como de regresión. El tipo de predicción que haga dependerá del tipo de problema que se le pase.

En resumen, KNN tiene los siguientes pasos básicos:

Calcular la distancia / Encontrar sus vecinos más cercanos / Votar por las etiquetas.

¿Cómo se decide el número de vecinos en KNN?

Ya que conocemos cómo funciona este algoritmo, es momento de saber cómo se define K:

*El número de vecinos (K) es un hiperparámetro que se debe elegir en el momento de la construcción del modelo. Puedes pensar en K como una variable de control para el modelo de predicción.

*La investigación ha demostrado que no existe un número óptimo de vecinos que se adapte a todo tipo de conjuntos de datos. Cada conjunto de datos tiene sus propios requisitos.

Se ha demostrado que una pequeña cantidad de vecinos son los más flexibles, que tendrán un bajo sesgo, pero una alta varianza, y un gran número de vecinos tendrán un límite de decisión más suave, lo que significa una varianza más baja pero un sesgo más alto.

Generalmente, se recomienda elegir un número impar si el número de clases es par. También puede comprobar generando el modelo en diferentes valores de K y comprobar su rendimiento.

VENTAJAS Y DESVENTAJAS

Las ventajas que tiene este algoritmo son las siguientes:

No paramétrico. No hace suposiciones explícitas sobre la forma funcional de los datos, evitando los peligros de la distribución subyacente de los datos.

Algoritmo simple. Para explicar, comprender e interpretar.

Alta precisión (relativa). Es bastante alta pero no competitiva en comparación con modelos de aprendizaje mejor supervisados.

Insensible a los valores atípicos. La precisión puede verse afectada por el ruido o las características irrelevantes.

Las desventajas de este algoritmo son:

Basado en instancia. El algoritmo no aprende explícitamente un modelo, en su lugar, elige memorizar las instancias de capacitación que se utilizan posteriormente como conocimiento para la fase de predicción. Concretamente, esto significa que solo cuando se realiza una consulta a nuestra base de datos, es decir cuando le pedimos que prediga una etiqueta dada una entrada, el algoritmo usará las instancias de entrenamiento para escupir una respuesta.

Computacionalmente costoso, porque el algoritmo almacena todos los datos de entrenamiento.

Requisito de memoria alta. Almacena todos (o casi todos) los datos de entrenamiento. Cabe señalar que la fase de formación mínima de KNN se realiza tanto a un coste de memoria, ya que debemos almacenar un conjunto de datos potencialmente enorme, como un coste computacional durante el tiempo de prueba, ya que la clasificación de una observación determinada requiere un agotamiento de todo el conjunto de dato. En la práctica, esto no es deseable, ya que normalmente queremos respuestas rápidas.

En cualquier caso, la función para encontrar los vecinos más cercanos funcionará de la siguiente manera:

Calcular la distancia de la observación respecto a todas las observaciones.

Filtrar y devolver las k observaciones con menor distancia

La clave del algoritmo kNN que programaremos en R se basa en tres aspectos clave que debemos conocer:

Conocer las distintas medidas de distancia que existen, cómo funcionan y cuándo usar cada una de las medidas.

Entender cómo elegir la cantidad de k vecinos a los que se debe observar.

Conocer cómo hace el algortimo kNN las predicciones.

Medidas de distancia que puede usar el algoritmo kNN

Dentro del algoritmo kNN las medidas de distancia más utilizadas son: distancia Euclídea, distancia de Minkowski, distancia Manhattan, distancia de Coseno y distancia Jaccard. Estas no son las únicas, el algoritmo kNN puede usar cualquier otra medida de distancia, aunque con estas se abarcan la mayoría de casos.

Distancia Minkowski

La distancia de Minkowski es un tipo de distancia que generaliza las distancias Euclídea y de Manhattan. Básicamente, la distancia Minkowski es una distancia que requiere de un parámetro p. Cuando p=2 obtenemos la distancia Euclídea y si p=1 obtenemos la distancia Manhattan.

De todos modos, aunque los valores más típicos de la distancia Minkowski suelen ser 1 y 2, también se le podría asignar otros valores

Aplicación / KNN

Paquetes para el ejercicio

library(caret)
library(ggplot2)
library(lattice)
library(class)
library(MASS)

Cargamos la base de datos

Datos<-iris
View(Datos)
attach(Datos)
set.seed(122)

Veamos las categorias de las flores,es decir, la variable que usaremos como dependiente.

View(Species)

table(Species)
## Species
##     setosa versicolor  virginica 
##         50         50         50

Definimos los grupos de aprendizaje y el de testing para el modelo.

muestra <- sample(1:150, 50)
testing <- Datos[muestra, ]
aprendizaje <- Datos[-muestra, ]

dim(testing)
## [1] 50  5
dim(aprendizaje)
## [1] 100   5

Ahora si viene lo chido / metodología KNN

Creamos la primera predicción del modelo con un k=1

Predict_1<-knn(aprendizaje[,1:4],testing[,1:4],aprendizaje[,5],k=1)

Matrix_1<-table(testing$Species,Predict_1, dnn = c("Actuales","Predichos"))
Matrix_1
##             Predichos
## Actuales     setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         15         2
##   virginica       0          1        14
caret::confusionMatrix(Predict_1,testing$Species)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         15         1
##   virginica       0          2        14
## 
## Overall Statistics
##                                           
##                Accuracy : 0.94            
##                  95% CI : (0.8345, 0.9875)
##     No Information Rate : 0.36            
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9099          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                   1.00            0.8824           0.9333
## Specificity                   1.00            0.9697           0.9429
## Pos Pred Value                1.00            0.9375           0.8750
## Neg Pred Value                1.00            0.9412           0.9706
## Prevalence                    0.36            0.3400           0.3000
## Detection Rate                0.36            0.3000           0.2800
## Detection Prevalence          0.36            0.3200           0.3200
## Balanced Accuracy             1.00            0.9260           0.9381
##En la matriz de confusión se pueden ver algunos de los parámetros de bondad de ajuste.

Ahora vamos a probar con k=3

Predict_2<-knn(aprendizaje[,1:4],testing[,1:4],aprendizaje[,5],k=3)

Matrix_2<-table(testing$Species,Predict_2, dnn = c("Actuales","Predichos"))
Matrix_2
##             Predichos
## Actuales     setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         15         2
##   virginica       0          0        15
caret::confusionMatrix(Predict_2,testing$Species)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         15         0
##   virginica       0          2        15
## 
## Overall Statistics
##                                           
##                Accuracy : 0.96            
##                  95% CI : (0.8629, 0.9951)
##     No Information Rate : 0.36            
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.94            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                   1.00            0.8824           1.0000
## Specificity                   1.00            1.0000           0.9429
## Pos Pred Value                1.00            1.0000           0.8824
## Neg Pred Value                1.00            0.9429           1.0000
## Prevalence                    0.36            0.3400           0.3000
## Detection Rate                0.36            0.3000           0.3000
## Detection Prevalence          0.36            0.3000           0.3400
## Balanced Accuracy             1.00            0.9412           0.9714

Ahora con un k=8

Predict_3<-knn(aprendizaje[,1:4],testing[,1:4],aprendizaje[,5],k=8)

Matrix_3<-table(testing$Species,Predict_3, dnn = c("Referencia","Predichos"))
Matrix_3
##             Predichos
## Referencia   setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         17         0
##   virginica       0          2        13
caret::confusionMatrix(Predict_3,testing$Species)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         17         2
##   virginica       0          0        13
## 
## Overall Statistics
##                                           
##                Accuracy : 0.96            
##                  95% CI : (0.8629, 0.9951)
##     No Information Rate : 0.36            
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9397          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                   1.00            1.0000           0.8667
## Specificity                   1.00            0.9394           1.0000
## Pos Pred Value                1.00            0.8947           1.0000
## Neg Pred Value                1.00            1.0000           0.9459
## Prevalence                    0.36            0.3400           0.3000
## Detection Rate                0.36            0.3400           0.2600
## Detection Prevalence          0.36            0.3800           0.2600
## Balanced Accuracy             1.00            0.9697           0.9333

Una herramienta util

install.packages(“kknn”)

library(kknn)
## Warning: package 'kknn' was built under R version 4.0.5
## 
## Attaching package: 'kknn'
## The following object is masked from 'package:caret':
## 
##     contr.dummy

este comando permite encontrar un k óptimo para nuestra base de datos.

train.kknn(formula = Species ~ .,data = aprendizaje,kmax = 10)
## 
## Call:
## train.kknn(formula = Species ~ ., data = aprendizaje, kmax = 10)
## 
## Type of response variable: nominal
## Minimal misclassification: 0.03
## Best kernel: optimal
## Best k: 6
##Cada base de datos y cada problema tendra su respectivo k el cual podra ser diferente al encontrado aquí.

Con un k=5 alcanzamos lo mismo que con un k=8, entonces es preferible usar el k=5.

Predict_4<-knn(aprendizaje[,1:4],testing[,1:4],aprendizaje[,5],k=5)

Matrix_4<-table(testing$Species,Predict_4, dnn = c("Referencia","Predichos"))
Matrix_4
##             Predichos
## Referencia   setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         15         2
##   virginica       0          1        14
caret::confusionMatrix(Predict_4,testing$Species)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         15         1
##   virginica       0          2        14
## 
## Overall Statistics
##                                           
##                Accuracy : 0.94            
##                  95% CI : (0.8345, 0.9875)
##     No Information Rate : 0.36            
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9099          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                   1.00            0.8824           0.9333
## Specificity                   1.00            0.9697           0.9429
## Pos Pred Value                1.00            0.9375           0.8750
## Neg Pred Value                1.00            0.9412           0.9706
## Prevalence                    0.36            0.3400           0.3000
## Detection Rate                0.36            0.3000           0.2800
## Detection Prevalence          0.36            0.3200           0.3200
## Balanced Accuracy             1.00            0.9260           0.9381

Usar el metodo de K vecinos o los árboles de clasificación, será una desición que cada investigador debera tomar con base a sus necesidades. Cada uno posee potentes características que se ajustan a lo que se necesite usar. El futuro es ahora.

¿Cuál usarias tú?