Introducción a la Teoría de Aprendizaje de Máquina y sus Aplicaciones: Un Tutorial Visual con Ejemplos

View all articles

El Aprendizaje de Máquina (AM) está formando su propio nombre, con un reconocimiento en crecimiento que muestra que AM puede jugar un papel importante dentro de una gran gama de aplicaciones cruciales, como lo son minería de datos, procesador de idioma natural, reconocimiento de imagen y sistemas de expertos. AM provee posibles soluciones en todos estos dominios y más. Además está creada para ser un pilar de nuestra civilización futura.

El suplemento de diseñadores con habilidad AM no llega todavía a la demanda. Una gran parte de esto es porque AM es simplemente complicado. Este tutorial introduce lo básico de la teoría de Aprendizaje de Máquina, explicando los temas comunes y conceptos haciendo más fácil de seguir la lógica y encontrar la comodidad con el tema.

Esta máquina curiosa está aprendiendo aprendizaje de máquinas sin supervisión.

¿Qué Es El Aprendizaje De Máquina?

¿Entonces, qué es exactamente “Aprendizaje de Máquina”? AM es de hecho muchas cosas. El campo es muy vasto y se está expandiendo rápidamente y continuamente está siendo particionado y sub-particionado sin descanso, en sub-especialidades y tipos de aprendizaje de máquina.

Sin embargo, hay un denominador común básico y el tema dominador se resume mejor con esta declaración frecuentemente citada, hecha por Arthur Samuel en 1959: “[Aprendizaje de máquina es el] campo de estudio que da a las computadoras la habilidad de aprender sin ser programadas explícitamente.”

Y más recientemente, en 1997, Tom Mitchell dio una definición “bien planteada” que ha demostrado ser más útil para los tipos de ingeniería: “Se dice que un programa de computadora aprende de experiencia E, con respecto a alguna tarea T y alguna medida de desempeño P, mejora con experiencia E.”

“Se dice que un programa de computadora aprende de experiencia E, con respecto a alguna tarea T y alguna medida de desempeño P, mejora con experiencia E, si su desempeño en T, como fue medido con P, mejora con experiencia E.” -- Tom Mitchell, Carnegie Mellon University

Así que si quieres que tu programa prediga, por ejemplo, patrones de tráfico en una intersección ocupada (prueba T), lo puedes arruinar usando un algoritmo de aprendizaje de máquina, con data sobre patrones de tráfico antiguo (experiencia E) y, si lo ha “aprendido” exitosamente, hará un mejor trabajo al predecir futuros patrones de tráfico (Medida de desempeño P).

La altamente compleja naturaleza de muchos problemas de la vida real, comúnmente significa que inventar algoritmos especializados que los resolverían perfectamente todo el tiempo, no es práctico y hasta imposible. Algunos ejemplos de problemas en el aprendizaje de máquina incluyen, “¿Esto es cáncer?”, “¿Cuál es el valor de mercado de esta casa?”, “¿Cuál de estas personas son buenos amigos?”, “¿Explotará este motor de cohete en el despegue?”, “¿Le gustará esta película a esta persona?”, “¿Quién es él/ella?”, “¿Qué dijiste?”, y “¿Cómo se vuela esto?”. Todos estos problemas son un excelente foco para un proyecto AM, y de hecho, AM ha sido aplicado a cada uno con gran éxito.

AM resuelve problemas que no pueden ser resueltos a través de medios numéricos únicamente.

Entre los diferentes tipos de tarea AM, se traza una distinción crucial entre aprendizaje supervisado y no supervisado:

  • Aprendizaje de máquina supervisado: El programa está “entrenado” en un set pre-definido de “ejemplos de entrenamiento”, lo cual después facilitó su habilidad de alcanzar una conclusión acertada cuando se le pasa nueva data.
  • Aprendizaje de Máquina no supervisado: Al programa se le da una cantidad de data y debe encontrar patrones y relaciones dentro de éste.

