Árboles [rpart]

Paso 1: Entendimiento del negocio

1.1. Determinar el objetivo del negocio.

El objetivo de la minería de datos que se aplica para este proyecto es el clasificar si los pacientes cuentan con un cáncer benigno o maligno del, con el fin de poder predecir evaluando esta diagnosis general. Basándose en mediciones ya adquiridas en el conjunto de los datos.

1.2. Evaluar la situación actual.

Se consiguió el conjunto de datos de kaggle, en el cual fue descargado y publicado en github, para mayor facilidad de acceso, para poder evaluar lo que se necesita. Por lo que a priori se puede afirmar que se dispone de una cantidad de datos más que suficiente para poder resolver el problema. Esta información incluye: mediciones generales del cáncer, que vendrían a ser los tumores generados, el radio, el área, etc, las cuales serán útiles a la hora de aplicar la minería de datos.

1.3. Determianr el objetivo de la minería de datos.

Los objetivos en términos de minería de datos son:

  • Hacer uso de las herramientas de clasificación que binda la minería de datos.

  • Predecir a partir de un diagnostico general si un paciente cuenta con un cáncer benigno o maligno.

  • Comprobar con técnicas de predicción operaciones relacionadas con los pacientes del hospital.

1.4. Realizar un plan de proyecto.

El proyecto estará dividido mediante las siguientes etapas, con la finalidad de facilitar la organización de este mismo:

  • Etapa 1: Análisis de la estructura de los datos y la información de la base de datos.

  • Etapa 2: Ejecución de consultas para tener muestras representativas de los datos.

  • Etapa 3: Preparación de los datos (selección, limpieza, conversión y formateo, si fuera necesario).

  • Etapa 4: Elección de las técnicas de modelado y ejecución de las mismas sobre los datos.

  • Etapa 5: Análisis de los resultados obtenidos en la etapa anterior, si fuera necesario repetir la etapa 4.

  • Etapa 6: Producción de informes con los resultados obtenidos en función de los objetivos de negocio y los criterios de éxito establecidos.

  • Etapa 7: Presentación de los resultados finales.

Paso 2: Entendimiento de la data

2.1. Información inicial de la data

  • Carga de datos formato csv.
data <- read.csv("https://raw.githubusercontent.com/cnahuina/data-mineria/master/breast-cancer.csv")
  • Verificamos la carga, visualizando la estructura inical de las variables de manera general.

De acuerdo a ello se visualiza lo siguiente:

Se tiene 569 datos de 33 variables.

En el cual se rescatar que el identificador es de tipo int, el cual debe cambiar a factor, por lo mismo que es un identificador, también se puede rescatar la columna “X” con valores de “NA”

