【问题标题】:xgboost ranking objectives pairwise vs (ndcg & map)xgboost 排名目标成对 vs (ndcg & map)
【发布时间】:2020-12-03 14:51:15
【问题描述】:

我正在使用 xgboost 在产品概览页面上对一组产品进行排名。这里的相关性标签是在受欢迎程度、盈利能力等方面给出的评级的相关程度。这些特征是与产品相关的特征,如收入、价格、点击次数、展示次数等。

我知道 rank:pariwise、rank:ndcg、rank:map 都实现了 LambdaMART 算法,但它们在优化模型的方式上有所不同。

以下是我的训练集的详细信息。 800 个数据点分为两组(产品类型)。因此,每组有 400 个数据点。标签为 0-3,其中 0 表示无相关性,3 是最高相关性。

x_train 形状

(800, 10)

y_train 形状

800

group_train

[400, 400]

标签 [0., 1., 2., 3.]

同样,下面是我的验证集和测试集。 x_val 形状

(400, 10)

y_val 形状

400

group_val

[200, 200]

x_test 形状

(160, 10)

y_test 形状

160

下面是我最初尝试的模型参数

params = {'objective': 'rank:pairwise', 'learning_rate': 0.1,
          'gamma': 1.0, 'min_child_weight': 0.1,
          'max_depth': 6, 'n_estimators': 100}
model = xgb.sklearn.XGBRanker(**params)
model.fit(x_train_sample, y_train_sample, group_train, verbose=False,
          eval_set=[(x_val_sample, y_val_sample)], eval_group=[group_val])

预测如下所示,这是我所期望的。

7.56624222e-01,  3.05949116e+00,  3.86625218e+00,  1.57079172e+00,
4.26489925e+00,  7.92866111e-01,  3.58812737e+00,  4.02488470e+00,
3.88625526e+00,  2.50904512e+00,  3.43187213e+00,  3.60899544e+00,
2.86354733e+00,  4.36567593e+00,  1.22325927e-01,  2.79849982e+00,

但是当我将目标更改为 rank:ndcg

params = {'objective': 'rank:ndcg', 'learning_rate': 0.1,
          'gamma': 1.0, 'min_child_weight': 0.1,
          'max_depth': 6, 'n_estimators': 100}
model = xgb.sklearn.XGBRanker(**params)
model.fit(x_train_sample, y_train_sample, group_train, verbose=False,
          eval_set=[(x_val_sample, y_val_sample)], eval_group=[group_val])

我的预测完全奇怪。

[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
   0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
   0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,

有人能帮忙知道吗,为什么?

【问题讨论】:

  • 我也有同样的问题!

标签: python machine-learning xgboost ranking


【解决方案1】:

我一开始也有同样的问题。删除伽玛对我有用。你可以试试

params = {'objective': 'rank:ndcg', 'learning_rate': 0.1,
          'min_child_weight': 0.1,
          'max_depth': 6, 'n_estimators': 100}
model = xgb.sklearn.XGBRanker(**params)
model.fit(x_train_sample, y_train_sample, group_train, verbose=False,
          eval_set=[(x_val_sample, y_val_sample)], eval_group=[group_val])```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多