Primeramente, nos vamos a enfocar en aprendizaje supervisado pero el final del artículo incluye una discusión breve sobre aprendizaje no supervisado, con algunos links para aquellos interesados en continuar en el tema.

Aprendizaje de Máquina Supervisado

En la mayoría de las aplicaciones del aprendizaje supervisado, lo que se quiere lograr es crear una función de predicción bien perfeccionada h(x) (a veces llamada la “hipótesis”). “Aprender” consiste en usar algoritmos matemáticos para optimizar esta función para que, al darle data x sobre cierto dominio (digamos, pies cuadrados de una casa), hará una predicción precisa de un valor interesante h(x) (digamos, precio de mercado para dicha casa).

En práctica, x casi siempre representa múltiples puntos de data. Así que, por ejemplo, un pronosticador de precios de casas podría no solo tomar pies cuadrados (x1) pero también cantidad de cuartos (x2), cantidad de baños (x3), cantidad de pisos (x4), años de construcción (x5), código postal (x6), y así sucesivamente. Determinar cuáles entradas usar es parte importante del diseño AM. Sin embargo, por el bien de la explicación, es más fácil asumir que se usa solo un valor de entrada.

Digamos que nuestro pronosticador simple tiene esta forma:

donde y son constantes. Nuestra meta es encontrar los valores perfectos de y hacer que nuestro pronosticador funcione lo mejor posible.

Optimizar el pronosticador h(x) ya no usa ejemplo de entrenamiento. Por cada ejemplo de entrenamiento, tenemos un valor de entrada x_train, por el que se conoce previamente una salida correspondiente, y. Por cada ejemplo, encontramos la diferencia entre el valor correcto conocido y, y nuestro valor pronosticado h(x_train). Con suficientes ejemplos de entrenamiento, estas diferencias nos dan una manera útil de medir lo “errado” de h(x). Después podemos modificar un poco h(x) al alterar los valores de y para hacerlo “menos errado”. Este proceso se repite una y otra vez hasta que el sistema ha unido los mejores valores para y . De esta manera, el pronosticador pasa a ser entrenado y está listo para hacer predicciones de la vida real.

Un Ejemplo Simple de Aprendizaje de Máquina

En este post, mantenemos los problemas simples por el bien de la ilustración, pero la razón por la que AM existe es porque, en la vida real, los problemas son mucho más complejos. En esta pantalla plana podemos hacer un dibujo de, máximo, un set de data tridimensional pero los problemas AM comúnmente tratan con data con millones de dimensiones y funciones de predicción muy complejas. AM resuelve problemas que no pueden ser resueltos a través de medios numéricos únicamente.

Con eso en mente, veamos un ejemplo simple. Digamos que tenemos la siguiente data de entrenamiento, donde los empleados de la compañía han calificado su satisfacción en escala del 1 al 100:

La satisfacción del empleado calificada por salario es un gran ejemplo de aprendizaje de máquina.

Primero, puedes ver que los datos son algo ruidosos. Esto se debe a que a pesar de que podemos ver que hay un patrón (la satisfacción de los empleados tiende a subir a medida que sube el salario), no todo encaja en una línea recta. Este siempre va a ser el caso con datos reales (¡y definitivamente queremos entrenar nuestra máquina con datos reales!). Entonces, ¿cómo podemos entrenar una máquina para que prediga a la perfección el nivel de satisfacción de un empleado? La verdad es que no podemos. La meta del AM no es adivinar a la “perfección”, debido a que el AM se ocupa de dominios donde no existe tal cosa. La meta es hacer predicciones que sean lo suficientemente buenas para ser útiles.

Aquí podemos recordar la famosa declaración del Matemático y Profesor de Estadísticas Británico George E. P. Box que dice “todos los modelos están mal pero algunos son útiles”.

La meta del AM no es adivinar a la “perfección”, debido a que el AM se ocupa de dominios donde no existe tal cosa. La meta es hacer predicciones que sean lo suficientemente buenas para ser útiles.

El AM se basa fuertemente en estadísticas. Por ejemplo, cuando entrenamos a nuestra máquina para que aprenda tenemos que darle una muestra aleatoria estadísticamente significativa como datos de entrenamiento. Si el set de entrenamiento no es aleatorio, existe la posibilidad de que la máquina aprenda patrones que en realidad no están en la muestra. Y si el set de entrenamiento es muy pequeño (lee la ley de los grandes números), no sabremos mucho y puede ser que se obtengan resultados inconclusos. Por ejemplo si intentamos predecir patrones de satisfacción de toda una compañía recolectando datos solamente de los gerentes, probablemente tendríamos muchos errores.

Sabiendo esto, ahora le daremos a nuestra máquina los datos que nos dieron arriba para que los aprenda. Primero tenemos que inicializar nuestro predictor h(x) con valores razonables de and . Ahora nuestro predictor se verá así cuando este en el set de entrenamiento:

Un predictor de aprendizaje de máquina sobre un set de entrenamiento.

Si le preguntamos a este predictor por la satisfacción de un empleado que gane $60k, mostraría un índice de 27:

En esta imagen, la máquina aun no aprende a predecir un resultado probable.

Obviamente se puede ver que esta una predicción muy mala y esta máquina aún no sabe mucho.

Ahora démosle a este predictor todos los sueldos de nuestro set de entrenamiento, luego compararemos las diferencias entre los resultados de satisfacción predichos y los índices de satisfacción reales de los empleados correspondientes. Si hacemos un poco de magia matemática (la cual explicaré a continuación) podemos calcular, con gran certeza, los valores de 13.12 de y 0.61 para nos daría una mejor predicción.

En este caso el predictor del aprendizaje de máquina se está acercando más.

Si repetimos este proceso, por ejemplo unas 1500 veces, nuestro predictor terminará viéndose así:

Con muchas repeticiones, el proceso de aprendizaje de máquina comienza a tomar forma.

A estas alturas si repetimos el proceso encontraremos que y no hay cambio de ninguna cantidad estimable y por eso vemos que el sistema ha convergido. Si no nos hemos equivocado, eso significa que encontramos el predictor más óptimo. Ahora, si le preguntamos nuevamente a la máquina por el índice de satisfacción del empleado que gana $60k, hará una predicción de un índice de más o menos 60.

En este ejemplo, la máquina aprendió a predecir un punto de datos probable.

Ahora sí estamos yendo a algún lado.

Nota Sobre Complejidad

El ejemplo de antes es técnicamente un problema sencillo de regresión lineal univariante, el cual puede ser resuelto al derivar una ecuación sencilla y así nos saltaríamos todo el proceso de “afinación”. Aun así piensa por un momento en un predictor que se viera así:

Esta función toma datos de entrada en cuatro dimensiones y tiene una variedad de términos polinómicos. Derivar una ecuación normal para esta función es un gran reto. Muchos problemas de aprendizaje de máquina modernos toman en cuenta miles e incluso millones de dimensiones de datos para crear predicciones usando cientos de coeficientes. Predecir cómo se expresará el genoma de un organismo o cómo será el clima dentro de 50 años son algunos ejemplos de estos problemas complejos.

Muchos problemas de AM modernos toman en cuenta miles e incluso millones de dimensiones de datos para crear predicciones usando cientos de coeficientes.

Por suerte, el enfoque iterativo que toman los sistemas AM es mucho más resistente cuando se trata de tales complejidades. En lugar de usar fuerza bruta, un sistema de aprendizaje de máquina “siente todo” hasta encontrar la respuesta. Para grandes problemas esto funciona mucho mejor. Aunque esto no significa que el AM puede resolver cualquier problema complejo arbitrario (no puede), sí significa que es una herramienta muy eficaz y flexible.

