Wie fit paarweise Ranking -Modelle in Xgboost?
Frage
Soweit ich weiß, müssen Sie im Datensatz drei Dinge im Datensatz haben, um das Lernen für die Rangliste von Modellen zu trainieren:
- Etikett oder Relevanz
- Gruppen- oder Abfrage -ID
- Feature -Vektor
Zum Beispiel die Microsoft Learning, um den Datensatz zu rangieren Verwendet dieses Format (Etikett, Gruppen -ID und Funktionen).
1 qid:10 1:0.031310 2:0.666667 ...
0 qid:10 1:0.078682 2:0.166667 ...
Ich probiere XGBOOST aus, der GBMs verwendet, um ein paarweise Ranking zu erzielen. Sie haben eine Beispiel für eine Ranking -Aufgabe Das wird das C ++ - Programm verwendet, um wie oben oben auf dem Microsoft -Datensatz zu lernen.
Ich benutze jedoch ihre Python -Wrapper und kann nicht herausfinden, wo ich die Gruppen -ID eingeben kann (qid
Oben). Ich kann das Modell nur mit den Funktionen und Relevanzwerken trainieren, aber ich habe das Gefühl, dass ich etwas fehlt.
Hier ist ein Beispielskript.
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]
Lösung
Laut dem Xgboost -Dokumentation, Xgboost erwartet:
- Die Beispiele derselben Gruppe, um aufeinanderfolgende Beispiele zu sein,
- eine Liste mit der Größe jeder Gruppe (mit der Sie festlegen können
set_group
Methode vonDMatrix
in Python).
Andere Tipps
set_group
ist sehr wichtig für das Ranking, da nur die Ergebnisse in einer Gruppe vergleichbar sind. Sie können Daten nach ihren Punktzahlen in ihrer eigenen Gruppe sortieren.
Für das einfache Ranking können Sie meine verwenden xgboostxtsion.