En Machine Learning, la Generalización es la capacidad de obtener buenos resultados con datos nuevos. En este artículo vamos a hablar de por qué es tan importante la generalización y cómo medirla.
Índice
Intuición gráfica de la Generalización en Machine Learning
Para explicar el concepto de generalización, vamos a intentar usar un ejemplo gráfico y usar el error cuadrático medio. Una vez que tengamos la intuición gráfica, será más fácil describir matemáticamente cómo podemos medir la generalización.
He generado unos datos siguiendo una línea y les he añadido un poco de ruido. A continuación, he usado 2 modelos de regresión:
- El de la izquierda es un modelo de regresión lineal. Tiene un Error Cuadrático Medio de 0.0491
- El de la derecha es un modelo de regresión polinómica de grado 5. Tiene un Error Cuadrático Medio de 0.0387
Así que como el error de la regresión polinómica es menor que el error de la regresión lineal … deberíamos usar la regresión polinómica, ¿no? Intuitivamente esto no parece lo más correcto.
Para entenderlo intuitivamente, vamos a ver cómo se comportan la regresión lineal y la regresión polinómica en un intervalo extendido. Es decir, vamos a visualizar las predicciones de estos dos modelos cuando tenemos datos nuevos.
Como veis, la regresión polinómica ¡es un desastre! Toma valores muy extremos para valores nuevos.
Espero que veais claro que construir un modelo de machine learning que se ajuste muy bien a los datos, no siempre garantiza que el modelo sea útil. Por eso buscamos un modelo que generalice bien. Con generalizar nos referimos a que el modelo funcione bien, no sólo con los datos con los que ha aprendido, sino también con los datos que obtendremos en el futuro.
¿Cómo podemos medir la Generalización de un modelo?
Hemos visto que si hacemos gráficos de los datos, podemos entender cuándo un modelo no está generalizando correctamente. Esto es fácil porque, en el ejemplo anterior, sólo teníamos una dimensión. Tenemos los siguientes casos:
- Cuando tenemos una dimensión (x), podemos hacer un gráfico en 2 dimensiones y ver cómo se comporta el resultado (y)
- Cuando tenemos 2 dimensiones, podemos hacer un gráfico en 3 dimensiones.
- Pero cuando tenemos 3 o más dimensiones … ya no podemos visualizar cómo se comporta el modelo.
En machine learning, es muy común tener más de 3 dimensiones. Por ejemplo, si queremos predecir si un cliente de un banco aceptará una oferta de un plazo fijo en una llamada promocional, podemos considerar: la edad (1), qué trabajo tiene (2), el balance de su cuenta (3), qué otros productos tiene ya (4), la ciudad (5), cuánto tiempo lleva siendo cliente del banco (6), estado civil (7), etc. Como veis, es muy muy fácil tener más 2 dimensiones.
Necesitamos una forma de medir la generalización que no necesite hacer gráficos. Hay varias formas de hacerlo. Vamos a explicar las dos técnicas más populares para medir la generalización:
- Con conjuntos de entrenamiento y de testeo.
- Con validación cruzada
Conjuntos de Entrenamiento y Testeo
Una forma de medir la generalización es la de dividir los datos que tengamos en dos conjuntos: el conjunto de entrenamiento y el conjunto de testeo. En el gráfico, vemos los datos del conjunto de entrenamiento en azul, y en rosa los de testeo.
Conjunto de Entrenamiento
El conjunto de entrenamiento contiene los datos que el modelo de machine learning usará para aprender. El conjunto de entrenamiento es mayor que el conjunto de testeo, en el sentido de que contiene más datos.
Conjunto de Testeo
El conjunto de testeo no se usa en el aprendizaje. Usaremos el conjunto de testeo para saber cómo se comporta el modelo con datos nuevos.
No son nuevos realmente, porque ya teníamos estos datos. Pero son «nuevos» para el modelo porque nos hemos asegurado de ocultárselos durante el aprendizaje.
Debemos evitar que el modelo use estos datos en el aprendizaje. Cuando esto sucede accidentalmente, recibe el nombre de «fuga de datos». El efecto que tiene es que podemos pensar que nuestro modelo es mejor de lo que en realidad es.
Medición de la capacidad de generalización con conjuntos de entrenamiento y testeo
Para medir la generalización, medimos el error del modelo en el conjunto de testeo. Es decir, usamos los datos de entrenamiento para que el modelo aprenda y luego le pedimos al modelo que nos de los resultados correspondientes a los datos de testeo. Como sabemos los resultados que esperamos de los datos de testeo, podemos medir el error de predicción. Para medir el error podemos usar el error cuadrático medio (MSE por sus siglas en inglés), u otra medida apropiada al problema.
Así podemos ver que en el caso de la regresión lineal, tanto el error de entrenamiento (0.0514) como el de testeo (0.0444), son pequeños y similares. Sin embargo, en el caso de la regresión polinómica de grado 5, el error de testeo (148.2934) es muy grande en comparación al error de entrenamiento (0.0367).
Podemos estimar el error de generalización midiendo el error en el conjunto de testeo.
Midiendo el error en el conjunto de testeo, podemos estimar cuál es el rendimiento del modelo en datos nuevos. Esto nos permite experimentar con varios modelos y elegir el que mejor generaliza. Para esto ya veremos que es mejor usar 3 conjuntos de datos: entrenamiento, validación y testeo. Hablaremos del conjunto de validación en otro artículo.
Validación cruzada
La validación cruzada estima el error de generalización de forma más robusta. Cuando usamos los conjuntos de entrenamiento y de testeo, hay una parte aleatoria que puede influir los resultados. Dependiendo cómo dividamos los datos en estos dos conjuntos tendremos una estimación diferente del error de generalización. En unos casos pensaremos que el modelo generaliza mejor y en otros peor.
Para combatir este problema, la validación cruzada propone crear los conjuntos de entrenamiento y testeo varias veces, cada vez con una separación diferente. De esta forma obtendremos estimaciones diferentes. La media aritmética de todos los errores de testeo se considera la estimación del error de generalización.
Es una estimación más robusta. El inconveniente es que es computacionalmente más costoso. La solución de compromiso es usar validación cruzada pero limitar el número de veces que la hacemos. Típicamente es 5 veces.
Recursos
- [vídeo] introductorio a la Inteligencia Artificial y al Aprendizaje Automático (en inglés)
Hola Jose,
Me surge una duda con respecto al apartado de validación cruzada.
Hasta donde he leído yo (por ejemplo en el libro de http://www-bcf.usc.edu/~gareth/ISL/ An Introduction to Statistical Learning de Robert Tibshirani) y estoy viendo en un curso/bootcamp que estoy haciendo, la primera división de los datos se suelen denominar entrenamiento y test, (se suele usar train_test_split en sklearn).
Luego el conjunto de entrenamiento se puede dividir a su vez en entrenamiento y validación, es decir, se divide no sobre el total de las muestras, sino sobre las muestras del «conjunto entrenamiento» resultante de aplicar train_test_split. Un proceso más sofisticado de este paso, pero siguiendo esta lógica, es lo que hacemos con validación cruzada para entrenar el modelo y ajustar/validar los parámetros libres.
Cuando ya hemos escogido los parámetros y entrenado el modelo con entrenamiento/validación probamos sus prestaciones o lo bien/mal que generaliza sobre el conjunto test inicial (el otro conjunto resultante de aplicar train_test_split a la «población» inicial). Estoy en lo correcto?
Y con respecto al error de entrenamiento y test. ¿ A partir de que resultados se podrían considerar buenos? y especialmente ¿cuál es la diferencia máxima entre estos dos indicadores, por ejemplo en %, que se suele considerar aceptable? o ¿a partir de qué diferencia se puede decir que hay sobreajuste o que generaliza mal el modelo (suponiendo que las prestaciones de entrenamiento son buenas claro)?
muchas gracias por adelantado.
PD: Por cierto, creo que el sistema de suscripción de tu blog no funciona correctamente porque yo al menos no he recibido ningún mail con las nuevas publicaciones.
Hola Sant,
Sí, estás en lo correcto.
El conjunto de testeo se utiliza para estimar cómo de bueno es nuestro modelo de una forma realista. Así que no podemos usar el conjunto de testeo para elegir qué modelo usamos ni sus hiper-parámetros.
Una forma de dividir los datos es tal y como indicas: primero en entrenamiento y testeo; y luego el entrenamiento en entrenamiento y validación. Sin embargo, esto no tiene por qué ser así, puedes empezar directamente dividiendo los datos en 3 grupos. La forma que describes es la más usual en las competiciones de machine learning (por ejemplo kaggle). Te dan los datos ya divididos en entrenamiento y testeo; y si quieres tener conjunto de validación, lo tienes que obtener a partir del conjunto de entrenamiento.
Con respecto a tu otra pregunta sobre cómo de diferentes tienen que ser los errores de entrenamiento y testeo para decir que ha habido sobreajuste … dependen un poco del problema. Puedes esperar que los datos de testeo se comporten un poco peor … pero si se comportan mucho peor tienes un problema de sobreajuste. Cuánto peor, como digo, depende un poco de los datos y del problema.
Te recomiendo que también leas este artículo: https://www.iartificial.net/analisis-de-errores-en-machine-learning/