Machine Learning (en español) es divertido Parte 1

Publicada en Publicada en Machine Learning

También puedes leer este artículo en Inglés (Fuente original), 日本語, Português, Türkçe, Français, 한국어, العَرَبِيَّة o también en Español (México).

¿Eres de los que escuchan a otros hablar de Machine Learning (aprendizaje Automático) pero solo tienes una ligera idea de lo que esto significa? ¿Estas cansado de intentar entender de qué va esto cuando escuchas a otros compañeros de trabajo? ¡Es hora de cambiar!

Esta guía es para todos los que sienten curiosidad acerca del Machine Learning, pero no tienen idea sobre cómo empezar. Seguramente muchos de vosotros ya habéis leído el artículo de la wikipedia que trata del aprendizaje automático y os habéis sentido frustrados intentado entender su explicación de alto nivel.

El objetivo de esta serie de artículos es que sean accesibles para todo el mundo, esto implica que en muchos casos existan generalidades y simplificación en la terminología empleada. Pero… ¿A quién le importa? Si con esto conseguimos que más gente comprenda y se sienta interesada en el machine learning, entonces… misión cumplida.

Este artículo es una traducción autorizada por Adam Geitgey, autor original de la serie Machine Learning is Fun! que puedes encontrar en su blog. ¡Gracias Adam!

¿Qué es machine learning?

Machine Learning es el modelo a través de la cual algoritmos genéricos pueden decirte algo de interés acerca de un conjunto de datos sin que sea necesario escribir un software específico para resolver el problema. En vez de escribir código, alimentas con tus datos al algoritmo genérico y este genera su propia lógica basándose en estos.

Por ejemplo, unos de los tipos de algoritmos es conocido como algoritmo de clasificación (classification algorithm). Este mismo algoritmo puede ser usado para el reconocimiento de caracteres escritos a mano y también para detectar si un correo electrónico es spam o no, sin cambiar una sola línea de código. Se trata del mismo algoritmo, pero al ser alimentado con distintos datos genera una lógica de clasificación diferente.

Machine Learning en Español Classification Algorithm
Este algoritmo de aprendizaje automático es como una caja negra que puede ser re-usado para resolver múltiples problemas de clasificación.

“Machine learning” es el paraguas donde entran todos estos algoritmos genéricos.

Dos tipos de algoritmos

Clasificaremos los algoritmos usados en machine learning en dos grandes categorías –aprendizaje supervisado (supervised learning) y aprendizaje no supervisado (un-supervised learning). La diferencia es muy sencilla pero muy importante.

Aprendizaje supervisado

Imaginémonos que eres un agente inmobiliario. Tu negocio está creciendo y contratas a varios agentes para que te ayuden. Pero existe un problema –con tú experiencia puedes ver una casa y fácilmente estimar el valor de esta, sin embargo, tus nuevos agentes no tienen la misma experiencia y por lo tanto no pueden estimar correctamente el valor de las propiedades con solo verlas, igual que tú lo haces.

Para ayudar a tus trabajadores novatos (y posiblemente para tener más tiempo para irte de vacaciones), decides crear una aplicación que puede estimar correctamente el valor de una casa basándose en su tamaño, barrio y el precio de las casas con características similares que se han vendido últimamente.

Lo primero en hacer será anotar el precio de venta de las casas durante los últimos 3 meses. Por cada casa, escribes todos los detalles que puedes –número de habitaciones, metros cuadrados construidos, barrio, etc. Así como, el dato más importante, el precio final de venta.

Simulemos algunos datos sobre el precio de las casas en Madrid, España:

Habitaciones Metros cuadrados Barrio Precio final
3 2.000 Chueca 250,000.00 €
2 800 Chamartín 300,000.00 €
2 850 Chueca 150,000.00 €
1 550 Chueca 78,000.00 €
4 2.000 Latina 150,000.00 €

Utilizando esta información como datos de entrenamiento, crearemos una aplicación que pueda estimar el precio final de venta de la siguiente casa:

Habitaciones Metros cuadrados Barrio Precio final
2 2.000 Chamartín ¿? €

Esto es llamado aprendizaje supervisado. Tú conoces el precio de venta real de cada casa, conoces la respuesta al problema, conoces el histórico de precios y descifrar la lógica del problema.

Para desarrollar la aplicación, alimentaremos el algoritmo de aprendizaje automático con los datos de entrenamiento. A partir de estos, el algoritmo intentará descifrar que tipo de matemática necesitará para que dé la respuesta correcta.