Descendencia de Gradiente – Minimizando las “Equivocaciones”

Veamos con detenimiento cómo funciona este proceso iterativo. En el ejemplo de arriba, ¿cómo nos aseguramos que y están mejorando y no empeorando? La respuesta está en nuestra “medición de equivocación”, la cual ya hemos mencionado, junto a un pequeño cálculo.

La medición de equivocación se define como función de costo (es decir, función de pérdida), . La entrada representa todos los coeficientes que usamos en el predictor. En este caso, es en realidad el par y . esto nos da una medición matemática de lo equivocado que esta nuestro predictor cuando se usa los valores dados de y .

La opción de función de costos es otra pieza importante de un programa de AM. En diferentes contextos, “equivocarse” puede significar diferentes cosas. En nuestro ejemplo de satisfacción de empleado el estándar establecido es la función de mínimos cuadrados:

Con los mínimos cuadrados, la penalización por una mala suposición sube cuadráticamente entre la suposición y la respuesta correcta, por lo que actúa como una medición de equivocación muy “estricta”. La función de costo almacena una penalidad promedio de todos los ejemplos de entrenamiento.

Nuestra meta es encontrar y para nuestro predictor h(x) y que nuestra función de costo sea lo más pequeña posible. Para lograrlo recurrimos al poder de cálculo.

Considera la siguiente gráfica de una función de costo para un problema particular de AM:

El gráfico representa un diagrama de forma de tazón de una función de costos para un ejemplo de aprendizaje de máquina.

Aquí podemos ver el costo asociado a los valores de y . Podemos ver que la gráfica tiene una ligera forma de tazón. El fondo del tazón representa el costo más bajo que nuestro predictor puede calcular basado en los datos de entrenamiento proporcionados. La meta es “bajar por la colina” y encontrar y correspondiente a este punto.

Aquí es donde entra el cálculo en este tutorial de aprendizaje de máquina. Para mantener la explicación sencilla, no voy a escribir las ecuaciones pero básicamente lo que hacemos es tomar el gradiente de , que es el par de derivadas de (uno sobre y uno sobre ). El gradiente será diferente para cada valor diferente de y , y nos dice cual es “la pendiente de la colina” y en particular, “hacia donde es abajo”, para este particular s. Por ejemplo cuando introducimos nuestros valores actuales de en el gradiente, podría decirnos que agregar un poco de y restándole un poco de nos llevará en dirección al piso de la función de costo. Por lo que añadimos un poco a , y restamos un poco de , y ¡voilà! Hemos terminando una parte de nuestro algoritmo de aprendizaje. Nuestro predictor actualizado, h(x) = + x, nos dará mejores predicciones que antes. Nuestra máquina es un poco más inteligente ahora.

Este proceso de alternar entre calcular el gradiente actual y actualizar el s de los resultados es conocido como descendencia de gradiente o gradient descent.

Esta imagen muestra un ejemplo de una descendencia de gradiente de aprendizaje de máquina.

Esta imagen muestra el número de iteraciones para este tutorial de aprendizaje de máquina.

Esto abarca la teoría básica subyacente que representa la mayoría de los sistemas de Aprendizaje de Máquina supervisado. Pero los conceptos básicos pueden ser utilizados de diferentes formas dependiendo del problema.

Problemas de Clasificación

Del AM supervisado, existen dos sub-categorías importantes:

  • Sistemas de Regresión de Aprendizaje de Máquina: Sistemas donde el valor que se predice está en algún lugar de un espectro continuo. Estos sistemas nos ayudan con preguntas tipo “¿Cuánto es?” o “¿Cuántos son?”.
  • Sistemas de Clasificación de Aprendizaje de Máquina: Sistemas en los cuales se busca una predicción de sí-o-no, por ejemplo: “¿Este tumor es cancerígeno?”, “¿Esta galleta pasó nuestro estándar de calidad?” y preguntas por el estilo.

