¡El Machine Learning es divertido! (Parte 1)

Machine Learning

¿Has escuchado a la gente hablando de machine learning (aprendizaje automático), pero únicamente tienes una idea vaga de lo que esto significa? ¿Está cansado de asentir con la cabeza durante conversaciones con compañeros de trabajo cuando hablan de inteligencia artificial? ¡Cambiemos eso!

Esta guía es para cualquier persona que tenga curiosidad acerca del machine learning, pero no tiene idea de por dónde empezar. Seguramente muchos de ustedes trataron de leer el artículo de Wikipedia, se frustraron y se rindieron porque lo que realmente necesitaban era alguien que les diera una introducción de alto nivel. Pues no busquen más, esta serie de entradas de blog son justamente eso.

El objetivo de estas guías es que sean accesibles para cualquier persona – por lo que hay muchas generalizaciones y atajos en la terminología. ¿Pero a quien le importa? Si con esto logramos que más personas entiendan y se interesen en el machine learning, cumplieron su objetivo.

Prefacio

Después de darme cuenta que no existe buena literatura en español acerca del machine learning, decidí contactar a Adam Geitgey para poder traducir y adaptar su excelente serie de artículos en esta materia.

Texto original: https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471#.du3vwj3d4

¿Qué es el machine learning?

 El machine learning se refiere al uso de algoritmos genéricos que te pueden decir algo interesante de un conjunto de datos sin tener que escribir código especifico al problema. En lugar de escribir código, alimentas tus datos al algoritmo genérico y este construye su propia lógica basándose en los datos.

Por ejemplo, un tipo de algoritmo son aquellos de clasificación, que pueden poner datos en diferentes grupos. El mismo algoritmo de clasificación usado para reconocer caracteres escritos a mano, también puede ser usado para clasificar si un correo electrónico es spam o no, sin cambiar una sola línea de código. Es el mismo algoritmo, pero alimentado con diferentes datos por lo que genera una lógica de clasificación diferente.

Este algoritmo de machine learning es una caja negra que puede ser reusado para diferentes problemas de clasificación.

Este algoritmo de machine learning es una caja negra que puede ser reusado para diferentes problemas de clasificación.

Machine learning es un término que cubre a todos estos algoritmos genéricos.

Los dos tipos de algoritmos de machine learning

Puedes clasificar los algoritmos usados en machine learning en dos grandes categorías – aprendizaje supervisado y aprendizaje no supervisado. Entre los dos, la diferencia es muy sencilla pero muy importante.

Aprendizaje supervisado

Imaginémonos por un momento que eres un agente inmobiliario. Tu negocio está creciendo porque contratas a varios agentes novatos para que te ayuden. Pero existe un problema – tú puedes ver una casa y tener una idea del valor de la casa, pero tus agentes novatos no tienen la experiencia así que no pueden estimar correctamente el valor de las casas con solo verlas como tú.

Para ayudar a tus agentes novatos (y posiblemente tener tiempo para irte de vacaciones), decides crear una aplicación que puede estimar correctamente el valor de una casa basado en su tamaño, la colonia y el valor de las casas con características similares que se han vendido últimamente.

Por lo que empiezas a anotar el valor de las casas que se venden en tu ciudad durante 3 meses. Para cada casa, escribes todos los detalles que puedes – número de habitaciones, metros cuadrados de construcción, colonia, etc. Así como el dato más importante, el precio final de venta.

HabitacionesMetros cuadradosColoniaPrecio final
32,000Guadalajara$250,000.00
2800Zapopan$300,000.00
2850Guadalajara$150,000.00
1550Guadalajara$78,000.00
42,000Ciudad de México$150,000.00
Estos son nuestros datos de entrenamiento para alimentar el algoritmo

Usando esta información de entrenamiento, queremos crear una aplicación que pueda estimar el precio final de venta de la siguiente casa:

HabitacionesMetros cuadradosColoniaPrecio final
32,000Zapopan¿?
Usando los datos de entrenamiento, queremos estimar el precio final de esta casa

A esto se le llama aprendizaje supervisado. Tú conoces el precio de venta final para cada casa, tú sabes la respuesta al problema y puedes trabajar hacia atrás y descifrar la lógica del problema.