Una analogía a esto sería resolver un examen de matemáticas teniendo todas las respuestas anotadas, excepto los operadores matemáticos:

Examen de matemáticas #1 – Respuestas del profesor
1) 2 4 5 = 3 5) 6 2 2 = 10
2) 5 2 8 = 2 6) 3 1 1 = 2
3) 2 2 1 = 3 7) 5 3 4 = 11
4) 4 2 2 = 6 8) 1 8 1 = 7

Oh no! Un alumno torpe borró todos los símbolos de la hoja de respuestas del profesor…

A partir de aquí, ¿Puedes adivinar de qué tipo de problemas matemáticos trata el test? Sabes que tienes que “hacer algo” con los números de la izquierda para obtener las respuestas de la derecha.

En el aprendizaje supervisado, dejas que el ordenador descubra este “algo” por ti. Y una vez que conoce que tipo de matemáticas se necesitan para resolver este grupo de problemas específicos, podrás volver a preguntarle cualquier otro problema del mismo tipo.

Aprendizaje no supervisado

Regresemos a nuestro ejemplo original con un agente inmobiliario. ¿Qué sucedería si no conoces el precio final de venta de cada casa? Aun solo conociendo el número de habitaciones, los metros cuadrados y la unicación de la casa puedes hacer cosas muy interesantes. A esto le llamaremos aprendizaje no supervisado (un-supervised learning).

Habitaciones Metros cuadrados Barrio
3 2.000 Chueca
2 800 Chamartín
2 850 Chueca
1 550 Chueca
4 2.000 Latina

Aunque no estés tratando de predecir un dato desconocido (precio final de venta), puedes hacer otras cosas interesantes con machine learning.

Esto es similar a si alguien te diera un pedazo de papel con una lista de números y te dijera “No sé qué significan estos números, pero posiblemente puedas encontrar si existe un patrón o alguna relación entre ellos –¡Mucha suerte muchacho!”.

¿Qué podrías hacer con esta información? Para empezar,  un algoritmo identifique los mercados potenciales de los compradores de casas de manera automática. A lo mejor descubres con estos datos que los compradores de casas en un barrio cerca de una universidad prefieren casas pequeñas con muchas habitaciones, pero los compradores a las afueras de la ciudad prefieren las casas con 3 habitaciones y muchos metros cuadrados. Conocer esta información puede ayudarte como agente inmobiliario para canalizar correctamente tus esfuerzos de marketing.

Otra cosa interesante que podrías hacer es identificar aquellas casas atípicas. Posiblemente estas propiedades son mansiones y te conviene dedicar tus mejores vendedores a ellas porque su venta te dejará la mejores comisiones.

En el resto de este artículo nos vamos a enfocar en el aprendizaje supervisado, pero no porque el aprendizaje no supervisado sea menos útil o interesante. De hecho, el aprendizaje no supervisado cada día está obteniendo más importancia debido a la mejora en sus algoritmos para la obtención de patrones y relaciones entre los datos.

Nota: Hay muchos otros tipos de algoritmos de aprendizaje automático, sin embargo este artículo es un buen sitio desde donde empezar.

Interesante, verdad…, ¿Pero ser capaz de estimar el precio de una casa tiene realmente algo de “aprendizaje”?

Como humano, tu cerebro está preparado para que en cualquier situación y sin ninguna instrucción explicita aprendas cómo resolverla. Si durante mucho te dedicas a vender casas, de manera instintiva empezaras a “sentir” el precio real de una casa, la mejor manera de venderla, el tipo de cliente que estaría interesado en ella, etc. El objetivo final de la Inteligencia Artificial es replicar esta habilidad de los humanos usando computadoras.

Pero los algoritmos actuales de machine learning aun no son tan buenos, solo funcionan cuando se enfocan en un problema muy específico y limitado. A lo mejor la definición de aprendizaje automático no es tan buena, probablemente “desarrollo de una ecuación para resolver un problema específico basándose en datos de entrenamiento” sea una definición más precisa.

Pero a quién le gusta decir que se dedica al  “desarrollo de una ecuación para resolver un problema específico basándose en datos de entrenamiento” Así que, seguiremos utilizando en término machine learning.

Por supuesto, si lees este artículo dentro de 50 años en el futuro y para entonces ya hemos descubierto un algoritmo potente de Inteligencia Artificial, seguro que todo este post te parecerá, al menos, pintoresco. Seguramente dejarás de leerlo para pedirle a su robot doméstico que te prepare un sándwich.

Ha llegado la hora de escribir nuestra aplicación!

