Question

Pour autant que je sache, pour former l'apprentissage à des modèles de rang, vous devez avoir trois choses dans l'ensemble de données:

  • l'étiquette ou la pertinence
  • id groupe ou requête
  • vecteur caractéristique

Par exemple, le Microsoft Learning to DataSet Rank utilise ce format (étiquette, identifiant de groupe et caractéristiques).

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

Je suis d'essayer xgBoost qui utilise GBM à faire le classement par paires. 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, je suis en utilisant leur emballage Python et ne peut pas sembler trouver où je peux entrer l'identifiant du groupe (qid ci-dessus). Je peux former le modèle en utilisant seulement les caractéristiques et les scores de pertinence, mais je me sens comme je manque 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]
Était-ce utile?

La solution

Selon la documentation XGBoost , XGboost attend:

  • les exemples d'un même groupe d'être consécutive exemples,
  • une liste avec la taille de chaque groupe (que vous pouvez définir avec la méthode set_group de DMatrix en Python).

Autres conseils

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

Pour le classement facile, vous pouvez utiliser mon xgboostExtension .

Licencié sous: CC-BY-SA avec attribution
scroll top