Tiempo de lectura: 6 minutos

Como muchos de vosotros ya sabréis, machine learning es una de las metodologías más populares de data science. Este método se basa fundamentalmente en construir un algoritmo a partir de datos conocidos, por ejemplo para predecir alturas, el reconocimiento de voz de Siri, un algoritmo de recomendación de películas… Obviamente estamos tratando con un tema muy extenso, por lo que en este artículo trataré de hacer un pequeño resumen y añadir un pequeño ejemplo codificado en R.

En machine learning, los datos se clasifican en dos tipos:

  1. La salida que queremos predecir y
  2. Los datos que usaremos para predecir la salida.

Queremos construir un algoritmo que tome elementos (ya obtenidos de una población) como entrada y devuelva una predicción como salida cuando realmente no la conocemos. 

El proceso que ejecutaremos, por lo tanto, será entrenar un algoritmo usando un conjunto de datos para el cual conocemos la salida, y después aplicar ese algoritmo en el futuro para hacer una predicción cuando no sabemos la salida.

A continuación escribiré cada término en inglés, ya que es la terminología utilizada en este ámbito:

  • features: conjunto de datos de entrada.
  • outcome: salida obtenida.
  • dataset: conjunto de datos.

Además, utilizaremos la letra Y para denotar outcome y X1,…,Xp para features.

Cabe destacar que en este tipo de problemas podemos tener salidas tanto continuas como discretas. Para las salidas discretas, Y tomará un valor que no esté comprendido entre 2 consecutivos, mientras que si es continua puede tomar cualquier valor dentro de un intervalo. Aunque no utilicemos estos conceptos en este artículo me parece importante mencionarlo, ya que es un concepto elemental a la hora de llevar a cabo un estudio de este estilo.

Llegados a este punto, hablaremos de uno de los ejemplos más utilizados para explicar estos conceptos: El caso de clasificación del correo según el código postal.

Inicialmente, los trabajadores de correos clasificaban las cartas a mano. Para hacer esto, tenían que leer el código postal de cada carta. Hoy en día, gracias al machine learning, un ordenador puede ser quien realice esta tarea.

El primer paso para construir el algoritmo es comprender cuáles van a ser los datos de nuestro problema. A continuación mostramos 3 números que han sido clasificados por un ser humano: 

Estos números se convierten imágenes de 784 píxeles y, para cada píxel, obtenemos un color entre 0 y 255 en escala de grises:

Sencillo, ¿verdad? Vamos a trasladar, por lo tanto, estos conceptos a nuestro ordenador: para cada imagen tenemos una salida (outcome) discreta Y, que puede tomar un valor entre 0 y 9, y como entrada (features) tendremos las variables Xi1,…,Xi784

¿Veis por dónde voy? Vamos a tomar los 784 píxeles como valores de entrada de nuestro algoritmo y como salida obtendremos un valor entre 0 y 9, es decir, el número predicho. Así podremos clasificar los números según el porcentaje de píxeles negros que presente cada imagen.

Ahora que hemos planteado el problema de forma general y sabemos sobre que estamos trabajando, vamos a implementar en R un pequeño algoritmo que nos permita distinguir entre un 2 y un 7. Primero obtendremos un valor mediante regresión linear que, a pesar de ser válida para algunos problemas sencillos de predicción, no es tan eficiente como los métodos k-nearest neighbors y cross validation, los cuales son demasiado largos para incluir en este artículo (artículo que no descarto escribir en un futuro), pero que nos permitirían obtener un resultado mucho más fiable.

Para llevar a cabo este problema, comenzaremos simplificando el problema a uno con 2 predictors y 2 classes. Lo que haremos será considerar la proporción de píxeles oscuros en el cuadrante superior de la izquierda (X1) y en cuadrante inferior de la derecha (X2).

Seleccionamos una muestra random de 1.000 dígitos, metiendo 500 en el conjunto de entrenamiento y otros 500 en el de prueba:

library(tidyverse)
	library(dslabs)
	data(“mnist_27")

	mnist_27$train %>% ggplot(aes(x_1, x_2, color = y)) + geom_point()

Podemos observar ciertos patrones. Si X1 es muy grande, el número es probablemente un 7, mientras que para valores pequeños podría ser un 2.

Vamos a intentar construir un algoritmo usando regresión. El modelo es bastante sencillo:

Lo ajustamos y construimos una regla de decisión basado en el valor estimado :

fit <- mnist_27$train %>%
 	 mutate(y = ifelse(y==7, 1, 0)) %>%
	  lm(y ~ x_1 + x_2, data = .)
	
	#regla de decisión basada en el estimador
	library(caret)
	p_hat <- predict(fit, newdata = mnist_27$test)
	y_hat <- factor(ifelse(p_hat > 0.5, 7, 2))
	confusionMatrix(y_hat, mnist_27$test$y)$overall[["Accuracy"]]

Tras la ejecución obtenemos una precisión del 75% pero, ¿podemos hacerlo mejor?

Debido a que construimos el ejemplo a partir de la librería mnist_27 y tenemos a nuestra disposición 60.000 dígitos que podemos utilizar para construir la auténtica distribución de , vamos a aprovechar esta información. Tened en cuenta que esto es algo a lo que no solemos tener acceso en la práctica (estamos tratando con los valores que técnicamente queremos predecir), pero que os voy a mostrar ya que nos permite comparar con .

Vamos a mostrar gráficamente la auténtica :

mnist_27$true_p %>% ggplot(aes(x_1, x_2, z = p, fill = p)) +
geom_raster() +
scale_fill_gradientn(colors=c("#F8766D", "white", "#00BFC4"))+                
stat_contour(breaks=c(0.5), color=“black")

Sin embargo, la gráfica que obtenemos para según el método empleado es la siguiente:

Observamos que nuestra aproximación no tiene oportunidad de capturar las partes no lineales de la auténtica p(x1,x2) , lo cual aumenta los fallos de predicción y que puede ser corregido en gran medida por el método mencionado con anterioridad, pero es el pequeño primer paso para adentrarnos en el mundo del machine learning.


BIBLIOGRAFÍA
https://courses.edx.org/courses/coursev1:HarvardX+PH125.8x+1T2020/course/

AUTORA
María Caseiro Arias
Matemáticas e Ing.Informática
Santiago de Compostela

(Votos: 1 Promedio: 5)
Si te ha gustado... Comparte!!
Share on LinkedIn
Linkedin
Pin on Pinterest
Pinterest
Print this page
Print
Log in or Register to save this content for later.
María Caseiro Arias
mariacaseiro24@gmail.com
Coordinadora de desarrollo y diseño web de QS. Estudiante de 3º de Matemáticas e Ingeniería Informática en la Universidad de Santiago de Compostela. Correo: mariacaseiro@quantum-society.com

2 comentarios sobre “UNA PEQUEÑA INTRODUCCIÓN A MACHINE LEARNING CON R #1”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *