Machine Learning
Clase 21 de 35 • Curso Profesional de Data Science 2016
Un poco de contexto sobre machine learning
Ya hemos hecho bastante de data science en este curso sin tocar realmente machine learning y para muchas personas esto puede parecer muy extraño.
Machine learning es muy importante. Pero lo más importante que debemos entender acerca de machine learning es que ya sabes, debemos formular los problemas de una forma que pueda ser pasada a los modelos de machine learning para interpretar.
Y que la formulación de problemas realmente es la habilidad en data science que toma el mayor tiempo para perfeccionar, el mayor tiempo para desarrollar.
Los modelos de machine learning normalmente, sin importar el tipo, se crean para dos fines:
- El primero es I&D, Investigación y Desarrollo
- El segundo fin es la predicción.
Pero en muchos casos, en la práctica, hay una especie de delgada línea entre ¿sabes qué? si de verdad funciona bien en estas situaciones de, digamos, predicción multiclase o lo que sea es algo con lo que en cierto modo estamos de acuerdo.
Así que, ¿En qué se diferencian los modelos de machine learning de los modelos estadísticos tradicionales?
El la mayoría de los casos, un modelo estadístico se efectúa tomando en cuenta un comportamiento previo, en el caso de un modelo de machine learning podemos llegar sin nada, aunque la respuesta puede ser menos acertada, es por eso que hablamos en esta parte de investigación y de predicción.
Entrenando un modelo de Machine Learning
Machine learning es el proceso de enseñarles a las computadoras a entender patrones en los datos, destinado a imitar ese proceso de cómo los humanos: "nosotros intuimos patrones en los datos y luego entendemos esos patrones, y hacemos predicciones."
El ejemplo al que más cariño le tengo de hecho es el de un radiólogo.
Quién busca en los rayos X y dice, bien estos rayos X muestran un tumor, y el otro de hecho no tiene un tumor.
Y entonces como humanos ¿Cómo hacemos esto?, ¿Cómo un radiólogo interpreta esto?
Y la forma en la que lo hacemos es viendo rayos X, consultando con expertos, y diciendo: "OK, aquí hay unos rayos X," y el experto dice: "este tiene un tumor.", aquí hay otros y el experto dice: "estos no tienen un tumor." Y conforme pasa el tiempo como radiólogos aprenden, cada día, viendo nuevos datos, nuevos ejemplos.
Y comenzamos a entender los patrones más y más, mejor y mejor,
Lo primero que entender sobre modelos de machine learning es que ellos realmente están haciendo lo mismo. Ellos están tomando esa imagen insertada con una etiqueta, y están entendiendo, intuyendo, descubriendo patrones en esa imagen, que relacionan las diferentes cosas que están presentes o no en esa imagen, con la pregunta: ¿Tenemos un tumor presente o no?
Y las diferencias fundamentales entre un humano y un modelo de machine learning, son esas dos cosas que he mencionado antes, la cantidad de datos que ese modelo puede recibir, y la velocidad a la que el modelo puede consumir esos datos.
¿Cómo tomamos una foto y la cuantificamos o codificamos en números?, Una sobre las maneras canónicas de hacer esto, es que una foto no es nada más que un conjunto de pixeles, y cada pixel tiene un valor numérico que describe el color de ese pixel.
Otro tipo de modelo de machine learning son los que se llaman modelos no supervisados.
Por ejemplo como niño, ya sabes, aprendes si te pegas con algo y duele, lo que no pasó aquí es alguien diciendo
"Si te pegas con esto, si haces esta acción, va a doler."
Entonces en modelos no supervisados, la diferencia fundamental en términos matemáticos es el vector de etiquetas atadas a nuestros ejemplos. Pero aún podemos pasar ejemplos a un modelo de machine learning, y hacer que hasta cierto punto entienda la estructura en ese modelo.
Tenemos muchos algoritmos de Machine Learning y separando un poco:
- Regresión y clasificación serán modelos supervisados.
- Agrupamiento y reducción de dimensionalidad serán modelos no supervisados.
Modelos de Machine Learning
Regresión
Los modelos de regresión son modelos que predicen valores continuos. Entonces, por ejemplo, un modelo de regresión podría predecir el número de minutos que el TransMilenio, que es el transporte público aquí en Bogotá, estaría retrasado en una determinada parada en un día determinado; podría predecir el número de votantes que una cabina de votación en Minneapolis necesitaría albergar; o podría predecir el número de pulgadas de lluvia que el desierto de Atacama recibirá el próximo año.
Y los modelos de regresión, por supuesto,son algoritmos de aprendizaje supervisado. Así que le alimentamos a estos modelos ejemplos que tienen, ya sabes, algún ejemplo codificado en el espacio vectorial.
Clasificación
Los modelos de clasificación predicen una etiqueta. Esta podría ser binaria en el caso del ejemplo de Twitter. “Sí, mi tweet contiene esta palabra clave” o “no, no la contiene”.
Podría ser: "¿Quién ganaría las elecciones presidenciales de los Estados Unidos? ¿Hillary o Trump?
Lo que por supuesto es un problema de clasificación binaria.
Algoritmos de agrupamiento
El agrupamiento se usa a menudo como un paso exploratorio en el análisis de datos. Y por supuesto, este es un tipo de algoritmo de machine learning no supervisado. Un ejemplo es agrupar canciones en Spotify codificadas como datos de frecuencia, mejor, datos de frecuencia de audio.
¿Cuántos tipos diferentes de canciones tenemos aproximadamente?
Es una canción alegre, canciones lentas, canciones con bajo, etc. Quizás tomamos esto como un paso exploratorio antes de aplicar etiquetas a cada canción de Spotify. De modo que quizás Spotify podría tener una pestaña de géneros donde dicen:
“Puedes ordenar tu música por el tipo de género en el que cae.”
Para algoritmos de agrupamiento hacemos una distinción entre verdaderos algoritmos de agrupamiento y algoritmos de partición:
Un algoritmo de partición pone cada punto que tenemos dentro de algún grupo. Básicamente hace una partición de nuestros datos,divide nuestros datos, estratifica nuestros datos dentro de grupos distintos.
Un algoritmo de agrupamiento aplica alguna lógica por la cual sólo está poniendo un punto dentro de un grupo si pasa ciertos criterios. Y posiblemente, si no lo hace, lo está dejando completamente por fuera.
Reducción de dimensionalidad
Finalmente hablaremos de algoritmos de reducción de dimensionalidad. Que es reducir un conjunto de vectores desde una cierta alta dimensionalidad hasta una baja dimensionalidad.
Esto es típicamente con dos fines:
- El primero es visualización.
En dos dimensiones es muy fácil, ¿verdad? Si nuestros datos, tienen dos dimensiones los ponemos en un plano x-y. Quizás tenemos un grupo por acá, un grupo por acá. Quizás vemos cómo diferentes valores varían entre sí, a medida que un valor sube, normalmente el otro baja, etc. etc. En 20,000 dimensiones en teoría podemos hacerlo, es decir, del mismo modo en que podemos construir visualizaciones en dos dimensiones. El punto es que el espacio de 20,000 dimensiones existe, justo como el espacio en dos dimensiones. Pero como humanos en realidad estamos limitados por nuestra propia intuición, nuestra propia capacidad de mirar fotos y entender lo que realmente nos están diciendo.
Como humanos, el espacio en dos dimensiones tiene sentido para nosotros.
- La segunda es el costo computacional.
Debido a que somos capaces de capitalizar la redundancia en nuestros datos y proyectar esos datos desde un espacio dimensional mayor hasta un espacio dimensional menor sin perder las diferencias entre los puntos de datos, sin perder demasiado de la variación entre las diferentes dimensiones de nuestros puntos de datos. De nuevo, podemos representar nuestros datos en un espacio dimensional menor. Y cuando pasamos estos vectores más pequeños a algoritmos de machine learning por supuesto cuanta menor es la dimensión en la que residen nuestros datos más rápidamente pueden trabajar nuestros algoritmos.
¿Qué modelo canónico Machine Learning funciona mejor?
Averiguar qué modelo funciona mejor en qué situación es 100% cuestión de práctica. Por supuesto existen criterios de orientación. Pero participar en competencias de modelos predictivos, leer publicaciones de blogs, y hacer estas cosas en el trabajo simplemente viendo cómo se desarrollan son realmente los únicos pasos para obtener esta intuición.
Regresión Lineal
Los modelos de regresión lineal deben usarse en casos en los que creemos que existe una relación lineal entre cada una de nuestras características, de nuestras entradas, las cuales son sinónimos, y nuestra salida.
Sí, que nuestros datos de hecho se ajustan a una tendencia lineal, por lo tanto: No tan poderoso Por esta razón, en casos de tareas de regresión, se supone que es uno de los primeros modelos que pruebes, sólo como un punto de partida.
Maquinas de Vectores de soporte
Este es normalmente un algoritmo de clasificación, pero también tiene varianza, de modo que puede ser usado para regresión. Lo que hacen las máquinas de vectores de soporte es hallar el llamado “hiperplano de máxima separación” para dos clases de puntos en un espacio de n dimensiones. Entonces, si graficamos nuestros puntos, si visualizamos nuestros datos y observamos una separación lineal entre estos datos entonces las máquinas de vectores de soporte probablemente son un algoritmo que querremos explorar.
Random Forest.
Random forest es en realidad nuestro primer algoritmo no lineal en este conjunto. Y lo que hace, lo que eso significa es que si existen relaciones no lineales entre cada una de nuestras entradas y nuestras salidas un random forest puede descubrir esos patrones mucho mejor de lo que lo haría un modelo de regresión.
Los random forest ajustan no sólo un árbol de decisión sino una gran cantidad de árboles de decisión. Y realmente hacen esto en una especie de forma no intuitiva, de hecho. Debido a que en lugar de ajustar cada árbol de decisión en todos los datos es decir, todas las filas, todos nuestros ejemplos, así como todas las características, lo que hacen en cambio es ajustar esos árboles de decisión, cada uno, en un subconjunto aleatorio de las filas y un subconjunto aleatorio de las columnas.
Los modelos de random forest también introducen este concepto muy interesante, muy divertido en machine learning que es el de agrupación. La idea es que, en lugar de ajustar un árbol de decisión, ajustar muchos débiles y promediar sus votos.
Redes Neuronales
Las redes neuronales no son un algoritmo nuevo. Es algo que ha existido por aproximadamente 75 años. La razón por la que ahora funcionan tan bien son las cantidades masivas de datos, con los cuales entrenar estas redes, que generamos, y también los recursos de cómputo que tenemos fácilmente disponibles con los cuales procesar los datos ya mencionados.
El otro punto para aclarar también es cuando hablamos acerca de aprendizaje profundo, El aprendizaje profundo es casi un sinónimo de redes neuronales.
Las redes neuronales son normalmente cosas que tienen capas escondidas entre ellas y aprendizaje profundo hace referencia a una red neuronal con muchas capas escondidas, que son una red profunda.
Empleamos redes neuronales profundas para entrenarse en lotes grandes de imágenes, audio, video.
Así que para hacer esto en un marco de tiempo razonable y haciendo uso de esto del hardware especializado, de nuevo, la tarea de ingeniería es bastante pesada.
Vectorización
La vectorización de ese modelo de negocios realmente es el primer paso para poder hacerle un modelo predictivo.
De nuevo, ¿sabes? personalmente tengo esta creencia de que muchas de las entidades del mundo real, las personas en un nivel emocional y nuestras interacciones en el mundo, pueden ser codificadas en números, pueden ser codificadas en términos matemáticos y esto es de lo que se trata realmente convertir cosas en vectores.
También hemos hablado sobre codificar imágenes, video, etc. en espacio vectorial, hablamos sobre que cada imágen tendrá diferentes pixeles, cada pixel tendrá un valor para el color que este toma, y al convertir estos valores en una gran lista, en un gran vector, los números que de nuevo, existen cómo un punto en largo espacio de n dimensiones. Y lo que hemos hecho es codificar esa entidad del mundo real en números.
Y entonces conforme progresas en Machine Learning vas encontrando formas cada vez más creativas de hacerlo.
Vamos a hacer este proceso en un ejemplo en breve, digamos que para nuestra tarea de predicción para predecir el número de mililitros de medicamento a administrar en un hospital.
Tenemos cien diferentes pacientes, y cada uno existe en el espacio tridimensional, lo que significa que tienen 3 características. Así que nuestro set de entrenamiento, nuestra matriz de entrenamiento va a ser de (100 x 3) va a tener cien filas y tres columnas.
A continuación tenemos un vector de respuestas, de el número de mililitros que históricamente, ha sido administrado a cada uno de estos pacientes. Y entonces, nuestro set de entrenamiento de (100 x 3) y nuestro vector, el cual efectivamente tiene cien diferentes columnas si quieres pensar verticalmente, y una sola columna.
Una vez que codificamos las cosas al espacio vectorial, para poder pasarlas a nuestro modelo de Machine Learning, así es como nuestra data se tiene que ver.
Cuando construimos modelos de machine learning todo es un "hiper parámetro" en otras palabras todo es una perilla que puedes girar o no girar.
Desde las características que creas para tus datos, para los modelos que eliges, para los hiper parámetros con los que parametrizas esos modelos.
Somos data scientists y también somos ingenieros de software. Tenemos que implementar estos modelos en código. Así que hay un elemento muy práctico para hacer esto:
Itera Rápidamente o Muere Lentamente
Invertir tiempo en suavizar tu flujo de trabajo por adelantado es realmente importante. Es la diferencia entre ajustar modelos geniales y tener resultados estupendos, y quizás solamente, ya sabes, juguetear con tres o cuatro
Generalmente no es recomendable crear tus propios modelos de machine learning desde cero.
En lenguajes que son populares para data science, por ejemplo Python, por ejemplo R, existen paquetes de software que tienen estos modelos pre-construidos para ti.
Por supuesto en machine learning como en ingeniería de software construimos capas de abstracción encima de las cosas. Así que, por ejemplo, otro profesor de Platzi el otro día estaba dando un gran ejemplo sobre manejar un auto y cómo se relaciona con la ingeniería de software.Como desarrollador de software, como data scientist, podrías programar, ya sabes, alguien que presione el pedal de ese carro.Y, dado que el pedal es presionado, ese auto empezará a moverse.
Sin embargo, para crear un programa que usa ese pedal, que interactúa con ese pedal y crear un programa que funcione no necesariamente tienes que saber lo que está pasando bajo el capó de ese auto. Y esto es lo que se llama una "capa de abstracción "
Sin embargo, cuanto mejor entendamos ese carro, mejor entendamos lo que está pasando bajo el capó de nuestros modelos de machine learning, mejor podremos usarlos, y serán, digamos, más intuitivos los cambios que podamos hacerles y más íntimamente entenderemos por qué están actuando de la manera en que actúan.
No podemos impedir que alguien implemente sus propios algoritmos. Pero al construir sistemas de producción, en la mayoría de los casos un algoritmo pre-construido en una biblioteca como scikit-learn, en bibliotecas en R, es probablemente suficiente para tus necesidades.
Recolectando y limpiando datos
La idea es es crear un modelo de machine learning para detectar insultos en redes sociales. Entonces tenemos al favorito de todos: Donald J. Trump.
Vamos a usar machine learning para hacer esto. Este va a ser un problema de aprendizaje supervisado. Vamos a tomar datos que hemos recogido previamente, cada uno es un comentario en una red social, y tiene una etiqueta vinculada. Y por supuesto esta es una tarea de aprendizaje supervisado.
En este ejemplo utilizamos varias bibliotecas:
- Re, que es la biblioteca de expresiones regulares en Python, y string.
- Pandas
- Sklearn.
Lo primero que hacemos es cargar nuestros datos. Para hacer esto vamos a usar la función read.csv de pandas. Como nota al pie, el módulo E/S de pandas es fenomenal. Realmente facilita consumir datos desde una variedad de fuentes, intuir el esquema de esos datos, etc.
Antes hablamos de que las relaciones en los datos en muchos casos cambiarán fundamentalmente con el tiempo. Yo no pensaría que decir algo como: "eres estúpido" sería un mayor insulto hoy de lo que habría sido hace cinco años. Y por supuesto podría estar equivocado pero ese es mi propio primer instinto.
Y seguimos por algunos casos puntuales donde podemos inferir que cierto conjunto de palabras son un insulto.
Ahora que hemos recorrido el proceso de cargar nuestros datos, limpiar nuestros datos, inspeccionar nuestros datos y visualizar nuestros datos, estamos listos para empezar a crear modelos, hacer validación cruzada de estos y averiguar qué hiper parámetros nos dan el modelo que mejor predice.