¿Cómo usar la salida de GridSearch?

23

Actualmente estoy trabajando con Python y Scikit para fines de clasificación, y leyendo un poco sobre GridSearch, pensé que esta era una excelente manera de optimizar los parámetros de mi estimador para obtener los mejores resultados.

Mi metodología es esta:

  1. Dividir mis datos en entrenamiento / prueba.
  2. Use GridSearch con validación cruzada 5Fold para entrenar y probar mis estimadores (Random Forest, Gradient Boost, SVC entre otros) para obtener los mejores estimadores con la combinación óptima de hiperparámetros.
  3. Luego calculo métricas en cada uno de mis estimadores, como Precisión, Recuperación, Medición de FM y Coeficiente de correlación Matthews, utilizando mi conjunto de pruebas para predecir las clasificaciones y compararlas con las etiquetas de clase reales.

Es en esta etapa que veo un comportamiento extraño y no estoy seguro de cómo proceder. ¿Tomo el .best_estimator_ de GridSearch y lo uso como la salida 'óptima' de la búsqueda de cuadrícula , y realizo la predicción usando este estimador? Si hago esto, encuentro que las métricas de la etapa 3 son generalmente mucho más bajas que si simplemente entreno en todos los datos de entrenamiento y pruebo en el conjunto de pruebas. ¿O simplemente tomo el objeto GridSearchCV de salida como el nuevo estimador ? Si hago esto, obtengo mejores puntajes para mis métricas de etapa 3, pero parece extraño usar un objeto GridSearchCV en lugar del clasificador previsto (por ejemplo, un bosque aleatorio) ...

EDITAR: Entonces, mi pregunta es ¿cuál es la diferencia entre el objeto GridSearchCV devuelto y el atributo .best_estimator_? ¿Cuál de estos debo usar para calcular más métricas? ¿Puedo usar esta salida como un clasificador regular (p. Ej., Usando predic), o si no, cómo debo usarla?

Dan Carter
fuente

Respuestas:

27

Decidí irme y buscar las respuestas que satisfarían mi pregunta, y escribirlas aquí para que cualquier otra persona se lo preguntara.

El atributo .best_estimator_ es una instancia del tipo de modelo especificado, que tiene la 'mejor' combinación de parámetros dados de param_grid. Si esta instancia es útil o no depende de si el parámetro de reajuste está establecido en Verdadero (es por defecto). Por ejemplo:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

Devolverá un RandomForestClassifier. Todo esto está bastante claro en la documentación . Lo que no está claro en la documentación es por qué la mayoría de los ejemplos no usan específicamente .best_estimator_ y en su lugar hacen esto:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

Este segundo enfoque devuelve una instancia de GridSearchCV, con todas las campanas y silbatos de GridSearchCV como .best_estimator_, .best_params, etc., que se puede usar como un clasificador entrenado porque:

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

Simplemente usa la misma mejor instancia de estimador al hacer predicciones. Entonces, en la práctica, no hay diferencia entre estos dos a menos que específicamente solo desee la instancia del estimador en sí. Como nota al margen, mis diferencias en las métricas no estaban relacionadas y se reducían a una función de ponderación de clase con errores.

Dan Carter
fuente
Gracias por tu publicación @Dan, es muy útil. Quería pedirte una aclaración. En el último caso, si lo he hecho refit=False, clf.fit¿no se hará con el mejor clasificador?
Poete Maudit
@PoeteMaudit El parámetro refit le dice a la función GridSearchCV que tome los mejores parámetros encontrados y vuelva a entrenar el modelo usando esos parámetros en todo el conjunto de datos. Si refit = False, best_estimator no está disponible, según la documentación: scikit-learn.org/stable/modules/generated/…
Dan Carter
0