Para desarrollar tu aplicación, alimentas el algoritmo de machine learning con los datos de entrenamiento. A partir de esto, el algoritmo intentará descifrar que tipo de matemática necesita hacer para que dé la respuesta correcta.

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

¡Qué desesperación tener las respuestas incompletas!

A partir de esto, ¿Puedes descifrar las respuestas correctas? Ya sabes que tienes que hacer algo (pero no sabes que) con los números de la izquierda para obtener las respuestas de la derecha.

En el aprendizaje supervisado, dejas a la computadora descubrir esta relación por ti. Y una vez que descubre la relación para este grupo específico de problemas que vimos en el ejemplo, puede resolver cualquier otro tipo de problemas del mismo tipo.

Aprendizaje no supervisado

Vamos a regresar a nuestro ejemplo original con un agende inmobiliario. ¿Qué pasa si no conoces el precio final de venta de casa? Aunque solo sepas los metros cuadrados y la locación de la casa, aun puedes hacer cosas bastante interesantes. A esto se le llama aprendizaje no supervisado.

HabitacionesMetros cuadradosColonia
32,000Guadalajara
2800Zapopan
2850Guadalajara
1550Guadalajara
42,000Ciudad de México
Aunque no estés tratando de predecir un número desconocido (como en este caso, el precio final de venta), puedes hacer otras inferencias con machine learning

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

¿Qué podrías hacer con esta información? Para empezar, podrías hacer que un algoritmo identifique los mercados potenciales de los compradores de casa de manera automática. A lo mejor descubres con estos datos que los compradores de casas en una colonia cerca de una universidad prefieren las 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 podría ayudarte a ti como agente inmobiliario en canalizar correctamente tus esfuerzos de mercadotecnia.

Otra cosa interesante que podrías hacer es identificar aquellas casas atípicas. Posiblemente estas propiedades son mansiones y te conviene enfocar tus mejores vendedores en ellas por qué venderlas dejan grandes comisiones.

En el resto de esta entrada de blog nos vamos a enfocar en aprendizaje supervisado, pero no porque el aprendizaje no supervisado sea menos útil o interesante. De hecho, el aprendizaje no supervisado está obteniendo día con día más importancia debido a que los algoritmos se están volviendo mejores en obtener patrones y relaciones en los datos.

Que interesante, ¿Pero estimar el precio de una casa realmente cuenta como machine learning?

Como humanos, nuestro cerebro está preparado para estar en cualquier situación y sobrellevarla sin ninguna instrucción explicita de cómo hacerlo. Si te dedicas a vender casas por un largo periodo de tiempo, de manera instintiva empezaras a “sentir” el precio ideal de una casa, la mejor manera de venderla, que cliente estaría interesada en ella, etc. El objetivo final de la investigación en inteligencia artificial es replicar esta habilidad de los humanos usando computadoras.

Pero los algoritmos de machine learning no son tan buenos todavía, solo funcionan cuando se enfocan en un problema muy específico y limitado. A lo mejor la parte de learning no es tan buena definición para este caso, probablemente “desarrollar una ecuación para resolver un problema en específico basándose en datos de entrenamiento” es una definición más precisa, pero no es un buen nombre así que seguiremos usando machine learning.

Vamos creando la aplicación

Entonces, ¿Cómo podrías crear la aplicación que estime el precio final de una casa como en nuestro ejemplo? Piénsalo 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 estas:

def estimar_precio_venta_final_casa(habitaciones, metros_cuadrados, colonia):
 precio = 0

  # En mi colonia, el metro cuadrado se vende en $200
   precio_por_metro_cuadrado = 200

if colonia == "Zapopan":
  # Pero otras colonias son más caras
 precio_por_metro_cuadrado = 400

elif colonia == "Ciudad de México":
  # Otras colonias son más baratas
 precio_por_metro_cuadrado = 100

# empezar con un precio basado en el tamaño de la casa en metros cuadrados
 precio = precio_por_metro_cuadrado * metros cuadrados