str(data)
## 'data.frame':    569 obs. of  33 variables:
##  $ id                     : int  842302 842517 84300903 84348301 84358402 843786 844359 84458202 844981 84501001 ...
##  $ diagnosis              : Factor w/ 2 levels "B","M": 2 2 2 2 2 2 2 2 2 2 ...
##  $ radius_mean            : num  18 20.6 19.7 11.4 20.3 ...
##  $ texture_mean           : num  10.4 17.8 21.2 20.4 14.3 ...
##  $ perimeter_mean         : num  122.8 132.9 130 77.6 135.1 ...
##  $ area_mean              : num  1001 1326 1203 386 1297 ...
##  $ smoothness_mean        : num  0.1184 0.0847 0.1096 0.1425 0.1003 ...
##  $ compactness_mean       : num  0.2776 0.0786 0.1599 0.2839 0.1328 ...
##  $ concavity_mean         : num  0.3001 0.0869 0.1974 0.2414 0.198 ...
##  $ concave.points_mean    : num  0.1471 0.0702 0.1279 0.1052 0.1043 ...
##  $ symmetry_mean          : num  0.242 0.181 0.207 0.26 0.181 ...
##  $ fractal_dimension_mean : num  0.0787 0.0567 0.06 0.0974 0.0588 ...
##  $ radius_se              : num  1.095 0.543 0.746 0.496 0.757 ...
##  $ texture_se             : num  0.905 0.734 0.787 1.156 0.781 ...
##  $ perimeter_se           : num  8.59 3.4 4.58 3.44 5.44 ...
##  $ area_se                : num  153.4 74.1 94 27.2 94.4 ...
##  $ smoothness_se          : num  0.0064 0.00522 0.00615 0.00911 0.01149 ...
##  $ compactness_se         : num  0.049 0.0131 0.0401 0.0746 0.0246 ...
##  $ concavity_se           : num  0.0537 0.0186 0.0383 0.0566 0.0569 ...
##  $ concave.points_se      : num  0.0159 0.0134 0.0206 0.0187 0.0188 ...
##  $ symmetry_se            : num  0.03 0.0139 0.0225 0.0596 0.0176 ...
##  $ fractal_dimension_se   : num  0.00619 0.00353 0.00457 0.00921 0.00511 ...
##  $ radius_worst           : num  25.4 25 23.6 14.9 22.5 ...
##  $ texture_worst          : num  17.3 23.4 25.5 26.5 16.7 ...
##  $ perimeter_worst        : num  184.6 158.8 152.5 98.9 152.2 ...
##  $ area_worst             : num  2019 1956 1709 568 1575 ...
##  $ smoothness_worst       : num  0.162 0.124 0.144 0.21 0.137 ...
##  $ compactness_worst      : num  0.666 0.187 0.424 0.866 0.205 ...
##  $ concavity_worst        : num  0.712 0.242 0.45 0.687 0.4 ...
##  $ concave.points_worst   : num  0.265 0.186 0.243 0.258 0.163 ...
##  $ symmetry_worst         : num  0.46 0.275 0.361 0.664 0.236 ...
##  $ fractal_dimension_worst: num  0.1189 0.089 0.0876 0.173 0.0768 ...
##  $ X                      : logi  NA NA NA NA NA NA ...
  • Cambio de la variable id como factor
data$id <- as.factor(data$id)

2.2. Información inicial de la data

Información del atributo:

  • Se calculan diez características de valor real para cada núcleo celular:

Número de identificación 2) Diagnóstico (M = maligno, B = benigno) 3-32)

Se calculan diez características de valor real para cada núcleo celular:

Variables:

Variables Descripción de variables
Id Identificador del paciente
diagnosis El diagnóstico de los pacientes “B” [Benigno] y “M” [Maligno]
radius media de distancias desde el centro a puntos en el perímetro
texture desviación estándar de valores de escala de grises
perimeter perimetro
area área
smoothness [suavidad], variación local en longitudes de radio
compactness [compacidad] perímetro ^ 2 / área - 1.0
concavity [concavidad] severidad de las porciones cóncavas del contorno
concave points número de porciones cóncavas del contorno
symmetry simetría
fractal dimension [dimensión fractal] “aproximación de la costa” - 1

La media, el error estándar y el “peor” o mayor (media de los tres valores más grandes) de estas características se calcularon para cada imagen, dando como resultado 30 características. Por ejemplo, el campo 3 es Radio medio, el campo 13 es Radio SE, el campo 23 es Peor radio.

Este análisis tiene como objetivo observar qué características son más útiles para predecir el cáncer maligno o benigno y ver las tendencias generales que pueden ayudarnos en la selección del modelo y la selección de hiperparámetros en el análisis futuro.

