Jusqu'à quel point les modèles classement par paire dans xgBoost?
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]
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
deDMatrix
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 .