# ahora ajustamos el precio final de venta en base al número de habitaciones
 if habitaciones == 0:
 # Los estudios son baratos
 precio = precio — 20000
 else:
  # los lugares con más habitaciones por lo regular son más caros
 precio = precio + (habitaciones * 1000)

return precio

Si juegas con esto durante horas y horas, a lo mejor vas a terminar con algo que funcione más o menos. Pero tu aplicación nunca será perfecta y va a ser difícil de mantener conforme los precios de venta cambien.

¿No sería mejor si la computadora encontrara la manera de realizar este cálculo por ti? No importa que haga exactamente la función, siempre y cuando regrese el número correcto.

def estimar_precio_venta_final_casa(habitaciones, metros_cuadrados, colonia):

precio = <por favor, computadora, regresa este valor por mi>

return precio

Una manera de pensar en este problema es que el precio es una sopa deliciosa y los ingredientes son el número de habitaciones, los metros cuadrados y la colonia. Si pudieras descifrar que tanto impacta cada ingrediente en el precio final de venta, podrías obtener la relación exacta de ingredientes que tienes que agregarle a la sopa para estimar el precio.

Esto reduciría tu aplicación original (con toda esa lógica difícil de mantener) a una función muy sencilla como esta:

def estimar_precio_venta_final_casa(habitaciones, metros_cuadrados, colonia):
 precio = 0

# una pizca de esto
 precio += habitaciones * .941231951398214

# y un toque de aquello
 precio += metros_cuadrados * 2231.1231232

# una cucharada aquí
 precio += colonia * 3.3242341422

# y finalmente, algo de sal para que quede en su punto
 precio += 301.23432096

return precio

¿Ya viste los números mágicos en negritas?  — .941231951398214, 2231.12312323.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.

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

Paso 1

Empecemos con el valor de los pesos en 1.0:

def estimar_precio_venta_final_casa(habitaciones, metros_cuadrados, colonia):
 precio = 0

# una pizca de esto
 precio += habitaciones * 1.0

# y un toque de aquello
 precio += metros_cuadrados * 1.0

# una cucharada aquí
 precio += colonia * 1.0

# y finalmente, algo de sal para que quede en su punto
 precio += 1.0

return precio

Paso 2

Ejecuta tu aplicación sobre las casas en las cuales conoces el precio final de venta:

HabitacionesMetros cuadradosColoniaPrecio finalPrecio final estimado
32,000Guadalajara$250,000.00$178,000.00
2800Zapopan$300,000.00$371,000.00
2850Guadalajara$150,000.00$148,000.00
1550Guadalajara$78,000.00$101,000.00
42,000Ciudad de México$150,000.00$121,000.00
Usa tu aplicación para estimar el precio final de cada casa

Por ejemplo, si la primera casa tenía un precio final de venta de $250,000.00 pero tu aplicación estimó que era $178,000.00, estás desfasado por $72,000.00 solo en esa casa.

Ahora suma el monto al cuadrado de desfase en cada casa que tienes en tus datos de aprendizaje. Supongamos que tienes 500 casas y el monto al cuadrado de que tanto tu aplicación se desfasó es de $86,123,173. Ese valor corresponde a que tan equivocada está tu aplicación.

Ahora, toma el total y divídelo entre 500 para obtener el promedio de que tanto estás desfasado en cada casa. A este promedio se le llama el costo de la función.

Si llegaras a que el costo fuera 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 costo 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 costo sea más cercano a cero es la que deberías usar. Una vez que encuentres esta combinación, resolviste el problema.

Es momento que te vuelvas loco

Eso fue bastante sencillo. Ahora piensa por unos minutos lo que acabas de lograr. Tomaste algunos datos, los alimentaste a tres sencillos y genéricos pasos y terminaste con una función que puede estimar el precio final de venta de una casa. Skynet, ¡Es hora de que vengas a la vida!