summary(data)
##        id      diagnosis  radius_mean      texture_mean   perimeter_mean  
##  8670   :  1   B:357     Min.   : 6.981   Min.   : 9.71   Min.   : 43.79  
##  8913   :  1   M:212     1st Qu.:11.700   1st Qu.:16.17   1st Qu.: 75.17  
##  8915   :  1             Median :13.370   Median :18.84   Median : 86.24  
##  9047   :  1             Mean   :14.127   Mean   :19.29   Mean   : 91.97  
##  85715  :  1             3rd Qu.:15.780   3rd Qu.:21.80   3rd Qu.:104.10  
##  86208  :  1             Max.   :28.110   Max.   :39.28   Max.   :188.50  
##  (Other):563                                                              
##    area_mean      smoothness_mean   compactness_mean  concavity_mean   
##  Min.   : 143.5   Min.   :0.05263   Min.   :0.01938   Min.   :0.00000  
##  1st Qu.: 420.3   1st Qu.:0.08637   1st Qu.:0.06492   1st Qu.:0.02956  
##  Median : 551.1   Median :0.09587   Median :0.09263   Median :0.06154  
##  Mean   : 654.9   Mean   :0.09636   Mean   :0.10434   Mean   :0.08880  
##  3rd Qu.: 782.7   3rd Qu.:0.10530   3rd Qu.:0.13040   3rd Qu.:0.13070  
##  Max.   :2501.0   Max.   :0.16340   Max.   :0.34540   Max.   :0.42680  
##                                                                        
##  concave.points_mean symmetry_mean    fractal_dimension_mean   radius_se     
##  Min.   :0.00000     Min.   :0.1060   Min.   :0.04996        Min.   :0.1115  
##  1st Qu.:0.02031     1st Qu.:0.1619   1st Qu.:0.05770        1st Qu.:0.2324  
##  Median :0.03350     Median :0.1792   Median :0.06154        Median :0.3242  
##  Mean   :0.04892     Mean   :0.1812   Mean   :0.06280        Mean   :0.4052  
##  3rd Qu.:0.07400     3rd Qu.:0.1957   3rd Qu.:0.06612        3rd Qu.:0.4789  
##  Max.   :0.20120     Max.   :0.3040   Max.   :0.09744        Max.   :2.8730  
##                                                                              
##    texture_se      perimeter_se       area_se        smoothness_se     
##  Min.   :0.3602   Min.   : 0.757   Min.   :  6.802   Min.   :0.001713  
##  1st Qu.:0.8339   1st Qu.: 1.606   1st Qu.: 17.850   1st Qu.:0.005169  
##  Median :1.1080   Median : 2.287   Median : 24.530   Median :0.006380  
##  Mean   :1.2169   Mean   : 2.866   Mean   : 40.337   Mean   :0.007041  
##  3rd Qu.:1.4740   3rd Qu.: 3.357   3rd Qu.: 45.190   3rd Qu.:0.008146  
##  Max.   :4.8850   Max.   :21.980   Max.   :542.200   Max.   :0.031130  
##                                                                        
##  compactness_se      concavity_se     concave.points_se   symmetry_se      
##  Min.   :0.002252   Min.   :0.00000   Min.   :0.000000   Min.   :0.007882  
##  1st Qu.:0.013080   1st Qu.:0.01509   1st Qu.:0.007638   1st Qu.:0.015160  
##  Median :0.020450   Median :0.02589   Median :0.010930   Median :0.018730  
##  Mean   :0.025478   Mean   :0.03189   Mean   :0.011796   Mean   :0.020542  
##  3rd Qu.:0.032450   3rd Qu.:0.04205   3rd Qu.:0.014710   3rd Qu.:0.023480  
##  Max.   :0.135400   Max.   :0.39600   Max.   :0.052790   Max.   :0.078950  
##                                                                            
##  fractal_dimension_se  radius_worst   texture_worst   perimeter_worst 
##  Min.   :0.0008948    Min.   : 7.93   Min.   :12.02   Min.   : 50.41  
##  1st Qu.:0.0022480    1st Qu.:13.01   1st Qu.:21.08   1st Qu.: 84.11  
##  Median :0.0031870    Median :14.97   Median :25.41   Median : 97.66  
##  Mean   :0.0037949    Mean   :16.27   Mean   :25.68   Mean   :107.26  
##  3rd Qu.:0.0045580    3rd Qu.:18.79   3rd Qu.:29.72   3rd Qu.:125.40  
##  Max.   :0.0298400    Max.   :36.04   Max.   :49.54   Max.   :251.20  
##                                                                       
##    area_worst     smoothness_worst  compactness_worst concavity_worst 
##  Min.   : 185.2   Min.   :0.07117   Min.   :0.02729   Min.   :0.0000  
##  1st Qu.: 515.3   1st Qu.:0.11660   1st Qu.:0.14720   1st Qu.:0.1145  
##  Median : 686.5   Median :0.13130   Median :0.21190   Median :0.2267  
##  Mean   : 880.6   Mean   :0.13237   Mean   :0.25427   Mean   :0.2722  
##  3rd Qu.:1084.0   3rd Qu.:0.14600   3rd Qu.:0.33910   3rd Qu.:0.3829  
##  Max.   :4254.0   Max.   :0.22260   Max.   :1.05800   Max.   :1.2520  
##                                                                       
##  concave.points_worst symmetry_worst   fractal_dimension_worst    X          
##  Min.   :0.00000      Min.   :0.1565   Min.   :0.05504         Mode:logical  
##  1st Qu.:0.06493      1st Qu.:0.2504   1st Qu.:0.07146         NA's:569      
##  Median :0.09993      Median :0.2822   Median :0.08004                       
##  Mean   :0.11461      Mean   :0.2901   Mean   :0.08395                       
##  3rd Qu.:0.16140      3rd Qu.:0.3179   3rd Qu.:0.09208                       
##  Max.   :0.29100      Max.   :0.6638   Max.   :0.20750                       
## 