Y resulta que la teoría subyacente es más o menos igual. Las diferencias más grandes son el diseño del predictor h(x) y el diseño de la función de costo .

Nuestros ejemplos hasta ahora se han concentrado en problemas de regresión, así que ahora veamos un ejemplo de clasificación.

Aquí se muestran los resultados de un estudio de una prueba de calidad de una galleta, en el que los ejemplos de entrenamiento fueron etiquetados como “galleta buena” (y = 1) en azul o “galleta mala” (y = 0) en rojo.

Este ejemplo muestra como un predictor de regresión de aprendizaje de máquina no es la solución adecuada.

En clasificación, un predictor de regresión no es muy útil. Usualmente lo que queremos es un predictor que realice una suposición entre 0 y 1. En una clasificación de calidad de una galleta, una predicción de 1 representaría una suposición muy confiada de que la galleta es excelente y exquisitamente sabrosa. Una predicción de 0 representa una gran confianza de que la galleta es una vergüenza para la industria de las galletas. Los valores que se encuentran en este rango representan menos seguridad, por lo que podríamos diseñar nuestro sistema para que una predicción de 0.6 signifique “Oye, eso es una decisión difícil pero voy a decir que sí, sí puedes vender esa galleta,” mientras que un valor exactamente en el medio, 0.5, podría representar total incertidumbre. Esta no es siempre la forma en que la confianza se atribuye en un clasificador pero es un diseño bastante común y funciona para explicar nuestra ilustración.

Hay una buena función que captura este comportamiento muy bien. Se llama la función sigmoide, g(z), y es algo así:

La función sigmoide en funcionamiento realizando un ejemplo de aprendizaje de máquina supervisado.

z es una representación de nuestros datos de entrada y coeficientes, tales como:

Así, nuestro predictor se convierte en:

Puedes ver que la función sigmoide transforma nuestra salida a un rango entre 0 y 1.

La lógica del diseño de la función de costo también es diferente en la clasificación. Nuevamente preguntamos, ¿Qué significa que una suposición éste equivocada? Esta vez una muy buena regla del pulgar es que si la suposición correcta es 0 y nosotros dijimos 1, entonces estábamos completamente equivocados y viceversa. Y como no puedes estar más equivocado que la equivocación, la penalización en este caso es enorme. Ahora, si la suposición correcta fuera 0 y nosotros dijimos 0, nuestra función de costo no debería agregar ningún costo cada vez que esto pasa. Si la suposición fuera la correcta pero no estamos completamente seguros que sea así, (e.g. y = 1, but h(x) = 0.8), esto debería tener un pequeño costo y si nuestra suposición fuera incorrecta pero no estuviéramos seguros de ello (e.g. y = 1 but h(x) = 0.3), esto debería tener algún costo significativo pero no tanto como si estuviéramos completamente equivocados.

Este comportamiento es capturado por la función de registro de forma que:

De nuevo, la función de costo nos da un promedio de costo sobre todos nuestros ejemplos de entrenamiento.

Y así aquí describimos como el predictor h(x) y la función de costo se diferencian en regresión y clasificación pero la descendencia de gradiente sigue funcionando igual.

Un pronosticador de clasificación se puede visualizar al dibujar la línea fronteriza; ej., la barrera donde la predicción cambia de un “si” (una predicción mayor a 0.5) a un “no” (una predicción menor a 0.5). Con un sistema bien diseñado, nuestra data de la galleta puede generar una frontera que se parece a esto:

Una gráfica de un ejemplo de aprendizaje de máquina, completado usando la función   sigmoide.

Ahora ¡esa es una máquina que conoce una cosa o dos sobre galletas!

Una Introducción a las Redes Neuronales