Aquí hay algunos hechos que te van a volver aún más loco:

  1. 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 mezcla de estos ingredientes en ciertas cantidades para obtener la respuesta correcta.
  2. Es muy probable que nunca sepas por qué una combinación particular de pesos funciona, por lo que acabas de crear una función que realmente no entiendes, pero puedes probar que funciona correctamente.
  3. Imagina por unos segundos que tu función en lugar de aceptar parámetros como metros cuadrados o habitaciones, tomara un arreglo 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 automóvil. Ahora imaginemos que, en lugar de calcular el precio final de venta, calculara “dirección_de_volante”. Felicidades, acabas de desarrollar una función que puede darle vuelta a tu volante automáticamente.

Que loco, ¿No?

¿Qué pasa con lo de 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, ya que tomaría para siempre porque nunca se te acabarían las combinaciones de números para intentar.

Para evitar esto, los matemáticos han descubierto muchas maneras ingeniosas para encontrar buenas combinaciones para los 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 tu función de costo

Continuemos con rescribir la misma ecuación usando terminología matemática de machine learning que podemos ignorar por lo pronto:

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

Esta ecuación representa que tan equivocada está tu estimación de precio de venta final con la combinación de pesos actuales.

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

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

En esta gráfica, el punto más bajo en azul es donde nuestro costo es el menor – por ende, donde nuestra función está menos equivocada. 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 respuesta.

Ahora solamente debemos ajustar nuestros pesos como si estuviéramos caminando al centro del tazón, que es donde el costo es el menor. Si continuamos haciendo pequeños ajustes a nuestras combinaciones de pesos, eventualmente llegaremos ahí si tener que intentar tantas combinaciones de pesos.

Tal vez recuerdas algo de tus clases cálculo en la preparatoria (Yo no, la verdad), y tal vez recuerdes que, 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 al centro del tazón desde cualquier punto.

Entonces calculando una derivada parcial de nuestra función de costo 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 tazón, 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 entender más a profundidad este concepto si estás interesado en entender el detalle fino.

Todo esto lo hará una librería de machine learning cuando necesites resolver un problema, pero aun así es útil conocer a detalle lo que está sucediendo por debajo.

¿Qué otras cosas no me han contado?

El algoritmo de tres pasos descrito es llamado regresión linear multivariable. Estás estimado la ecuación de una línea que pasa por todos los puntos que representan los datos de las ventas de las casas. Después usas la ecuación para estimar un valor desconocido, en este caso precio final de la venta, basado en qué punto existiría esa casa en tu línea. Es bastante poderoso este algoritmo y se puede utilizar para resolver problemas de la vida diaria.

Pero mientras este enfoque puede funcionar en casos simples, no funciona en situaciones más complejas. Una de las razones es que no siempre los precios de las casas son tan simples para existir en una línea continua.

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.

Adicionalmente, ignoramos 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 funcionen para otras casas. Claro, existen maneras de no caer en el overfitting, como la regularización y usar datos de validación cruzada.

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

¿El machine learning es magia?

Una vez que te percatas lo fácil que es aplicar técnicas de machine learning a problemas que parecen difíciles (como 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 a la computadora encontrar mágicamente la respuesta!

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

Por ejemplo, si construyes un modelo que predice los precios de las casas basado en el número de plantas que hay en cada casa, 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 que tanto intentes, la computadora nunca encontrará una relación 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, enfócate en resolver problemas que un humano puede resolver, pero sería mucho mejor si una computadora lo pudiera resolver de manera más rápida.

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

El mayor problema con el machine learning actualmente es que casi todo el aprendizaje existe en el mundo de la academia y los 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.

La clase en Coursera de Andrew Ng’s es fabulosa, les recomiendo ampliamente empezar ahí. Cualquier persona que haya estudiado informática y recuerde lo mínimo de matemática podrá entenderlo. También puedes aprender más descargando y usando SciKit-Learn, un framework que contiene todos los algoritmos estándares de machine learning.

Si te gusto este artículo, considera suscribirte a nuestras redes sociales para que te mantengas informado cada que publiquemos un nuevo artículo que sea de tu interés.

¿Quieres aplicar el machine learning para resolver algún problema de tu empresa? En Chatbot México te podemos ayudar, ¡Contáctanos!

Autor: Luis Cosio

A hacker and serial entrepreneur from México.

5 opiniones en “¡El Machine Learning es divertido! (Parte 1)”

Deja un comentario

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