¿Por qué una gran opción de K baja mi puntaje de validación cruzada?

11

Jugando con el conjunto de datos de vivienda de Boston y RandomForestRegressor(con parámetros predeterminados) en scikit-learn, noté algo extraño: la puntuación media de validación cruzada disminuyó a medida que aumentaba el número de pliegues más allá de 10. Mi estrategia de validación cruzada fue la siguiente:

cv_met = ShuffleSplit(n_splits=k, test_size=1/k)
scores = cross_val_score(est, X, y, cv=cv_met)

... donde num_cvsfue variado. Me puse test_sizea 1/num_cvsreflejar el comportamiento tamaño de división de tren / test de CV k veces. Básicamente, quería algo como k-fold CV, pero también necesitaba aleatoriedad (de ahí ShuffleSplit).

Este ensayo se repitió varias veces, y luego se trazaron las puntuaciones promedio y las desviaciones estándar.

Área del círculo ~ K en la validación cruzada K-fold

(Tenga en cuenta que el tamaño de kestá indicado por el área del círculo; la desviación estándar está en el eje Y).

Consistentemente, aumentar k(de 2 a 44) produciría un breve aumento en la puntuación, ¡seguido de una disminución constante a medida que kaumenta más (más de ~ 10 veces)! En todo caso, ¡esperaría que más datos de entrenamiento condujeran a un aumento menor en la puntuación!

Actualizar

Cambiar los criterios de puntuación para significar un error absoluto da como resultado un comportamiento que esperaría: la puntuación mejora con un mayor número de pliegues en K-fold CV, en lugar de acercarse a 0 (como con el valor predeterminado, ' r2 '). La pregunta sigue siendo por qué la métrica de puntuación predeterminada da como resultado un rendimiento deficiente en las métricas medias y STD para un número creciente de pliegues.

Brian Bien
fuente
¿Algún registro duplicado en tus pliegues? Esto podría deberse al sobreajuste .
HA SALIDO - Anony-Mousse
1
@ Anony-Mousse No, ya que el conjunto de datos de Boston Housing no tiene registros duplicados y el muestreo de ShuffleSplit no causa registros duplicados.
Brian Bien
44
Además, mejore su trazado. Utilice barras de error para mostrar la media, + - stddev y min / max. Pon k en el otro eje.
HA SALIDO - Anony-Mousse
1
No creo que más ejemplos de entrenamiento aumenten las posibilidades de sobreajuste. Tracé una curva de aprendizaje con este conjunto de datos, nuevamente usando ShuffleSplit (n_splits = 300 con varios tamaños de prueba) y vi una precisión constantemente mayor a medida que se pusieron a disposición más ejemplos de entrenamiento.
Brian Bien
1
lo siento, tienes razón, más es mejor y mejor es 1. Pero no tienes este problema si usas el error cuadrático medio o absoluto. Entonces tiene que hacer algo con el término de error
rep_ho

Respuestas:

1

La puntuación r ^ 2 no está definida cuando se aplica a una sola muestra (p. ej., CV de exclusión).

r ^ 2 no es bueno para la evaluación de conjuntos de pruebas pequeños: cuando se utiliza para evaluar un conjunto de pruebas suficientemente pequeño, la puntuación puede estar muy por debajo de los negativos a pesar de las buenas predicciones.

Dada una sola muestra, una buena predicción para un dominio dado puede parecer terrible:

from sklearn.metrics import r2_score
true = [1]
predicted = [1.01] # prediction of a single value, off by 1%
print(r2_score(true, predicted))
# 0.0

Aumente el tamaño del conjunto de prueba (manteniendo la precisión de las predicciones igual), y de repente la puntuación r ^ 2 parece casi perfecta:

true = [1, 2, 3]
predicted = [1.01, 2.02, 3.03]
print(r2_score(true, predicted))
# 0.9993

Llevado al otro extremo, si el tamaño de la prueba es de 2 muestras, y resulta que estamos evaluando 2 muestras cercanas entre sí por casualidad, esto tendrá un impacto sustancial en la puntuación r ^ 2, incluso si las predicciones son bastante buenas. :

true = [20.2, 20.1] # actual target values from the Boston Housing dataset
predicted = [19, 21]
print(r2_score(true, predicted))
# -449.0
Brian Bien
fuente