2.3. Exploración de la data

  • Se analizan los valores outliers de la data en general.

    1. Se realiza un boxplot para la visualización de outliers

Se refleja los outliers en la mayoría de las variables.

boxplot(data)

2.4 Verificación de la calidad de la data

  • Se analizan los NA’S de la data en general

Se realiza un gráfico en el cual nos permita visualizar el patrón de comportamiento de los NA’s

#install.packages("VIM")
library(VIM)
## Warning: package 'VIM' was built under R version 3.6.3
## Loading required package: colorspace
## Loading required package: grid
## Loading required package: data.table
## VIM is ready to use. 
##  Since version 4.0.0 the GUI is in its own package VIMGUI.
## 
##           Please use the package to use the new (and old) GUI.
## Suggestions and bug-reports can be submitted at: https://github.com/alexkowa/VIM/issues
## 
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
## 
##     sleep
miss <- aggr(data, col=c('green', 'red'),
     ylab = c("Histograma de NAs", "Patrón"))

En el cuadro de proporcion de missings podemos observar que la variable X pasa del 5% , en consecuencia podría no tomarse en cuenta como variable de uso.

summary(miss)
## 
##  Missings per variable: 
##                 Variable Count
##                       id     0
##                diagnosis     0
##              radius_mean     0
##             texture_mean     0
##           perimeter_mean     0
##                area_mean     0
##          smoothness_mean     0
##         compactness_mean     0
##           concavity_mean     0
##      concave.points_mean     0
##            symmetry_mean     0
##   fractal_dimension_mean     0
##                radius_se     0
##               texture_se     0
##             perimeter_se     0
##                  area_se     0
##            smoothness_se     0
##           compactness_se     0
##             concavity_se     0
##        concave.points_se     0
##              symmetry_se     0
##     fractal_dimension_se     0
##             radius_worst     0
##            texture_worst     0
##          perimeter_worst     0
##               area_worst     0
##         smoothness_worst     0
##        compactness_worst     0
##          concavity_worst     0
##     concave.points_worst     0
##           symmetry_worst     0
##  fractal_dimension_worst     0
##                        X   569
## 
##  Missings in combinations of variables: 
##                                                       Combinations Count
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1   569
##  Percent
##      100

