我目前正在XGBoost/lightGBM之間進行測試,以便對項目進行排名。我正在複製這裏提供的基準:https://github.com/guolinke/boosting_tree_benchmarks。XGBoost/lightGBM如何評估ndcg的排名任務?
我已經能夠成功地重現他們的工作中提到的基準。我想確保我正確實現了我自己的ndcg指標版本,並正確理解排名問題。
我的問題是:
當使用NDCG創建測試集驗證 - 有一個test.group文件說,第一個X行是組0等。爲了得到建議我得到預測值和已知的相關分數,並按照每個組的預測值降序對該列表進行排序?
爲了從上面創建的列表中獲得最終的ndcg分數 - 我是否獲得ndcg分數並對所有分數取平均值?這與XGBoost/lightGBM在評估階段的評估方法是否相同?
這是我在模型完成培訓後評估測試集的方法。
對於最終的樹,當我運行lightGBM
我獲得驗證集這些值:
[500] valid_0's [email protected]: 0.513221 valid_0's [email protected]: 0.499337 valid_0's [email protected]: 0.505188 valid_0's [email protected]: 0.523407
我的最後一步是走對測試集的預測輸出和計算預測的NDCG值。
這裏是計算NDCG我的Python代碼:
import numpy as np
def dcg_at_k(r, k):
r = np.asfarray(r)[:k]
if r.size:
return np.sum(np.subtract(np.power(2, r), 1)/np.log2(np.arange(2, r.size + 2)))
return 0.
def ndcg_at_k(r, k):
idcg = dcg_at_k(sorted(r, reverse=True), k)
if not idcg:
return 0.
return dcg_at_k(r, k)/idcg
後,我得到了一組特定的測試集的預測(GROUP-0)我有這些預言:
query_id predict
0 0 (2.0, -0.221681199441)
1 0 (1.0, 0.109895548348)
2 0 (1.0, 0.0262799346312)
3 0 (0.0, -0.595343431322)
4 0 (0.0, -0.52689043426)
5 0 (0.0, -0.542221350664)
6 0 (1.0, -0.448015576024)
7 0 (1.0, -0.357090949646)
8 0 (0.0, -0.279677741045)
9 0 (0.0, 0.2182200869)
注意
集團0實際上有大約112行。
我再排序元組的列表按降序排列,其提供的相關評分列表:
def get_recommendations(x):
sorted_list = sorted(list(x), key=lambda i: i[1], reverse=True)
return [k for k, _ in sorted_list]
relavance = evaluation.groupby('query_id').predict.apply(get_recommendations)
query_id
0 [4.0, 2.0, 2.0, 3.0, 2.0, 2.0, 2.0, 2.0, 2.0, ...
1 [4.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 2.0, 1.0, ...
2 [2.0, 3.0, 2.0, 2.0, 1.0, 0.0, 2.0, 2.0, 1.0, ...
3 [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, ...
4 [1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, ...
最後,對於每個查詢ID我計算的相關名單上的NDCG分數,然後取平均值所有NDCG得分爲每個查詢ID計算:
relavance.apply(lambda x: ndcg_at_k(x, 10)).mean()
我得到的值是~0.497193
。