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.

Ajuste de hiperparámetros con XGBRanker

Estoy tratando de entender cómo ajustar mis hiperparámetros a través de RandomizedSearchCV con un modelo XGBRanker.

Podría dividir los datos en grupos, alimentarlos al modelo y hacer predicciones. Sin embargo, no estoy seguro de cómo configurar el objeto de búsqueda, específicamente dos cosas: cómo informarle sobre los grupos y qué tipo de puntuación debo proporcionar.

model = xg.XGBRanker(
tree_method=’exact’,
booster=’gbtree’,
objective=’rank:pairwise’,
random_state=42,
learning_rate=0.06,
max_depth=5,
n_estimators=700,
subsample=0.75,
#colsample_bytree=0.9,
#subsample=0.75
min_child_weight=0.06
)

model.fit(x_train, y_train, group=train_groups, verbose=True)

Esto funciona bien. Aquí es donde necesito ayuda.
param_dist = {‘n_estimators’: stats.randint(40, 1000),
‘learning_rate’: stats.uniform(0.01, 0.59),
‘subsample’: stats.uniform(0.3, 0.6),
‘max_depth’: [3, 4, 5, 6, 7, 8, 9],
‘colsample_bytree’: stats.uniform(0.5, 0.4),
‘min_child_weight’: [0.05, 0.1, 0.02]
}
clf = RandomizedSearchCV(model,
param_distributions=param_dist,
cv=5,
n_iter=5,
scoring=???, #
error_score=0,
verbose=3,
n_jobs=-1)

¿Qué hay de los grupos?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para informar al objeto RandomizedSearchCV acerca de los grupos, puedes utilizar el parámetro “groups”, el cual recibe un objeto de tipo array que especifica las etiquetas de los grupos.

    En cuanto al parámetro de puntuación, para los modelos XGBRanker, debes utilizar la función “make_scorer” del módulo “sklearn.metrics” y establecer el parámetro “greater_is_better” en “True”, ya que puntuaciones más altas indican un mejor ranking. Ejemplo:

    import sklearn.metrics as metrics
    
    scorer = metrics.make_scorer(metrics.ndcg_score, greater_is_better=True)
    

    Luego, puedes pasar este puntuador al parámetro “scoring” del objeto RandomizedSearchCV.

    Aquí tienes un ejemplo:

    from sklearn.model_selection import GroupKFold, RandomizedSearchCV
    from scipy import stats
    import sklearn.metrics as metrics
    import xgboost as xgb
    
    model = xgb.XGBRanker(
        tree_method='exact',
        booster='gbtree',
        objective='rank:pairwise',
        random_state=42,
        learning_rate=0.06,
        max_depth=5,
        n_estimators=700,
        subsample=0.75,
        min_child_weight=0.06
    )
    
    # asumiendo que train_groups es un objeto de tipo array que contiene las etiquetas de los grupos
    cv = GroupKFold(n_splits=5)
    
    param_dist = {
        'n_estimators': stats.randint(40, 1000),
        'learning_rate': stats.uniform(0.01, 0.59),
        'subsample': stats.uniform(0.3, 0.6),
        'max_depth': [3, 4, 5, 6, 7, 8, 9],
        'colsample_bytree': stats.uniform(0.5, 0.4),
        'min_child_weight': [0.05, 0.1, 0.02]
    }
    
    scorer = metrics.make_scorer(metrics.ndcg_score, greater_is_better=True)
    
    clf = RandomizedSearchCV(
        model,
        param_distributions=param_dist,
        cv=cv,
        n_iter=5,
        scoring=scorer,
        error_score=0,
        verbose=3,
        n_jobs=-1,
        groups=train_groups
    )
    

Comments are closed.