O ile mi wiadomo, aby trenować naukę rangowania modeli, musisz mieć w zestawie danych trzy rzeczy:
- etykieta lub trafność
- identyfikator grupy lub zapytania
- wektor funkcji
Na przykład zestaw danych Microsoft Learning to Rank korzysta z tego formatu (etykieta, identyfikator grupy i funkcje).
1 qid:10 1:0.031310 2:0.666667 ...
0 qid:10 1:0.078682 2:0.166667 ...
Próbuję xgBoost, który wykorzystuje GBM do rangowania par. Mają przykład zadania rankingowego, które korzysta z programu C ++ do uczenia się w zestawie danych Microsoft jak wyżej.
Jednak używam ich opakowania Pythona i nie mogę znaleźć miejsca, w którym mogę wprowadzić identyfikator grupy ( qid
powyżej). Mogę trenować model przy użyciu tylko funkcji i ocen trafności, ale czuję, że czegoś mi brakuje.
Oto przykładowy skrypt.
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]
Odpowiedzi:
Zgodnie z dokumentacją XGBoost, XGboost oczekuje:
set_group
metodyDMatrix
w Pythonie).źródło
sklearn.py
) jest trochę niekompletne dla pakietu Python.set_group
jest bardzo ważny w rankingu, ponieważ tylko wyniki w jednej grupie są porównywalne. Możesz sortować dane według ich wyników we własnej grupie.Dla łatwego rankingu możesz użyć mojego xgboostExtension .
źródło