En otro artículo hemos hablado acerca del problema de la división train y test y de sus grandes limitaciones. Una de las mayores limitaciones era que no se podían seleccionar los parámetros del modelo de forma que los conjuntos de entrenamiento se ejecuten de manera óptima con los datos de entrenamiento correcto para tener resultados acertados.
En este post, te diremos cómo solucionar este problema de la división train y test, para que, cuando entrenemos el modelo, no ocurran sobreajustes.
¿Cómo solucionar el problema de la división train y test?
Una posible solución al problema de la división train y test es tener un conjunto de entrenamiento, un conjunto de validación y un conjunto de test.
Así pues, en el conjunto de entrenamiento probamos nuestro modelo, mientras que en el conjunto de validación evaluamos nuestro modelo con el mismo número de vecinos que en training. Es decir, si en training probamos con 5 vecinos, en validation también debemos probar con 5 vecinos, pero en un conjunto de datos distinto.
De modo que en training entrenamos con 5 y en validation evaluamos con 5; en training entrenamos con 6 y en validation evaluamos con 6, y así sucesivamente. El que realmente sea mejor en validación, que será como un seudodataset nuevo, es el que debemos llevar al test y el que debemos probar en datos nuevos.
Este modo de hacer las cosas es válido para solucionar el problema de la división train y test, pero representa un inconveniente.
¿Cuál es el problema?
El gran problema es que vamos a depender mucho de lo que nos cae en el subconjunto de validación, es decir, hay mucha varianza. También se nos presenta otra desventaja y es que cada vez vamos a tener menos datos para trabajar.
¿Cuál es la mejor solución posible?
La mejor solución posible al problema de la división train y test es la validación cruzada o k-fold cross validation.
Lo que hace la validación cruzada es, partiendo de una división en 2, de train y test, utiliza los datos de training para encontrar los parámetros libres de un modelo. Esto se logra partiendo los datos de train en bloques. El número de bloques va a depender de nosotros; pueden ser los bloques que queramos. Normalmente, por defecto, en scikit-learn son 5. Entre 5 y 10 es más que suficiente, no hace falta poner muchos más datos, porque eso lo único que hará será enredarnos el modelo.
Entonces, para resolver el problema de la división train y test por medio de la validación cruzada se parte en 5 bloques y cada vez uno de ellos va a ser el test al tiempo que el modelo se va a entrenar sobre los otros 4. Con estos cambios lo que se consigue es que cada vez el conjunto de entrenamiento sea diferente, así como el conjunto de evaluación, con lo que el modelo está todo el rato viendo datos nuevos.
La evaluación final se hace sobre el test con datos nuevos que en ningún caso se han usado para entrenar. De esta manera, se consigue producir la varianza y encontrar los hiperparámetros.
A modo de resumen
Paso 1
Tenemos todos los datos (All data), partimos en 2 (Training data y Test data). Guardamos los datos de test. El test no se toca ni se usa para la construcción del modelo.
Ahora, dividimos los datos de entrenamiento que tenemos en n-folds.
Paso 2
for n = 1 : Nvecinos (desde n 1 hasta el número de vecinos que queremos, en este caso son 5)
Para cada uno de los valores que queremos probar se efectúa la validación cruzada, de modo que:
- Se entrena en el 1 y se prueba en el 2, 3, 4, 5.
- Se entrena en el 2 y se prueba en el 1, 3, 4, 5.
- Se entrena en el 3 y se prueba en el 1, 2, 4, 5.
- Se entrena en el 4 y se prueba en el 1, 2, 3, 5.
- Se entrena en el 5 y se prueba en el 1, 2, 3, 4.
Y así podemos resolver el problema de la división train y test.
¿Qué sigue?
Si quieres seguir aprendiendo sobre estas temáticas, puedes hacerlo desde nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva que te brindará toda la fundamentación teórica y práctica para que incursiones rápidamente en el mercado laboral y sigas cumpliendo tus sueños. ¡Anímate a cambiar tu futuro y solicita más información!