(Extraído de: [1] "Python Machine Learning - Capítulo 6")
- Conjunto de entrenamiento
- Conjunto de validación
- Conjunto de prueba
Desventaja: la estimación del rendimiento es
sensible a la forma en que dividimos el conjunto de entrenamiento en
subconjuntos de entrenamiento y validación; la estimación variará para
diferentes muestras de los datos. En la siguiente sección, veremos una técnica
más robusta para la estimación del rendimiento, la k-fold cross-validation (validación
cruzada de k pliegues), en la que repetimos el método holdout (método
de retención) k veces en k subconjuntos de los datos de
entrenamiento.
k-fold cross-validation (validación cruzada de k pliegues)
En
la validación cruzada de k pliegues, dividimos aleatoriamente el
conjunto de datos de entrenamiento en k pliegues sin reemplazo, donde se
utilizan
A continuación, calculamos el rendimiento medio de los modelos basándonos en los diferentes pliegues independientes para obtener una estimación del rendimiento que sea menos sensible a la subdivisión de los datos de entrenamiento en comparación con el método holdout (método de retención). Normalmente, utilizamos la k-fold cross-validation (validación cruzada de k pliegues) para el ajuste del modelo, es decir, para encontrar los valores óptimos de los hiperparámetros que producen un rendimiento de generalización satisfactorio. Una vez que hayamos encontrado valores de hiperparámetros satisfactorios, podemos volver a entrenar el modelo en el conjunto de entrenamiento completo y obtener una estimación final del rendimiento utilizando el conjunto de pruebas independiente.
Ventaja: cada punto de muestra formará
parte de un conjunto de datos de entrenamiento y de prueba exactamente una vez,
dado que la k-fold cross-validation (validación cruzada de k pliegues)
es una técnica de remuestreo sin reemplazo, lo que produce una estimación de la varianza
del rendimiento del modelo más baja que el método holdout (método de
retención). La siguiente figura resume el concepto de k-fold
cross-validation (validación cruzada de k pliegues) con k =10
. El conjunto de datos de entrenamiento se divide en 10 pliegues, y durante las
10 iteraciones, se utilizan 9 pliegues para el entrenamiento, y 1 pliegue se
utilizará como conjunto de prueba para la evaluación del modelo. Además, los
rendimientos estimados
- Conjuntos de entrenamiento relativamente pequeños: en este caso puede ser útil aumentar el número de pliegues. Si aumentamos el valor de k, se utilizarán más datos de entrenamiento en cada iteración, lo que se traduce en un menor sesgo a la hora de estimar el rendimiento de la generalización promediando las estimaciones individuales del modelo. Sin embargo, los valores grandes de k también aumentarán el tiempo de ejecución del algoritmo de validación cruzada y producirán estimaciones con mayor varianza, ya que los pliegues de entrenamiento serán más similares entre sí.
- Grandes conjuntos de datos: en este caso podemos elegir un valor más pequeño para k, por ejemplo, k = 5 , y seguir obteniendo una estimación precisa del rendimiento medio del modelo, al tiempo que se reduce el coste computacional de reajustar y evaluar el modelo en los diferentes pliegues.
Nota:
Un caso especial de k-fold
cross-validation (validación
cruzada de k pliegues) es el
método de leave-one-out (LOO) cross-validation. En LOO, establecemos el número
de pliegues igual al número de muestras de entrenamiento (k = n), de modo que
sólo se utiliza una muestra de entrenamiento para las pruebas durante cada
iteración. Este es un método recomendado para trabajar con conjuntos de datos
muy pequeños.
Una ligera mejora sobre el enfoque de k-fold cross-validation (validación cruzada de k pliegues) estándar es la k-fold cross-validation (validación cruzada de k pliegues) estratificada.
k-fold cross-validation (validación cruzada de k pliegues) estratificada.
Es una versión mejorada de k-fold cross-validation (validación cruzada de k pliegues) estándar, ya que puede producir mejores estimaciones de sesgo y varianza, especialmente en casos de proporciones de clase desiguales. En la validación cruzada estratificada, las proporciones de clase se conservan en cada pliegue para garantizar que cada pliegue es representativo de las proporciones de clase en el conjunto de datos de entrenamiento, lo que ilustraremos utilizando el iterador StratifiedKFold en scikit-learn:
>>> import
numpy as np
>>> from sklearn.model_selection
import StratifiedKFold
>>> kfold = StratifiedKFold(y=y_train,
... n_folds=10,
... random_state=1)
>>> scores =
[]
>>> for k,
(train, test) in enumerate(kfold):
... pipe_lr.fit(X_train[train], y_train[train])
... score = pipe_lr.score(X_train[test],
y_train[test])
... scores.append(score)
... print('Fold: %s, Class dist.: %s, Acc:
%.3f' % (k+1, np.bincount(y_train[train]), score))
Fold: 1, Class dist.:
[256 153], Acc: 0.891
Fold: 2, Class dist.:
[256 153], Acc: 0.978
Fold: 3, Class dist.:
[256 153], Acc: 0.978
Fold: 4, Class dist.:
[256 153], Acc: 0.913
Fold: 5, Class dist.:
[256 153], Acc: 0.935
Fold: 6, Class dist.:
[257 153], Acc: 0.978
Fold: 7, Class dist.:
[257 153], Acc: 0.933
Fold: 8, Class dist.:
[257 153], Acc: 0.956
Fold: 9, Class dist.:
[257 153], Acc: 0.978
Fold: 10, Class
dist.: [257 153], Acc: 0.956
>>> print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
>>> scores = cross_val_score(estimator=pipe_lr,
... X=X_train,
... y=y_train,
... cv=10,
... n_jobs=-1)
>>> print('Puntuaciones de precisión (CV): %s' % scores)
Puntuaciones de precisión (CV): [0.91304348 0.97826087 0.97826087 0.91304348 0.93478261 0.97777778
0.93333333 0.95555556 0.97777778 0.95555556]
Bibliografía:
Comentarios
Publicar un comentario