es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Iterar GridSearchCV en múltiples conjuntos de datos da como resultado idéntico para cada uno.

Estoy intentando realizar una búsqueda de rejilla en Scikit-learn para un algoritmo específico con diferentes hiperparámetros sobre múltiples conjuntos de datos de entrenamiento almacenados en un diccionario dedicado. Primero, llamo a los diferentes hiperparámetros y al modelo que se va a utilizar:

from sklearn.model_selection import GridSearchCV
scoring = ['accuracy', 'balanced_accuracy', 'f1', 'precision', 'recall']
grid_search = {}

Para cada clave en las llaves de X_train_d:
cv = StratifiedKFold(n_splits=5, random_state=1)
model = XGBClassifier(objective=”binary:logistic”, random_state=42)
space = dict()
space[‘n_estimators’]=[50] # 200
space[‘learning_rate’]= [0.5] #0.01, 0.3, 0.5
grid_search= GridSearchCV(model, space, scoring=scoring, cv=cv, n_jobs=3, verbose=2, refit=’balanced_accuracy’)

Luego, creo un diccionario vacío que debería llenarse con tantos objetos GridSearchCV como X_train_d.keys(), a través de:

grid_result = {}
for key in X_train_d.keys():
    grid_result[key] = grid_search.fit(X_train_d[key], Y_train_d[key])

Finalmente, creo tantos conjuntos de datos como claves existentes informando sobre los resultados de puntuación, etc. a través de:

df_grid_results = {}
for key in X_train_d.keys():
    df_grid_results[key]=pd.DataFrame(grid_search.cv_results_)
    df_grid_results[key] = (
    df_grid_results[key]
    .set_index(df_grid_results[key]["params"].apply(
        lambda x: "_".join(str(val) for val in x.values()))
    )
    .rename_axis('kernel')
    )

Todo funciona “perfectamente”, en el sentido de que no se muestra ningún error, excepto por el hecho de que cuando inspecciono los diferentes objetos GridSearchCV o los conjuntos de datos df_grid_results, veo que los resultados son todos idénticos como si los modelos se ajustaran al mismo conjunto de datos una y otra vez, mientras que los diccionarios X_train_d y Y_train_d contienen conjuntos de datos diferentes.

Por supuesto, cuando ajusto un modelo individualmente, como:

model1_cv = grid_search.fit(X_train_d[1], Y_train_d[1])
model2_cv = grid_search.fit(X_train_d[2], Y_train_d[2])

Los resultados difieren como se esperaba.

Siento que estoy pasando por alto algo realmente estúpido y obvio aquí. ¿Alguien puede ayudar? ¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el objeto grid_search que se reutiliza en el bucle para ajustar diferentes conjuntos de datos. Cuando llamas a grid_search.fit en un conjunto de datos varias veces, se sobrescriben los resultados anteriores con los nuevos resultados de la última ajuste.

    Para solucionar esto, puedes crear una nueva instancia de GridSearchCV dentro del bucle para cada conjunto de datos:

    for key in X_train_d.keys():
        cv = StratifiedKFold(n_splits=5, random_state=1)
        model = XGBClassifier(objective="binary:logistic", random_state=42)
        space = dict()
        space['n_estimators']=[50] # 200
        space['learning_rate']= [0.5] #0.01, 0.3, 0.5
        grid_search = GridSearchCV(model, space, scoring=scoring, cv=cv, n_jobs=3, verbose=2, refit='balanced_accuracy')
        grid_result[key] = grid_search.fit(X_train_d[key], Y_train_d[key])
    

    Esto crea una nueva instancia de GridSearchCV para cada conjunto de datos, por lo que los resultados no se sobrescribirán. Luego puedes crear el diccionario df_grid_results como antes para almacenar los resultados de cada conjunto de datos.

    df_grid_results = {}
    for key in X_train_d.keys():
        df_grid_results[key]=pd.DataFrame(grid_result[key].cv_results_)
        df_grid_results[key] = (
        df_grid_results[key]
        .set_index(df_grid_results[key]["params"].apply(
            lambda x: "_".join(str(val) for val in x.values()))
        )
        .rename_axis('kernel')
        )
    

    Con esta actualización, cada conjunto de datos debería ser tratado por separado y deberías obtener resultados únicos para cada objeto GridSearchCV.

Comments are closed.