jueves, 24 de diciembre de 2020

Apuntes de Machine Learning (aprendizaje supervisado)

En esta entrada voy a hablarles sobre Machine Learning. Sinceramente, no me gusta llamarlo así. Me gusta llamarlo aprendizaje automático, que es como se conoce en Castellano. En otros países latinos, si no me equivoco, se le llama aprendizaje máquina. Yo me voy a centrar en todo lo necesario para que cuando acabéis de leer esta entrada, podáis utilizar estas técnicas para predecir partidos de tenis. Ojo, no nos podemos confundir. Predecir partidos de tenis usando machine learning no significa acertar predicciones de partidos de tenis usando machine learning. Yo les voy a dar ideas de cómo representar el problema para poder aplicar estas técnicas, pero hay factores imposibles de predecir, como que un tenista se lesione. Vale, hoy día es posible conocer el estado físico de un tenista y su equipo médico sabrá si está al borde de lesión muscular o no, dependiendo de la carga física que lleve, pero esa información no estará disponible para nosotros así que tendremos que usar la información que si podemos conseguir, como los resultados de anteriores encuentros. Pero bueno, para predecir partidos de tenis queda mucho. Vamos a empezar por el principio.

 

Machine Learning. Un mundo.

Hay muchísimas técnicas diferentes que están dentro del machine learning o el aprendizaje automático. Yo, de momento al menos, me voy a centrar en explicarles cómo funciona el aprendizaje supervisado, más en concreto para clasificación. 

 

tipos de machine learning

En el aprendizaje supervisado, básicamente, disponemos de un montón de ejemplos concretos, que son los que conforman el conjunto de datos. Cada uno de esos ejemplos, contiene una serie de características. A su vez, se dispone de la información de si cada ejemplo pertenece a una clase u otra. Vamos a suponer que tratamos de predecir si llueve o no llueve. Llueve o no llueve son las posibles clases. Vamos a suponer que vamos a predecir si llueve o no llueve midiendo la temperatura media prevista que va a haber durante el día, la velocidad del viento y también si ayer llovió o no. Suponiendo que esas cosas son las que influyen en si llueve o no llueve, ya podemos representar cada ejemplo del conjunto de datos como un vector de tres características:

  • Temperatura media del día. 
  • Velocidad del viento.
  • ¿Llovió ayer?

Para entrenar un modelo, necesitamos disponer de la información de la mayor cantidad de días posibles. La información que necesitamos en este modelo improvisado es la de las tres características mencionadas. El modelo debe aprender a "sacar sus propias conclusiones" de manera que sea capaz de clasificar correctamente a la mayor cantidad de ejemplos del conjunto de datos. No olvidemos que estamos hablando de clasificar a los ejemplos que ya sabemos si pertenecen a la clase llueve o no, porque son ejemplos del pasado. El modelo, a partir de los ejemplos del pasado, aprenderá a clasificar a los nuevos ejemplos, que serán los ejemplos de los días que aún no se sabe si ha llovido o no. Si el modelo aprende a clasificar estos ejemplos, entonces se puede decir que generaliza bien. Para el caso que se ha preparado aquí, dudo mucho que funcione puesto que que llueva o no me temo que no depende solo de tres características tontas. Pero la idea de cómo funciona creo que se entiende, ¿no?



División en conjuntos de entrenamiento y test

Una vez que disponemos de nuestro conjunto de datos, para aplicar estas técnicas será necesario dividirlo (al menos) en entrenamiento y test (técnica holdout). Es cierto que esta técnica es menos efectiva que dividir el conjunto en entrenamiento (entrenar el modelo), validación (realizar ajustes) y test (comprobar hasta qué punto clasifica nuevos ejemplos nunca antes utilizados). Pero para comenzar a ver qué es esto del aprendizaje supervisado, será suficiente con dividir el conjunto de datos en dos partes, entrenamiento y test.


 Los ejemplos de entrenamiento serán utilizados para que el modelo aprenda a clasificar estos ejemplos. Dependiendo de la técnica utilizada, de una forma u otra tratará de encontrar la forma de clasificar correctamente el mayor número de ejemplos del conjunto de entrenamiento. Cuando termine de entrenar, habrá encontrado unos pesos (en el caso de regresión logística, por ejemplo) que serán los que clasifiquen correctamente al mayor número de ejemplos del conjunto de entrenamiento. Utilizando estos pesos, que se supone que han encontrado ciertos patrones para aprender a clasificar los ejemplos, ahora se clasifican los ejemplos del conjunto de test, que no han sido utilizados para entrenar. Se dispone de la clase a la que pertenece cada ejemplo del conjunto de test, pero esto se utiliza únicamente para verificar que la clasificación realizada se ha hecho de forma correcta o incorrecta. 

Si se clasifican los ejemplos de test de manera correcta, con un porcentaje de acierto parejo al obteniendo durante la clasificación de los ejemplos del conjunto de entrenamiento, el modelo es capaz de generalizar y ha sido capaz de aprender a clasificar estos ejemplos de forma correcta.

Como siempre puede ser más entretenido ver y escuchar que leer, os dejo un vídeo hablando sobre este tema.




Sobreajuste y generalización

Dos aspectos interesantes a tener en cuenta son el sobreajuste y la generalización. Hablamos de sobreajuste cuando las predicciones o clasificaciones que hace nuestro modelo se adaptan a los ejemplos del conjunto de entrenamiento. ¿Cómo sabemos si hay sobreajuste en el aprendizaje supervisado? Una señal de esto es observar que se clasifican correctamente muchos ejemplos del conjunto de entrenamiento y, en cambio, cuando se clasifica el conjunto de test se obtienen peores resultados en comparación con los obtenidos en el conjunto de entrenamiento.

Por eso se dice que se produce sobreajuste al conjunto de entrenamiento, de manera que hay una adaptación a las peculiaridades de los ejemplos del conjunto de entrenamiento y el rendimiento obtenido clasificando estos ejemplos no se puede replicar clasificando nuevos ejemplos. Aquí es donde entra el término generalización, que simplemente lo utilizamos para indicar si el comportamiento y rendimiento obtenido clasificando nuevos ejemplos es parecido al obtenido clasificando los ejemplos del conjunto de entrenamiento. 

Para resolver este problema del sobreajuste, hay varias técnicas. Por un lado, se puede probar a cambiar los atributos del clasificador. Si estamos utilizando un clasificador de tipo KNN, no hay demasiado que podamos cambiar, pero al menos si que se puede cambiar el número de vecinos y la forma en la que se mide la distancia entre vecinos (distancia Euclídea, distancia de Minkowski o como c*** se escriba etc, ...)

Para hacer esta búsqueda de parámetros en machine learning, en aprendizaje supervisado más concrectamente, puede ser interesante utilizar Grid Search o búsqueda en rejilla. Esto que suena tan técnico es simplemente probar muchas combinaciones de parámetros y quedarte con la que mejor te funcione. 

Otra opción, que suele usarse combinado a lo anterior, es hacer algún preprocesado o reescalado de los datos. De esto os hablo en el siguiente apartado. Antes, os recomiendo ver el siguiente vídeo donde hablo un poco más de sobreajuste y generalización.



Preprocesado de los datos

.

Sugerencias

Si tienen alguna duda o sugerencia al respecto, ya sea sobre cómo mejorar algo de lo que he explicado y que no se entienda bien, eres bienvenido. Si he cometido algún error, también agradecería que me avises.



No hay comentarios:

Publicar un comentario