Paso 3: Preparación de la data

3.1. Seleccionar la data

Como se mostró anteriormente, la última columna no se toma en cuenta y la otra variable a no tomar en cuenta es el identificador.

data <- data[,2:32]

3.2. Limpiar la data

  1. Se hace uso de una función en este caso denominada replace_outliers para eliminar los valores outliers de la data.

Capar los valores extremos, es decir, localizar todo lo que cayera fuera del bigote más arriba o más abajo de 1,5 veces de el rango intercuartilico. Y decidir capar dichas obsevaciones sustituyendolas con el percentil número 5. En el caso de los que están debajo del bigote inferior y con el percentil 95 con los que están por encima del bigote superior.

replace_outliers <- function(x, removeNA = TRUE){
  qrts <- quantile(x, probs = c(0.25, 0.75), na.rm = removeNA)
  caps <- quantile(x, probs = c(.05, 0.95), na.rm = removeNA)
  iqr <- qrts[2]-qrts[1]
  h <- 1.5*iqr
  x[x<qrts[1]-h] <- caps[1]
  x[x>qrts[2]+h] <- caps[2]
  x
}
  • Hacemos uso de la función en las variables presentadas, en el boxplot realizado con anterioridad.
data$radius_mean <- replace_outliers(data$radius_mean)
data$texture_mean  <- replace_outliers(data$texture_mean)
data$perimeter_mean  <- replace_outliers(data$perimeter_mean)
data$area_mean  <- replace_outliers(data$area_mean)
data$smoothness_mean  <- replace_outliers(data$smoothness_mean )
data$compactness_mean  <- replace_outliers(data$compactness_mean)
data$concavity_mean  <- replace_outliers(data$concavity_mean)
data$concave.points_mean  <- replace_outliers(data$concave.points_mean)
data$symmetry_mean <- replace_outliers(data$symmetry_mean)
data$fractal_dimension_mean  <- replace_outliers(data$fractal_dimension_mean)
data$radius_se <- replace_outliers(data$radius_se)
data$texture_se  <- replace_outliers(data$texture_se )
data$perimeter_se  <- replace_outliers(data$perimeter_se)
data$area_se <- replace_outliers(data$area_se)
data$smoothness_se  <- replace_outliers(data$smoothness_se)
data$compactness_se  <- replace_outliers(data$compactness_se)
data$concavity_se <- replace_outliers(data$concavity_se)
data$concave.points_se <- replace_outliers(data$concave.points_se)
data$symmetry_se <- replace_outliers(data$symmetry_se)
data$fractal_dimension_se <- replace_outliers(data$fractal_dimension_s)
data$radius_worst <- replace_outliers(data$radius_worst)
data$texture_worst <- replace_outliers(data$texture_worst )
data$perimeter_worst  <- replace_outliers(data$perimeter_worst)
data$area_worst  <- replace_outliers(data$area_worst)
data$smoothness_worst <- replace_outliers(data$smoothness_worst)
data$compactness_worst <- replace_outliers(data$compactness_worst)
data$concavity_worst <- replace_outliers(data$concavity_worst)
data$concave.points_worst <- replace_outliers(data$concave.points_worst)
data$symmetry_worst <- replace_outliers(data$symmetry_worst)
  • Para la comprabación del reemplazo de los outliers
boxplot.stats(data$texture_mean)
## $stats
## [1]  9.71 16.17 18.84 21.80 29.97
## 
## $n
## [1] 569
## 
## $conf
## [1] 18.46709 19.21291
## 
## $out
## numeric(0)

3.3. Construir data

  • Detallamos las librerías que haremos uso
