El Validación cruzada de la licencia…o… LOOCVse utiliza para estimar el rendimiento de los algoritmos de aprendizaje de la máquina cuando se utilizan para hacer predicciones sobre datos no utilizados para entrenar el modelo.
Se trata de un procedimiento computacionalmente costoso de realizar, aunque da lugar a una estimación fiable e imparcial del rendimiento del modelo. Aunque es sencillo de utilizar y no hay que especificar ninguna configuración, hay ocasiones en que el procedimiento no debe utilizarse, como cuando se tiene que evaluar un conjunto de datos muy grande o un modelo computacionalmente costoso.
En este tutorial, descubrirá cómo evaluar los modelos de aprendizaje de las máquinas mediante la validación cruzada de los mismos.
Después de completar este tutorial, lo sabrás:
- El procedimiento de validación cruzada sin necesidad de realizarlo es apropiado cuando se dispone de un conjunto de datos pequeño o cuando una estimación precisa del rendimiento del modelo es más importante que el costo computacional del método.
- Cómo usar la biblioteca de aprendizaje de la máquina de ciencias para realizar el procedimiento de validación cruzada de dejar-a-dejar-fuera.
- Cómo evaluar los algoritmos de aprendizaje de la máquina para la clasificación y la regresión utilizando la validación cruzada de la no-vigencia.
Empecemos.
Resumen del Tutorial
Este tutorial está dividido en tres partes; son:
- Evaluación del modelo LOOCV
- Procedimiento LOOCV en Scikit-Learn
- LOOCV evaluará los modelos de aprendizaje automático
- LOOCV para la clasificación
- LOOCV para la regresión
Evaluación del modelo LOOCV
La validación cruzada, o validación cruzada de pliegue k, es un procedimiento utilizado para estimar el rendimiento de un algoritmo de aprendizaje automático cuando se hacen predicciones sobre datos no utilizados durante el entrenamiento del modelo.
La validación cruzada tiene un solo hiperparámetro «k«que controla el número de subconjuntos en los que se divide un conjunto de datos. Una vez dividido, cada subconjunto tiene la oportunidad de ser utilizado como un conjunto de pruebas mientras que todos los demás subconjuntos juntos se utilizan como un conjunto de datos de entrenamiento.
Esto significa que la validación cruzada del pliegue k implica el ajuste y la evaluación k modelos. Esto, a su vez, proporciona k estimaciones del rendimiento de un modelo en el conjunto de datos, que se pueden comunicar utilizando estadísticas resumidas como la media y la desviación estándar. Este puntaje puede entonces ser usado para comparar y finalmente seleccionar un modelo y una configuración para usar como el «modelo final» para un conjunto de datos.
Los valores típicos de k son k=3, k=5 y k=10, siendo 10 el valor más común. Esto se debe a que, dadas las extensas pruebas, la validación cruzada de 10 veces proporciona un buen equilibrio de bajo coste computacional y bajo sesgo en la estimación del rendimiento del modelo en comparación con otros valores de k y una única división de la prueba del tren.
Para más información sobre la validación cruzada de k-fold, vea el tutorial:
La validación cruzada de «dejar-uno-fuera», o LOOCV, es una configuración de validación cruzada de pliegue k donde k se ajusta al número de ejemplos en el conjunto de datos.
LOOCV es una versión extrema de la validación cruzada del pliegue k que tiene el máximo costo de computación. Requiere que se cree y evalúe un modelo para cada ejemplo del conjunto de datos de entrenamiento.
El beneficio de tantos modelos ajustados y evaluados es una estimación más robusta del rendimiento del modelo, ya que cada fila de datos tiene la oportunidad de representar la totalidad del conjunto de datos de la prueba.
Dado el costo computacional, el LOOCV no es apropiado para conjuntos de datos muy grandes como más de decenas o cientos de miles de ejemplos, o para modelos que son costosos de ajustar, como las redes neuronales.
- No uses LOOCV: Grandes conjuntos de datos o modelos costosos para encajar.
Dada la mejora en la estimación del rendimiento del modelo, el LOOCV es apropiado cuando una estimación precisa del rendimiento del modelo es crítica. Este caso en particular cuando el conjunto de datos es pequeño, como en el caso de menos de miles de ejemplos, puede conducir a la sobrecarga del modelo durante el entrenamiento y a estimaciones sesgadas del rendimiento del modelo.
Además, dado que no se utiliza un muestreo del conjunto de datos de capacitación, este procedimiento de estimación es determinístico, a diferencia de las divisiones de la prueba de capacitación y otras confirmaciones de validación cruzada de pliegues k que proporcionan una estimación estocástica del rendimiento del modelo.
- Usar LOOCV: Pequeños conjuntos de datos o cuando el rendimiento estimado del modelo es crítico.
Una vez que los modelos han sido evaluados usando LOOCV y se ha elegido un modelo y una configuración final, un modelo final se ajusta a todos los datos disponibles y se usa para hacer predicciones sobre nuevos datos.
Ahora que estamos familiarizados con el procedimiento LOOCV, veamos cómo podemos usar el método en Python.
Procedimiento LOOCV en Scikit-Learn
La biblioteca de aprendizaje de la máquina Python de scikit-learn proporciona una implementación del LOOCV a través de la clase LeaveOneOut.
El método no tiene configuración, por lo tanto, no se proporcionan argumentos para crear una instancia de la clase.
... # Crear el procedimiento de loocv cv = LeaveOneOut() |
Una vez creado, el split() se puede llamar a la función y proporcionar el conjunto de datos a enumerar.
Cada iteración devolverá los índices de fila que se pueden utilizar para el tren y los conjuntos de pruebas del conjunto de datos proporcionado.
... para train_ix, test_ix en cv.split(X): ... |
Estos índices pueden utilizarse en la entrada (X) y la salida (y) columnas del conjunto de datos para dividir el conjunto de datos.
... # datos divididos X_tren, X_test = X[[train_ix, :], X[[test_ix, :] y_tren, y_test = y[[train_ix], y[[test_ix] |
El conjunto de entrenamiento puede utilizarse para ajustar un modelo y el conjunto de pruebas puede utilizarse para evaluarlo haciendo primero una predicción y calculando una métrica de rendimiento sobre los valores predichos frente a los valores esperados.
... # Modelo de ajuste modelo = RandomForestClassifier(estado_aleatorio=1) modelo.encajar(X_tren, y_tren) # Evaluar el modelo yhat = modelo.predecir(X_test) |
Se pueden guardar las puntuaciones de cada evaluación y se puede presentar una estimación media final del rendimiento del modelo.
Podemos unir esto y demostrar cómo usar LOOCV para evaluar un modelo de RandomForestClassifier para un conjunto de datos de clasificación binaria sintética creada con la función make_blobs().
El ejemplo completo figura a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# Loocv para evaluar manualmente el rendimiento de un clasificador forestal aleatorio de sklearn.conjuntos de datos importación make_blobs de sklearn.model_selection importación LeaveOneOut de sklearn.conjunto importación RandomForestClassifier de sklearn.métrica importación exactitud_puntuación # Crear un conjunto de datos X, y = make_blobs(n_muestras=100, estado_aleatorio=1) # Crear el procedimiento de loocv cv = LeaveOneOut() # enumerar las divisiones y_verdad, y_pred = lista(), lista() para train_ix, test_ix en cv.split(X): # datos divididos X_tren, X_test = X[[train_ix, :], X[[test_ix, :] y_tren, y_test = y[[train_ix], y[[test_ix] # Modelo de ajuste modelo = RandomForestClassifier(estado_aleatorio=1) modelo.encajar(X_tren, y_tren) # Evaluar el modelo yhat = modelo.predecir(X_test) # Tienda y_verdad.anexar(y_test[[0]) y_pred.anexar(yhat[[0]) # calcular la precisión acc = accuracy_score(y_verdad, y_pred) imprimir(Precisión: %.3f’. % acc) |
Ejecutando el ejemplo se estima manualmente el rendimiento del clasificador forestal aleatorio en el conjunto de datos sintéticos.
Dado que el conjunto de datos tiene 100 ejemplos, significa que se crearon 100 divisiones de tren/prueba del conjunto de datos, dándose a cada fila del conjunto de datos la oportunidad de ser utilizada como conjunto de pruebas. De manera similar, se crean y evalúan 100 modelos.
La exactitud de la clasificación en todas las predicciones se reporta entonces, en este caso como el 99 por ciento.
Una desventaja de enumerar los pliegues manualmente es que es lento e implica mucho código que podría introducir errores.
Una alternativa a la evaluación de un modelo usando LOOCV es usar la función cross_val_score().
Esta función toma el modelo, el conjunto de datos, y el conjunto de objetos LOOCV instanciados a través de la «cv«argumento». Se devuelve entonces una muestra de puntuaciones de precisión que se pueden resumir calculando la media y la desviación estándar.
También podemos establecer el «n_jobs«a -1 para usar todos los núcleos de la CPU, disminuyendo enormemente el costo computacional en el ajuste y evaluación de tantos modelos.
El ejemplo siguiente demuestra la evaluación de la RandomForestClassifier usando LOOCV en el mismo conjunto de datos sintéticos usando el cross_val_score() función.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Loocv para evaluar automáticamente el rendimiento de un clasificador forestal aleatorio de numpy importación significa de numpy importación std de sklearn.conjuntos de datos importación make_blobs de sklearn.model_selection importación LeaveOneOut de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.conjunto importación RandomForestClassifier # Crear un conjunto de datos X, y = make_blobs(n_muestras=100, estado_aleatorio=1) # Crear el procedimiento de loocv cv = LeaveOneOut() # Crear un modelo modelo = RandomForestClassifier(estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1) # Informe de rendimiento imprimir(«Precisión: %.3f (%.3f) % (significa(resultados), std(resultados))) |
Ejecutando el ejemplo se estima automáticamente el rendimiento del clasificador forestal aleatorio en el conjunto de datos sintéticos.
La precisión de la clasificación media en todos los pliegues coincide con nuestra estimación manual anterior.
Ahora que estamos familiarizados con el uso de la clase LeaveOneOut, veamos cómo podemos usarla para evaluar un modelo de aprendizaje de máquina en conjuntos de datos reales.
LOOCV evaluará los modelos de aprendizaje automático
En esta sección, exploraremos el uso del procedimiento LOOCV para evaluar los modelos de aprendizaje automático sobre la clasificación estándar y los conjuntos de datos de modelos predictivos de regresión.
LOOCV para la clasificación
Demostraremos cómo usar LOOCV para evaluar un algoritmo de bosque aleatorio en el conjunto de datos del sonar.
El conjunto de datos del sonar es un conjunto de datos estándar de aprendizaje por máquina que comprende 208 filas de datos con 60 variables de entrada numéricas y una variable objetivo con dos valores de clase, por ejemplo, la clasificación binaria.
El conjunto de datos implica la predicción de si los retornos del sonar indican una roca o una mina simulada.
No es necesario descargar el conjunto de datos; lo descargaremos automáticamente como parte de nuestros ejemplos de trabajo.
El siguiente ejemplo descarga el conjunto de datos y resume su forma.
# Resumir el conjunto de datos del sonar de pandas importación lea_csv # Cargar conjunto de datos url = «https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv dataframe = read_csv(url, encabezado=Ninguno) # Dividido en elementos de entrada y salida datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) |
Ejecutando el ejemplo se descarga el conjunto de datos y se divide en elementos de entrada y salida. Como era de esperar, podemos ver que hay 208 filas de datos con 60 variables de entrada.
Ahora podemos evaluar un modelo usando LOOCV.
Primero, el conjunto de datos cargado debe ser dividido en componentes de entrada y salida.
... # Dividido en entradas y salidas X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) |
A continuación, definimos el procedimiento LOOCV.
... # Crear el procedimiento de loocv cv = LeaveOneOut() |
Podemos entonces definir el modelo a evaluar.
... # Crear un modelo modelo = RandomForestClassifier(estado_aleatorio=1) |
Entonces usa el cross_val_score() para enumerar los pliegues, ajustar los modelos, y luego hacer y evaluar las predicciones. Podemos entonces informar la media y la desviación estándar del rendimiento del modelo.
... # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1) # Informe de rendimiento imprimir(«Precisión: %.3f (%.3f) % (significa(resultados), std(resultados))) |
A continuación se muestra el ejemplo completo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Loocv evalúa el bosque al azar en el conjunto de datos del sonar # de numpy importación significa de numpy importación std de pandas importación read_csv de sklearn.model_selection importación LeaveOneOut de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.conjunto importación RandomForestClassifier # Cargar conjunto de datos url = «https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv dataframe = read_csv(url, encabezado=Ninguno) datos = dataframe.valores # Dividido en entradas y salidas X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) # Crear el procedimiento de loocv cv = LeaveOneOut() # Crear un modelo modelo = RandomForestClassifier(estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1) # Informe de rendimiento imprimir(«Precisión: %.3f (%.3f) % (significa(resultados), std(resultados))) |
Ejecutando el ejemplo primero se carga el conjunto de datos y se confirma el número de filas en los elementos de entrada y salida.
El modelo se evalúa entonces usando LOOCV y el rendimiento estimado al hacer las predicciones sobre los nuevos datos tiene una precisión de alrededor del 82,2 por ciento.
(208, 60) (208,) Precisión: 0,822 (0,382) |
LOOCV para la regresión
Demostraremos cómo usar LOOCV para evaluar un algoritmo de bosque aleatorio en el conjunto de datos de la vivienda.
El conjunto de datos de la carcasa es un conjunto de datos estándar de aprendizaje de la máquina que comprende 506 filas de datos con 13 variables numéricas de entrada y una variable numérica de destino.
El conjunto de datos implica la predicción del precio de la casa, dados los detalles del suburbio de la casa en la ciudad americana de Boston.
No es necesario descargar el conjunto de datos; lo descargaremos automáticamente como parte de nuestros ejemplos de trabajo.
El siguiente ejemplo descarga y carga el conjunto de datos como un Pandas DataFrame y resume la forma del conjunto de datos.
# Cargar y resumir el conjunto de datos de la vivienda de pandas importación lea_csv # Cargar conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ dataframe = read_csv(url, encabezado=Ninguno) # Resumir la forma imprimir(dataframe.forma) |
La ejecución del ejemplo confirma las 506 filas de datos y las 13 variables de entrada y las variables objetivo numéricas simples (14 en total).
Ahora podemos evaluar un modelo usando LOOCV.
Primero, el conjunto de datos cargado debe ser dividido en componentes de entrada y salida.
... # Dividido en entradas y salidas X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) |
A continuación, definimos el procedimiento LOOCV.
... # Crear el procedimiento de loocv cv = LeaveOneOut() |
Podemos entonces definir el modelo a evaluar.
... # Crear un modelo modelo = RandomForestRegressor(estado_aleatorio=1) |
Entonces usa el cross_val_score() para enumerar los pliegues, ajustar los modelos, y luego hacer y evaluar las predicciones. Podemos entonces informar la media y la desviación estándar del rendimiento del modelo.
En este caso, utilizamos la métrica de rendimiento del error absoluto medio (MAE) apropiada para la regresión.
... # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=‘neg_mean_absolute_error’, cv=cv, n_jobs=–1) # Fuerza positiva resultados = absoluto(resultados) # Informe de rendimiento imprimir(MAE: %.3f (%.3f)’. % (significa(resultados), std(resultados))) |
A continuación se muestra el ejemplo completo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# Loocv evalúa el bosque al azar en el conjunto de datos de la vivienda de numpy importación significa de numpy importación std de numpy importación absoluto de pandas importación read_csv de sklearn.model_selection importación LeaveOneOut de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.conjunto importación RandomForestRegressor # Cargar conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ dataframe = read_csv(url, encabezado=Ninguno) datos = dataframe.valores # Dividido en entradas y salidas X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) # Crear el procedimiento de loocv cv = LeaveOneOut() # Crear un modelo modelo = RandomForestRegressor(estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=‘neg_mean_absolute_error’, cv=cv, n_jobs=–1) # Fuerza positiva resultados = absoluto(resultados) # Informe de rendimiento imprimir(MAE: %.3f (%.3f)’. % (significa(resultados), std(resultados))) |
Ejecutando el ejemplo primero se carga el conjunto de datos y se confirma el número de filas en los elementos de entrada y salida.
El modelo se evalúa utilizando la LOOCV y el rendimiento del modelo cuando se hacen predicciones sobre nuevos datos es un error absoluto medio de unos 2.180 (miles de dólares).
(506, 13) (506,) MAE: 2.180 (2.346) |