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 ( qid
ci-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]
Réponses:
Selon la documentation XGBoost, XGboost attend:
set_group
méthode deDMatrix
Python).la source
sklearn.py
) est un peu incomplète pour le paquet Python.set_group
est 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 .
la source