Entonces, ¿Cómo podrías crear un programa que estime el precio final de una casa como? Piensa un segundo antes de que sigas leyendo.

Si no supieras nada de machine learning, probablemente intentarías escribir algunas reglas básicas para estimar el precio de una casa como tipo las siguientes:


def estimar_precio_de_casa(num_de_habitaciones, metros_cuadrados, barrio):
  precio = 0

  # In en mi zona el precio por metro cuadrado es de 200 €
  precio_por_metro = 300

  if barrio == "chamartin":
    # pero otros barrios son mas caros
    precio_por_metro = 400

  elif barrio == "latina":
    # y en otras areas mas barato
    precio_por_metro = 100

  # comenzamos con un precio base en funcion del tamano de la casa
  precio = precio_por_metro * metros_cuadrados

  # ajustamos nuestra estimacion en base al numero de habitaciones
  if num_de_habitaciones == 0:
    # los estudios son mas baratos
    precio = precio — 20000
  else:
    # las casas con mas habitaciones habitualmente
    # son mas caras
    precio = precio + (num_de_habitaciones * 1000)

  return precio

Si juegas con este código durante horas y horas, casi seguro que lograrás algo que funcione más o menos. Pero tu software nunca será perfecto y sobre todos será muy difícil de mantener según los precios de venta cambien.

¿No sería mejor si el ordenador encontrara la mejor manera de realizar este cálculo por ti? No ha de importarnos que hace exactamente la función, siempre y devuelva un número correcto.


def estimar_precio_de_casa(num_de_habitaciones, metros_cuadrados, barrio):
  precio = [ordenador, por favor calcula algo para mi]

  return precio

Una opción de abordar la solución de este problema es pensar que el precio es una sopa y los ingredientes son el número de habitaciones, los metros cuadrados y el barrio. Si pudieras descifrar cuanto impacta cada ingrediente en el precio final de la casa, podrías obtener la relación exacta de cada ingrediente que necesitas agregarle a la sopa para estimar el precio final.

Esto reduciría tu aplicación original (con una lógica llena de if’s y else’s difícil de mantener) a una función mucho más sencilla como esta:


def estimar_precio_de_casa(num_de_habitaciones, metros_cuadrados, barrio):
 precio = 0

 # un poquito de esto
 precio += num_de_habitaciones * .841231951398213

 # algo mas de esto
 precio += metros_cuadrados * 1231.1231231

 # y si le echamos esto...
 precio += barrio * 2.3242341421

 # y finalmente, algo de sal para ajustar el sabor
 precio += 201.23432095

 return precio

¿Te fijaste en los números mágicos?  — .941231951398214, 2231.1231232, 3.3242341422 y 301.23432096. Estos son nuestros pesos. Si pudiéramos encontrar los pesos perfectos para usar en nuestra función, podríamos estimar los precios finales de venta de las casas de forma casi exacta.

Una manera muy tonta de encontrar los pesos perfectos podría ser:

Paso 1

Empecemos con el valor de los pesos en 1.0:

def estimar_precio_de_casa(num_habitaciones, metros_cuadrados, barrio):

 precio = 0

# un poquito de esto
 precio += num_habitaciones * 1.0

# algo mas de esto
 precio += metros_cuadrados * 1.0

# y si le echamos esto...
 precio += barrio * 1.0

# y finalmente, algo de sal para ajustar el sabor
 precio += 1.0

return precio
Paso 2

Si pasamos los datos reales de cada casa que conocemos a través de la función podremos ver como de lejos estamos entre el precio real y el calculado por cada una de ellas obtendremos que:

 

Habitaciones Metros cuadrados Barrio Precio real Precio estimado
3 2.000 Chueca 250,000.00 € 178.000.00 €
2 800 Chamartín 300,000.00 € 371,000.00 €
2 850 Chueca 150,000.00 € 148,000.00 €
1 550 Chueca 78,000.00 € 101,000.00 €
4 2.000 Latina 150,000.00 € 121,000.00 €

Por ejemplo, si la primera casa fue vendida realmente por 250,000.00€ pero tu algoritmo estimó que eran 178,000.00€, tienes un desfase 72,000.00€ solo en esa casa.

Suma el importe total al cuadrado del desfase en cada casa que tienes en tu conjunto de datos de aprendizaje. Digamos que tienes 500 casas y el importe al cuadrado de tu algoritmo se desfasó es de 86,123,173€. Este valor es el que te indica cual es el error de tu función de cálculo.

