Recapitulando pasos de ML

  1. Definir la pregunta
  2. Limpieza y tratamiento de los datos (incluye convertir a dummies los factores y normalizacion de las variables)
  3. Separar la base de datos en train y en test
  4. Evaluar el algoritmo
  5. Optimizar hiperparametros

Caret

En palabras simples, Caret es un contenedor para más de 200 algoritmos de aprendizaje automático. Además, proporciona varias características que lo convierten en una solución integral para todas las necesidades de modelado de problemas supervisados de aprendizaje automático. Utilizar este paquete en lugar de las funciones originales de los métodos presenta dos ventajas:

  1. Permite utilizar un código unificado para aplicar reglas de clasificación muy distintas, implementadas en diferentes paquetes.
  2. Es más fácil poner en práctica algunos procedimientos usuales en problemas de clasificación. Por ejemplo, hay funciones específicas para dividir la muestra en datos de entrenamiento y datos de test o para ajustar parámetros mediante validación cruzada.
library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(readr)
library(fastDummies)
datos<- read_csv("https://raw.githubusercontent.com/edojimenez/r_datascience/main/titanic.csv")
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   PassengerId = col_double(),
##   Survived = col_double(),
##   Pclass = col_double(),
##   Name = col_character(),
##   Sex = col_character(),
##   Age = col_double(),
##   SibSp = col_double(),
##   Parch = col_double(),
##   Ticket = col_character(),
##   Fare = col_double(),
##   Cabin = col_character(),
##   Embarked = col_character()
## )

Limpieza y tratamiento de datos

#Me quedo solo con los datos que no tengan missing
datos=datos[complete.cases(datos), ] 

str(datos)
## tibble[,12] [183 × 12] (S3: tbl_df/tbl/data.frame)
##  $ PassengerId: num [1:183] 2 4 7 11 12 22 24 28 53 55 ...
##  $ Survived   : num [1:183] 1 1 0 1 1 1 1 0 1 0 ...
##  $ Pclass     : num [1:183] 1 1 1 3 1 2 1 1 1 1 ...
##  $ Name       : chr [1:183] "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" "McCarthy, Mr. Timothy J" "Sandstrom, Miss. Marguerite Rut" ...
##  $ Sex        : chr [1:183] "female" "female" "male" "female" ...
##  $ Age        : num [1:183] 38 35 54 4 58 34 28 19 49 65 ...
##  $ SibSp      : num [1:183] 1 1 0 1 0 0 0 3 1 0 ...
##  $ Parch      : num [1:183] 0 0 0 1 0 0 0 2 0 1 ...
##  $ Ticket     : chr [1:183] "PC 17599" "113803" "17463" "PP 9549" ...
##  $ Fare       : num [1:183] 71.3 53.1 51.9 16.7 26.6 ...
##  $ Cabin      : chr [1:183] "C85" "C123" "E46" "G6" ...
##  $ Embarked   : chr [1:183] "C" "S" "S" "S" ...
datos$Survived <- as.factor(datos$Survived)
datos$Pclass <- as.factor(datos$Pclass)
datos$Sex      <- as.factor(datos$Sex)
datos$Embarked <- as.factor(datos$Embarked)


#Elimino variables que no tienen sentido predictivo
datos$Ticket<-NULL
datos$Cabin<-NULL
datos$Name<-NULL

One-hot Enconding

La mayoría de los tutoriales y herramientas de Machine learning requieren que prepares los datos antes de que se puedan ajustar a un modelo. Una codificación en caliente (one-hot encoding) es un proceso de conversión de variables de datos categóricos para que se puedan proporcionar a los algoritmos y mejorar las predicciones.

Con one-hot encoding, convertimos cada valor categórico en una nueva columna categórica y asignamos un valor binario de 1 o 0 a esas columnas. Cada valor entero se representa como un vector binario. Todos los valores son cero y el índice está marcado con un 1.

datos=dummy_cols(datos,  select_columns = c("Pclass", "Embarked"), remove_most_frequent_dummy=TRUE)

#Elimino las variables oridinales
datos$Pclass<-NULL
datos$Embarked<-NULL

Normizamos las variables