# install.packages("caret")
library(caret)
## Warning: package 'caret' was built under R version 3.6.3
## Loading required package: lattice
## Loading required package: ggplot2
# install.packages("rpart")
library(rpart)
## Warning: package 'rpart' was built under R version 3.6.3
# install.packages("partykit")
library(partykit)
## Warning: package 'partykit' was built under R version 3.6.3
## Loading required package: libcoin
## Warning: package 'libcoin' was built under R version 3.6.3
## Loading required package: mvtnorm
## Warning: package 'mvtnorm' was built under R version 3.6.2
# install.packages("ROCR")
library(ROCR)
## Warning: package 'ROCR' was built under R version 3.6.3
## Loading required package: gplots
## 
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
## 
##     lowess
  • Establecemos una semilla
set.seed(2018)
  • Hacemos las particiones respectivas para hacer uso de la función.
training.ids <- createDataPartition(data$diagnosis, p = 0.7, list = F)
test <- data[-training.ids,]
dim(test)
## [1] 170  31

3.4. Integración de data

3.5. Formato de data

Paso 4: Modelamiento

4.1. Minsplit = 20 y CP = 0.01

  1. Se establecen los valores por defecto de minsplit y cp, a modo inicial. Luego se realizaran variaciones.
mod <- rpart(diagnosis ~ . , 
              data = data[training.ids,],
              method = "class", 
              control = rpart.control(minsplit = 20, cp = 0.01))
mod
## n= 399 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 399 149 B (0.62656642 0.37343358)  
##    2) concave.points_mean< 0.04923 244  13 B (0.94672131 0.05327869)  
##      4) radius_worst< 17.74 234   6 B (0.97435897 0.02564103) *
##      5) radius_worst>=17.74 10   3 M (0.30000000 0.70000000) *
##    3) concave.points_mean>=0.04923 155  19 M (0.12258065 0.87741935)  
##      6) concavity_worst< 0.2248 14   2 B (0.85714286 0.14285714) *
##      7) concavity_worst>=0.2248 141   7 M (0.04964539 0.95035461)  
##       14) radius_worst< 14.855 8   3 B (0.62500000 0.37500000) *
##       15) radius_worst>=14.855 133   2 M (0.01503759 0.98496241) *
  • Se realiza la gráfica para poder visualizar el modelo de mejor manera
plot(as.party(mod))

4.2. Minsplit = 0 y CP = 0.0019

  • Haciendo modificaciones

    1. Se establecen los valores por defecto de minsplit y cp, a modo inicial. Luego se realizaran variaciones.
mod1 <- rpart(diagnosis ~ . , 
              data = data[training.ids,],
              method = "class", 
              control = rpart.control(minsplit = 0, cp = 0.0019))
  • Se realiza la gráfica para poder visualizar el modelo de mejor manera
plot(as.party(mod1))

PODA DEL ÁRBOL

Para poder consultamos con la variable dentro de mod (el modelo ya realizado), la variable cptable

En ella se puede visualizar una tabla, en la cual se tiene los siguiente:

  • CP <- las componentes principales.
  • rel error <- el error relativo.
  • xerror <- error total.
  • xstd <- la desviación estandar.

La principal idea en ello es poder elegir un valor no superior a la desviación estandar pero a su vez que se encuentre por encima del error mínimo.

mod1$cptable
##            CP nsplit  rel error    xerror       xstd
## 1 0.785234899      0 1.00000000 1.0000000 0.06484708
## 2 0.067114094      1 0.21476510 0.2818792 0.04114206
## 3 0.026845638      2 0.14765101 0.2751678 0.04070622
## 4 0.020134228      3 0.12080537 0.2818792 0.04114206
## 5 0.013422819      4 0.10067114 0.2348993 0.03792381
## 6 0.006711409      8 0.04697987 0.2013423 0.03535095
## 7 0.003355705     12 0.02013423 0.1946309 0.03480384
## 8 0.001900000     18 0.00000000 0.2147651 0.03641123
0.2013423+0.03480384
## [1] 0.2361461

0.2361461 es mayor al error cometido

  • Se le estable el valor de “7”