Ahora, toma el total y divídelo entre 500 para obtener el promedio del desfase en cada casa. A este promedio se le llama el coste de tu función.

Si llegaras al punto en que el coste fuera igual a cero jugando con los pesos, tu función sería perfecta. Esto significaría que tu función estimaría perfectamente el precio final de venta de las casas en función de los datos que le diste de aprendizaje, y este es nuestro objetivo final – Llevar el coste al menor valor posible probando con diferentes pesos.

Paso 3

Repite el Paso 2 una y otra vez con cada combinación posible de pesos. La combinación de pesos que haga que tu coste sea más cercano a cero es la que deberías usar. Una vez que encuentres esta combinación, ¡resolviste el problema.!

Llegó el momento de imaginar

Hasta aquí ha sido muy sencillo. Ahora piensa por unos minutos en lo que acabas de lograr. Tomaste algunos datos, los procesaste a través de tres sencillos y genéricos pasos y terminaste con una función que puede estimar el precio final de venta de una casa. ¡Idealista, empieza a temblar!

Pero también hiciste algunas cosas más…

  1. La investigación llevada a cabo en muchos campos (como en la lingüística y/o traducción) en los últimos 40 años ha demostrado que estos algoritmos genéricos de aprendizaje superan los enfoques en los humanos tratan de llegar para definir explícitamente algunas reglas de trabajo. El enfoque “tonto” del aprendizaje automático finalmente supera a los expertos humanos.
  2. La función que creaste es totalmente tonta. No sabe que son los metros cuadrados o el número de habitaciones. Solo sabe que necesita mezclar estos ingredientes en ciertas cantidades para obtener la respuesta correcta.
  3. Es muy probable que nunca sepas por qué una combinación particular de pesos funciona, seguramente acabas de crear una función que realmente no entiendes, pero puedes probar que funciona correctamente.
  4. Imagina por unos segundos que tu función en lugar de aceptar parámetros como metros cuadrados o habitaciones, tomara una lista de números. Imagínate que cada número representara el brillo de un pixel de una imagen capturada por una cámara montada en tu coche. Ahora imaginemos que, en lugar de calcular el precio final de venta, su resultado “direccion_del_volante”. Felicidades, acabas de desarrollar una función que puede conducir automáticamente tu coche y ya puedes enviar tu curriculum a Tesla Motors.

¿Te lo imaginas?

¿Cómo intentar cada combinación posible en el Paso 3?

Por supuesto que no puedes intentar todas las combinaciones posibles de pesos para encontrar la combinación que funcione mejor, seguramente te llevaría toda la vida porque nunca se te acabarían las combinaciones de pesos.

Para evitar esto, los matemáticos han descubierto muchas maneras ingeniosas para encontrar la mejor combinación de pesos sin tener que intentar todas las posibilidades. Una de estas maneras es la siguiente:

Primero, escribe una ecuación que describa nuestro Paso 2:

Esta es la función de Coste

Ahora la reescribimos usando terminología matemática de machine learning (que de momento puedes ignorar):

 θ representa tus pesos actuales. J(θ) significa el costo de tus pesos actuales

Esta ecuación representa el error de tu estimación de precio de venta final con la combinación de pesos actuales.

Si representamos gráficamente esta ecuación de costes usando todas las posibles combinaciones de pesos para habitaciones y metros cuadrados, obtendríamos una imagen bastante similar a la siguiente:

La gráfica de nuestra ecuación de costos parece un tazón. Los ejes verticales representan el coste.

En esta gráfica, el punto más bajo, en azul, muestra donde nuestro coste es el menor – por lo tanto, donde nuestra función está más ajustada. Los puntos más altos son donde estamos más equivocados. Entonces, si podemos encontrar los pesos que nos lleven al punto más bajo de esta gráfica, ¡tendríamos nuestra mayor eficiencia!

Ahora solamente debemos ajustar nuestros pesos como si estuviéramos caminando en dirección al “valle de una montaña”, que es donde el coste es el menor. Si continuamos haciendo pequeños ajustes en nuestras combinaciones de pesos, eventualmente llegaremos ahí sin tener que intentar todas las combinaciones posibles de pesos.

Si recuerdas algo de tus clases cálculo, si tomas la derivada de una función, te dirá la pendiente de la tangente de la función en cualquier punto. En otras palabras, te dirá como ir bajar al valle desde cualquier punto de la montaña.

Entonces… si calculamos una derivada parcial de nuestra función de coste con respecto a cada uno de los pesos, podemos restar ese valor de cada peso. Eso nos llevará un paso más cercano al centro del valle, y si lo continúas haciendo llegarás eventualmente al centro.

