Quiero para evaluar un modelo de regresión construir con scikitlearn mediante la validación cruzada y confundirse, cual de las dos funciones cross_val_score y cross_val_predict que debo usar.
Una opción sería :

cvs = DecisionTreeRegressor(max_depth = depth)
scores = cross_val_score(cvs, predictors, target, cv=cvfolds, scoring='r2')
print("R2-Score: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

Otro, el uso de la cv-predicciones con el estándar r2_score:

cvp = DecisionTreeRegressor(max_depth = depth)
predictions = cross_val_predict(cvp, predictors, target, cv=cvfolds)
print ("CV R^2-Score: {}".format(r2_score(df[target], predictions_cv)))

Quiero suponer que ambos métodos son válidos y dan resultados similares. Pero eso es sólo el caso de la pequeña k-pliegues. Mientras que el r^2 es aproximadamente la misma para los de 10 veces cv, se vuelve cada vez más bajos para mayor k-valores en el caso de la primera versión del «cross_vall_score». La segunda versión es principalmente afectado por el cambio de los números de los pliegues.

Es que este comportamiento se espera y qué me falta un poco de comprensión con respecto a la CV en SKLearn?

InformationsquelleAutor Bobipuegi | 2017-04-25

2 Comentarios

  1. 13

    cross_val_score devuelve la puntuación de la prueba del pliegue donde cross_val_predict devuelve valores y previstos para la prueba de pliegue.

    Para la cross_val_score(), se utiliza el promedio de los resultados, que se ven afectados por el número de pliegues, porque entonces puede que tenga algo de pliegues que puede tener un alto error (no se ajuste correctamente).

    Mientras que, cross_val_predict() devuelve, para cada elemento en la entrada, la predicción que se obtiene para ese elemento cuando estaba en el set de prueba. [Tenga en cuenta que sólo la validación de estrategias que asignar a todos los elementos de un conjunto de pruebas exactamente una vez puede ser utilizada]. Por lo que el aumento del número de pliegues, sólo aumenta los datos de entrenamiento para el examen de los elementos, y por lo tanto su resultado no puede ser afectado mucho.

    Espero que esto ayude. Siéntase libre de preguntar cualquier duda.

    Edición: Responder a la pregunta en el comentario

    Por favor, eche un vistazo a la siguiente respuesta sobre cómo cross_val_predict obras:

    Creo que cross_val_predict será overfit porque como los pliegues aumento, más datos para entrenar y menos para la prueba. De modo que la resultante de la etiqueta es más dependiente de los datos de entrenamiento. También como ya se ha dicho más arriba, la predicción para una muestra, se realiza sólo una vez, por lo que pueden ser susceptibles a la distribución de los datos más.
    Es por eso que la mayoría de los lugares o tutoriales recomiendan el uso de la cross_val_score para el análisis.

    • Muchas gracias, eso está claro 🙂 . Pero todavía me estoy preguntando qué función tenía que utilizar. La primera parece ser el ejemplo me parece más a menudo en los Tutoriales, pero el segundo parece ser el más estable y por lo tanto utilizable enfoque… O podría la evaluación utilizando cross_val_predict ser menos sensibles a sobreajuste?
    • He editado mi respuesta para responder a su pregunta.
    • Gracias de nuevo !
  2. 2

    Creo que la diferencia puede ser claro por la inspección de sus salidas. Considerar este fragmento de código:

    # Last column is the label
    print(X.shape)  # (7040, 133)
    
    clf = MLPClassifier()
    
    scores = cross_val_score(clf, X[:,:-1], X[:,-1], cv=5)
    print(scores.shape)  # (5,)
    
    y_pred = cross_val_predict(clf, X[:,:-1], X[:,-1], cv=5)
    print(y_pred.shape)  # (7040,)

    Aviso de las formas: ¿por qué estas así?
    scores.shape tiene una longitud de 5 porque es un puntaje calculado con la validación cruzada de más de 5 pliegues (ver argumento cv=5). Por lo tanto, un único valor real es calculado para cada pliegue. Ese valor es el resultado del clasificador:

    dado verdadera etiquetas y predijo las etiquetas, cómo muchas de las respuestas del predictor se haga en un pliegue en particular?

    En este caso, los y las etiquetas dadas en la entrada se utiliza dos veces: para aprender de los datos y evaluar las actuaciones del clasificador.

    Por otro lado, y_pred.shape tiene una longitud 7040, que es la forma del conjunto de datos. Que es la longitud del conjunto de datos de entrada. Esto significa que cada valor no es un puntaje calculado en varios valores, pero un solo valor: la predicción de la clasificador:

    dado los datos de entrada y sus etiquetas, ¿cuál es la predicción de la clasificador en un ejemplo específico que fue en un conjunto de pruebas de un pliegue en particular?

    Nota que no sabes de lo que veces se utiliza: cada salida se calcula sobre los datos de prueba de un determinado veces, pero usted no puede decir que (a partir de este resultado, al menos).

    En este caso, las etiquetas se utilizan sólo una vez: para entrenar el clasificador. Su trabajo es comparar estas salidas a la verdadera salidas para el cálculo de la puntuación. Si sólo un promedio de ellos, como lo hizo, la salida no es una puntuación, es simplemente el promedio de la predicción.

Dejar respuesta

Please enter your comment!
Please enter your name here