mod1.pruned <- prune(mod1, mod1$cptable[7, "CP"])
mod1.pruned
## n= 399 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 399 149 B (0.62656642 0.37343358)  
##    2) concave.points_mean< 0.04923 244  13 B (0.94672131 0.05327869)  
##      4) radius_worst< 17.74 234   6 B (0.97435897 0.02564103)  
##        8) area_se< 45.17 230   3 B (0.98695652 0.01304348) *
##        9) area_se>=45.17 4   1 M (0.25000000 0.75000000)  
##         18) texture_mean< 15.805 1   0 B (1.00000000 0.00000000) *
##         19) texture_mean>=15.805 3   0 M (0.00000000 1.00000000) *
##      5) radius_worst>=17.74 10   3 M (0.30000000 0.70000000)  
##       10) concavity_worst< 0.1981 3   0 B (1.00000000 0.00000000) *
##       11) concavity_worst>=0.1981 7   0 M (0.00000000 1.00000000) *
##    3) concave.points_mean>=0.04923 155  19 M (0.12258065 0.87741935)  
##      6) concavity_worst< 0.2248 14   2 B (0.85714286 0.14285714)  
##       12) radius_mean< 16.59 12   0 B (1.00000000 0.00000000) *
##       13) radius_mean>=16.59 2   0 M (0.00000000 1.00000000) *
##      7) concavity_worst>=0.2248 141   7 M (0.04964539 0.95035461)  
##       14) radius_worst< 14.855 8   3 B (0.62500000 0.37500000)  
##         28) smoothness_mean< 0.10865 4   0 B (1.00000000 0.00000000) *
##         29) smoothness_mean>=0.10865 4   1 M (0.25000000 0.75000000)  
##           58) radius_mean< 10.313 1   0 B (1.00000000 0.00000000) *
##           59) radius_mean>=10.313 3   0 M (0.00000000 1.00000000) *
##       15) radius_worst>=14.855 133   2 M (0.01503759 0.98496241)  
##         30) texture_mean< 15.375 5   2 M (0.40000000 0.60000000)  
##           60) radius_mean< 14.99 2   0 B (1.00000000 0.00000000) *
##           61) radius_mean>=14.99 3   0 M (0.00000000 1.00000000) *
##         31) texture_mean>=15.375 128   0 M (0.00000000 1.00000000) *
  • Se realiza la gráfica para poder visualizar el modelo de mejor manera
plot(as.party(mod1.pruned))

Paso 5: Evaluación

5.1. Evaluación en el caso de un minsplit = 20 y CP = 0.01

  • Predecimos la data haciendo comparación con la data test.
mod.pred <- predict(mod, test, type="class")
mod.pred.ba <- predict(mod, test, type="prob")
  • Hacemos de la función table para poder visualizar de mejor manera los valores Actuales y predichos
table <- table(test$diagnosis,mod.pred, dnn = c("Actual", "Predicho"))
table
##       Predicho
## Actual   B   M
##      B 102   5
##      M   3  60

Para el diagrama ROC del modelo básico

Curva ROC <- proporciona la fiabilidad en la clasificación dada.

  1. 1ro objeto pred, se tiene la funcion prediction, de la segunda columna en la cual visualizamos los éxitos. En referencia al código anterior.

  2. 2do evaluamos la performance para evaluar la eficiencia.

pred1 <- prediction(mod.pred.ba[,2], data[-training.ids, "diagnosis"])
perf1 <- performance(pred1, "tpr", "fpr")
  • Realizamos la gráfica.
plot(perf1,  main="Curva ROC del modelo Rpart-árbol podado")
lines(par()$usr[1:2],par()$usr[3:4])

  • Hacemos uso de la función “confusionMatrix”, la cual es una herramienta que permite la visualización del desempeño del modelo que se ha empleado con anterioridad.
