Felipe Roldan Ferrin / Rachell Valentina Rodriguez Prada / Nathaly Henao Lugo
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.
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.
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.
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.
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.
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
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"
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.
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.
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.
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.
*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.
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.
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.
Calcular la distancia / Encontrar sus vecinos más cercanos / Votar por las etiquetas.
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.
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.
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.
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.
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.
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
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
muestra <- sample(1:150, 50)
testing <- Datos[muestra, ]
aprendizaje <- Datos[-muestra, ]
dim(testing)
## [1] 50 5
dim(aprendizaje)
## [1] 100 5
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.
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
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
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ú?