Esto es una explicación de muy alto nivel de lo que es batch gradient descent, una de las mejores maneras de encontrar el peso de tu función. No tengas miedo de meterte en profundidad en este concepto si estás interesado en entenderlo en detalle.

Cuando usas una librería de aprendizaje automático para resolver un problema real, esta realizará todo lo anteriormente mencionado por ti. Sin embargo, si creemos conveniente que conozcas con detalle que es lo que está pasando por debajo.

¿Qué otras cosas no me estas contado?

El algoritmo de tres pasos descrito anteriormente es el llamado regresión linear multivariable. Estás estimado la ecuación de una línea que pasa por todos los puntos que representan el conjunto de datos de las ventas de las casas. Después usas la ecuación para estimar un valor desconocido, en este caso el precio final de la venta basándote en el conjunto de datos de una casa, con la excepción del precio de venta, que no conocías hasta ahora. Este algoritmo es una poderosa herramienta que puedes utilizar para resolver problemas de la vida diaria.

Pero mientras este enfoque puede funcionar en casos simples, no funcionará en situaciones más complejas. Una de las razones es que no siempre los precios de las casas se determinan a través de una serie de variables que cambian de manera lineal.

Por suerte hay muchas otras maneras de resolver problemas más complejos. Existen muchos otros algoritmos de machine learning que pueden usar datos no lineales (como redes neuronales o SMVs con kernels). También hay maneras en las que se puede usar la regresión lineal de maneras más ingeniosas para poder usar líneas más complicadas. En todos los casos, la idea básica de encontrar la mejor combinación de pesos es la misma.

También, se ha ignorado la idea de overfitting. Es muy fácil equivocarte y encontrar una combinación de pesos que funcionen para estimar los precios de las casas de tus datos originales, pero que nunca funcionaran con otras casas. Claro, existen maneras de no caer en el overfitting, como la regularización y usar datos de validación cruzada. Aprender como trabajar con estas variaciones forma parte de la aplicación correcta del aprendizaje automático.

En otras palabras, aunque el concepto inicial del machine learning es bastante sencillo, requiere habilidad y experiencia para aplicarlo y obtener resultados significativos, sin embargo, cualquier desarrollador puede aprender estas habilidades.

¿El machine learning es magia?

Una vez que te das cuenta de lo fácil que es aplicar técnicas de machine learning a problemas que parecen difíciles (como por ejemplo el reconocimiento de caracteres escritos a mano), empiezas a sentir que puedes usar machine learning para resolver cualquier problema y obtener una respuesta satisfactoria siempre y cuando tengas suficientes datos. ¡Solo alimenta los datos y observa como el ordenador es capaz de encontrar mágicamente la respuesta!

Pero es importante recordar que el machine learning solo funciona si el problema se puede resolver con los datos que tienes.

Por ejemplo, si construyes un modelo que predice los precios de las casas basado solo en el número de plantas que hay en cada edificio, nunca va a funcionar. Simple y sencillamente no existe relación alguna entre el número de plantas y el precio de venta de una casa, por lo que no importa cuantas veces lo intentes, el ordenador nunca encontrará una relación fiable entre los dos.

Solo puedes modelar relaciones que existen

Así que, recuerda…, si un humano no puede usar los datos para resolver el problema de forma manual, una computadora no podrá tampoco. En lugar de esto, céntrate en resolver problemas que un humano puede resolver, pero sería mucho mejor si un ordenador lo pudiera hacer de manera más rápida.

¿Cómo aprender más acerca del machine learning?

El mayor problema con el machine learning es que actualmente todo el aprendizaje posible solo existe a nivel académico y en grupos de investigación de empresas privadas. No existe mucho material para aquellas personas que quieren entender un poco más sin necesariamente querer volverse expertos.

El curso gratuito de Andrew Ng que puedes encontrar Coursera es fantástico, te recomiendo ampliamente empezar por el. Cualquier persona que haya estudiado informática y recuerde lo mínimo de matemáticas podrá aprovecharlo. También puedes aprender más descargando y usando SciKit-Learn, un framework de Python que contiene todos los algoritmos estándares de machine learning.

Si te gustó este artículo, considera seguirme en Twitter para que puedas estar informado cada vez que publique un nuevo artículo que pueda ser de tu interés.

Me encararía que pudieras comentar y compartir más abajo con otros lectores de este blog tus experiencias con Machine Learning y como conseguir que sea más fácil de entender para los no iniciados.

Deja un comentario

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