medida <- confusionMatrix(mod.pred, test$diagnosis)
medida
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   B   M
##          B 102   3
##          M   5  60
##                                           
##                Accuracy : 0.9529          
##                  95% CI : (0.9094, 0.9795)
##     No Information Rate : 0.6294          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.8998          
##                                           
##  Mcnemar's Test P-Value : 0.7237          
##                                           
##             Sensitivity : 0.9533          
##             Specificity : 0.9524          
##          Pos Pred Value : 0.9714          
##          Neg Pred Value : 0.9231          
##              Prevalence : 0.6294          
##          Detection Rate : 0.6000          
##    Detection Prevalence : 0.6176          
##       Balanced Accuracy : 0.9528          
##                                           
##        'Positive' Class : B               
## 
  • Evaluamos que tan bueno es el modelo. En el caso de que el árbol no haya sido podado.

    1. Hallamos el accuracy.
acc <- (102+60)/170
acc
## [1] 0.9529412
  1. Hallamos el error del modelo.
error_rate <- 1 - acc
error_rate
## [1] 0.04705882

Tenemos entonces una precisión de predicción del 92.30% y un error de predicción del 4.70%.

5.2. Evaluación en el de variación, evaluando el cptable del modelo y el árbol podado

  • Predecimos la data haciendo comparación con la data test.
mod1.pred1 <- predict(mod1, test, type="class")
mod1.pred2 <- predict(mod1.pruned, test, type = "prob")
  • Se realiza la comparación para la evaluación del modelo podado.
tabel2 <- table(test$diagnosis, mod1.pred1, dnn = c("Actual", "Predicho"))
tabel2
##       Predicho
## Actual   B   M
##      B 100   7
##      M   5  58
  • Hacemos uso de la función “confusionMatrix”, la cual es una herramienta que permite la visualización del desempeño del modelo que se ha empleado con anterioridad.
medida.pod <- confusionMatrix(mod1.pred1, test$diagnosis)
medida.pod
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   B   M
##          B 100   5
##          M   7  58
##                                          
##                Accuracy : 0.9294         
##                  95% CI : (0.8799, 0.963)
##     No Information Rate : 0.6294         
##     P-Value [Acc > NIR] : <2e-16         
##                                          
##                   Kappa : 0.8497         
##                                          
##  Mcnemar's Test P-Value : 0.7728         
##                                          
##             Sensitivity : 0.9346         
##             Specificity : 0.9206         
##          Pos Pred Value : 0.9524         
##          Neg Pred Value : 0.8923         
##              Prevalence : 0.6294         
##          Detection Rate : 0.5882         
##    Detection Prevalence : 0.6176         
##       Balanced Accuracy : 0.9276         
##                                          
##        'Positive' Class : B              
## 
acc1 <- (100+58)/170
acc1
## [1] 0.9294118
  • Evaluamos que tan bueno es el modelo. Para ello hacemos lo siguiente para poder hallar el error del modelo.
error_rate1 <- 1 - acc1
error_rate1
## [1] 0.07058824

Para una mejor visualización de predicción del modelo podado, realizamos la gráfica de la curva ROC. Ya que esta proporciona la fiabilidad en la clasificación dada. (Probabilidad en que se tenga éxito o fracaso).

#install.packages("ROCR")
library(ROCR)

Para el diagrama ROC una vez predicho

Curva ROC <- proporciona la fiabilidad en la clasificación dada.

  1. 1ro objeto pred, se tiene la funcion prediction, de la segunda columna en la cual visualizamos los éxitos. En referencia al código anterior.

  2. 2do evaluamos la performance para evaluar la eficiencia.

pred <- prediction(mod1.pred2[,2], data[-training.ids, "diagnosis"])
perf <- performance(pred, "tpr", "fpr")
  • Realizamos la gráfica.
plot(perf,  main="Curva ROC del modelo Rpart-árbol podado")
lines(par()$usr[1:2],par()$usr[3:4])

A continuación se muestran los links con las demás herramientas que se usan para clasificar: