Comment adapter les modèles de classement par paire dans xgBoost?

14

Pour autant que je sache, pour apprendre à classer les modèles, vous devez avoir trois éléments dans l'ensemble de données:

  • étiquette ou pertinence
  • identifiant de groupe ou de requête
  • vecteur de fonction

Par exemple, l' ensemble de données Microsoft Learning to Rank utilise ce format (étiquette, identifiant de groupe et fonctionnalités).

1 qid:10 1:0.031310 2:0.666667 ...
0 qid:10 1:0.078682 2:0.166667 ...

J'essaie xgBoost qui utilise des GBM pour faire un classement par paire. Ils ont un exemple pour une tâche de classement qui utilise le programme C ++ pour apprendre sur l'ensemble de données Microsoft comme ci-dessus.

Cependant, j'utilise leur wrapper Python et n'arrive pas à trouver où je peux saisir l'ID de groupe ( qidci-dessus). Je peux entraîner le modèle en utilisant uniquement les fonctionnalités et les scores de pertinence, mais j'ai l'impression de manquer quelque chose.

Voici un exemple de script.

gbm = XGBRegressor(objective="rank:pairwise")

X =  np.random.normal(0, 1, 1000).reshape(100, 10)
y = np.random.randint(0, 5, 100)

gbm.fit(X, y) ### --- no group id needed???

print gbm.predict(X)

# should be in reverse order of relevance score
print y[gbm.predict_proba(X)[:, 1].argsort()][::-1]
tokestermw
la source
Je rencontre également ce problème, mais quel type de set_group dois-je passer à la fonction? lorsque je crée un numpy ou une liste, j'obtiens une erreur comme celle-ci: d: \ build \ xgboost \ xgboost-git \ dmlc-core \ include \ dmlc \ ./ logging.h: 235: [12:03:09] D: \ Build \ xgboost \ xgboost-git \ src \ c_api \ c_api.cc: 342: échec de la vérification: (src.info.group_ptr.size ()) == (0) la tranche ne prend pas en charge la structure de groupe @amyrit
user2404620

Réponses:

9

Selon la documentation XGBoost, XGboost attend:

  • les exemples d'un même groupe pour être des exemples consécutifs,
  • une liste avec la taille de chaque groupe (que vous pouvez définir avec la set_groupméthode de DMatrixPython).
amyrit
la source
1
Merci, on dirait que l'API pour model buildling ( sklearn.py) est un peu incomplète pour le paquet Python.
tokestermw
4

set_groupest très important pour le classement, car seuls les scores d'un groupe sont comparables. Vous pouvez trier les données en fonction de leurs scores dans leur propre groupe.

Pour un classement facile, vous pouvez utiliser mon xgboostExtension .

bigdong
la source