Ninguna discusión sobre AM estaría completa sin al menos mencionar las redes neuronales. Estas no solo ofrecen una herramienta extremadamente poderosa para resolver problemas difíciles pero también ofrecen pistas sobre cómo funcionan nuestros cerebros, al igual que intrigantes posibilidades para algún día crear máquinas inteligentes.

Las redes neuronales son excelentes para problemas de aprendizaje de máquina en los que las entradas son gigantes. El costo computacional de manejar dichos problemas es muy abrumador para los tipos de sistemas que hemos discutido arriba. Pero resulta que las redes neuronales pueden ser afinadas efectivamente usando técnicas que son sorprendentemente similares a la descendencia gradiente en principio.

Una discusión explicita sobre las redes neuronales va más allá de la información de este artículo, pero recomiendo revisar nuestro post anterior que trata el tema.

Aprendizaje de Máquina Sin Supervisión

Un aprendizaje sin supervisión, normalmente, se le asigna encontrar relaciones entre data. No hay ejemplos de entrenamiento usados en este proceso. En su lugar, se le da al sistema un set de data y se le asigna la tarea de buscar patrones y correlaciones dentro de éste. Un buen ejemplo es identificar grupos de amigos cercanos en data de redes sociales.

Los algoritmos usados para lograr esto, son muy distintos a aquellos usados para el aprendizaje supervisado y el tema amerita su propio artículo. Sin embargo, para tener algo mientras tanto, revisa [agrupamiento de algoritmos] (https://en.wikipedia.org/wiki/Cluster_analysis) como lo son k-means, y también revisa reducción de dimensionalidad sistemas como análisis de componente principal. Nuestro [post de gran data] (https://www.toptal.com/big-data#hiring-guide) discute un número de estos temas en más detalle.

Conclusión

Hemos cubierto mayor parte de la teoría básica subyacente al campo de Aprendizaje de Máquina pero, por supuesto, apenas hemos tocado la superficie.

Ten en mente que para aplicar las teorías presentes en esta introducción a ejemplos del aprendizaje de máquina de la vida real, es necesario una comprensión más profunda de los temas discutidos aquí. Hay muchas sutilezas y obstáculos en AM y muchas maneras de desviarse gracias a lo que parece ser una máquina de pensar bien afinada. Casi todas las partes de la teoría básica pueden ser alteradas o se puede jugar con ellas de muchas maneras y los resultados son, a menudo, fascinantes. Muchos se convierten en nuevos campos de estudio que corresponden mejor a un problema particular.

Claro está que el Aprendizaje de Máquina es una herramienta increíblemente poderosa. En los años venideros, promete ayudar a resolver algunos de nuestros problemas más inmediatos, al igual que abrir nuevos mundos de oportunidades. La demanda de ingenieros AM continuará creciendo y ofrecerá increíbles oportunidades de ser parte de algo especial. ¡Espero que consideres ser parte de la acción!


Reconocimiento

Este artículo se basa fuertemente en el material enseñado por el profesor de Stanford, el Dr. Andrew Ng en su curso abierto y gratis de Aprendizaje de Máquina. El curso cubre todo lo que discutimos en este artículo en más profundidad, y da muchos consejos prácticos para el practicante de AM. Recomiendo este curso con mucho ahínco para aquellos interesados en seguir explorando este campo tan fascinante.

About the author

Nick McCrea, United States
member since February 5, 2014
Nicholas is a professional software engineer with a passion for quality craftsmanship. He loves architecting and writing top-notch code, and is proud of his ability to synthesize and communicate ideas effectively to technical and non-technical folks alike. Nicholas always enjoys a novel challenge. [click to continue...]
Hiring? Meet the Top 10 Freelance Machine Learning Engineers for Hire in April 2017
Don't miss out.
Get the latest updates first.
No spam. Just great engineering posts.
Don't miss out.
Get the latest updates first.
Thank you for subscribing!
You can edit your subscription preferences here.

Comments

comments powered by Disqus