La normalización estadística es la transformación de escala de la distribución de una variable con el objetivo de poder hacer comparaciones respecto a conjuntos de elementos y a la media mediante la eliminando los efectos de influencias.

normalize <- function(x) {
       return ((x - min(x)) / (max(x) - min(x)))
}

datos = datos %>% mutate_if(is.numeric, normalize)

Dividimos nuestra base de datos en 2

Los datos de entrenamiento o «training data» son los datos que usamos para entrenar un modelo. La calidad de nuestro modelo de aprendizaje automático va a ser directamente proporcional a la calidad de los datos. Por ello las labores de limpieza, depuración o «data wrangling» consumen un porcentaje importante del tiempo de los científicos de datos.

Los datos de prueba, validación o «testing data» son los datos que nos “reservamos” para comprobar si el modelo que hemos generado a partir de los datos de entrenamiento “funciona”. Es decir, si las respuestas predichas por el modelo para un caso totalmente nuevo son acertadas o no.

set.seed(123)
# Se crean los índices de las observaciones de entrenamiento
train <- createDataPartition(y = datos$Survived, p = 0.8, list = FALSE, times = 1)
datos_train <- datos[train, ]
datos_test  <- datos[-train, ]

Limpiamos los datos

Nuestra variable relevante es la variable “Diagnosis” que nos dice si el tumor es benigno o no. Revisemos el comportamiento de nuestra variable objetivo。 Para eso usaremos el comando train

Train

El comando más importante de caret es train. Se puede usar este comando único para aplicar un gran número de métodos de clasificación determinando (en caso necesario) los valores óptimos de sus parámetros mediante validación cruzada u otros métodos de remuestreo. Para usar train en general es necesario:

  1. Elegir el método de clasificación que queremos usar. Una información técnica detallada de cada método se puede obtener con el comando getModelInfo.
  2. Si el método de clasificación requiere determinar parámetros, es necesario fijar cuáles y en qué rango de valores.
  3. También hay que definir el método de remuestreo que se va a utilizar para determinar estos parámetros.
set.seed(7)
fit.knn <- train(Survived~., data=datos_train, method="knn", metric=  "Accuracy")
fit.knn
## k-Nearest Neighbors 
## 
## 147 samples
##  10 predictor
##   2 classes: '0', '1' 
## 
## No pre-processing
## Resampling: Bootstrapped (25 reps) 
## Summary of sample sizes: 147, 147, 147, 147, 147, 147, ... 
## Resampling results across tuning parameters:
## 
##   k  Accuracy   Kappa    
##   5  0.7548162  0.4465459
##   7  0.7724682  0.4799594
##   9  0.7667237  0.4706266
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 7.

Ahora veo que tan bueno es mi modelo que datos que no ha visto

evaluacion <- predict(fit.knn, newdata = datos_test)
evaluacion
##  [1] 1 0 0 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1
## Levels: 0 1

Como nos fue?

table(evaluacion, datos_test$Survived)
##           
## evaluacion  0  1
##          0  6  7
##          1  6 17

Matriz de confusión:

Verdaderos Positivos o True Positives (TP): cuando la clase real del punto de datos era 1 (Verdadero) y la predicha es también 1 (Verdadero) Verdaderos Negativos o True Negatives (TN): cuando la clase real del punto de datos fue 0 (Falso) y el pronosticado también es 0 (Falso). Falsos Positivos o False Positives (FP): cuando la clase real del punto de datos era 0 (False) y el pronosticado es 1 (True). Falsos Negativos o False Negatives (FN): Cuando la clase real del punto de datos era 1 (Verdadero) y el valor predicho es 0 (Falso).

Cuál es el escenario actual de un modelo?

Métricas de Evaluación de modelos:

  1. Especificidad: Verdaderos Negativos/ (Verdaderos Negativos + Falsos Positivos)
  2. Precision: Verdaderos Positivos/ (Verdaderos Positivos + Falsos Positivos)
  3. Recall: Verdaderos Positivos/ (Verdaderos Positivos + Falsos Negativos)
  4. Accuruacy: (Verdaderos Positivos + Verdaderos Negativos)/ Total