GridSearchCV le permite combinar un estimador con un preámbulo de búsqueda de cuadrícula para ajustar los hiperparámetros. El método selecciona el parámetro óptimo de la búsqueda de cuadrícula y lo usa con el estimador seleccionado por el usuario. GridSearchCV hereda los métodos del clasificador, por lo que sí, puede usar los métodos .score, .predict, etc. directamente a través de la interfaz GridSearchCV. Si desea extraer los mejores hiperparámetros identificados por la búsqueda de cuadrícula, puede usar .best_params_ y esto devolverá el mejor hiperparámetro. Luego puede pasar este hiperparámetro a su estimador por separado.

Usar .predict directamente producirá los mismos resultados que obtener el mejor hiperparámetro a través de .best_param_ y luego usarlo en su modelo. Al comprender el funcionamiento subyacente de la búsqueda en cuadrícula, podemos ver por qué este es el caso.


Búsqueda de cuadrícula

Esta técnica se utiliza para encontrar los parámetros óptimos para usar con un algoritmo. Este NO es el peso ni el modelo, esos se aprenden usando los datos. Obviamente, esto es bastante confuso, así que distinguiré entre estos parámetros, llamando a uno hiperparámetros.

Los hiperparámetros son como la k en k-vecinos más cercanos (k-NN). k-NN requiere que el usuario seleccione qué vecino considerar al calcular la distancia. Luego, el algoritmo ajusta un parámetro, un umbral, para ver si un nuevo ejemplo se encuentra dentro de la distribución aprendida, esto se hace con los datos.

¿Cómo elegimos k?

Algunas personas simplemente siguen recomendaciones basadas en estudios anteriores del tipo de datos. Otros usan la búsqueda de cuadrícula. Este método podrá determinar mejor qué k es el óptimo para usar con sus datos.

¿Como funciona?

[1,2,3,...,10]

¡Esto va en contra de los principios de no usar datos de prueba!

nortenortenorte-1norte

El valor del hiperparámetro seleccionado es el que logra el rendimiento promedio más alto en los n pliegues. Una vez que esté satisfecho con su algoritmo, puede probarlo en el conjunto de pruebas. Si va directamente al conjunto de prueba, entonces corre el riesgo de sobreajuste.

JahKnows
fuente
Hola Jah, esta es una buena respuesta, pero todavía no soy tan sabio en cuanto a la respuesta de mi pregunta. He actualizado el título de la pregunta y la pregunta en sí para tratar de aclarar las cosas.
Dan Carter
Escribe tu propia red de búsqueda. Literalmente, crea una matriz, luego agrega un bucle for alrededor de tu modelo. Luego, al final de su bucle for, registre el rendimiento resultante en una matriz. Una vez que haya revisado todos los valores posibles en su cuadrícula, mire las matrices de actuaciones y elija la mejor. Ese es el valor óptimo para su hiperparámetro. No es muy recomendable confiar en las funciones integradas para lo básico para la ciencia de datos. ¡Los datos varían enormemente y es mejor que tengas el control!
JahKnows
Esa sería una buena sugerencia si solo tuviera un hiperparámetro para optimizar, pero si tengo 4? 5? Un bucle for 4/5 veces anidado es feo y no veo la necesidad de reinventar la rueda aquí, eso sería una pérdida de tiempo, y es la razón por la que existen paquetes como este.
Dan Carter
GridSearchCV le permite combinar un estimador con la configuración de GridSearchCV. Entonces hace exactamente lo que acabamos de discutir. Luego elige el parámetro óptimo y lo usa con el estimador que seleccionó. GridSearchCV hereda los métodos del clasificador, por lo que sí, puede usar los métodos .score, .predict, etc. directamente a través de la interfaz GridSearchCV. Sin embargo, no recomiendo hacer esto, herramientas más fáciles significan menos control. Para algo tan simple como una búsqueda de cuadrícula, codifíquelo usted mismo.
JahKnows
1
Esta respuesta no aborda la pregunta, que se refiere al uso de GridSearchCV.
Hobbes