使用XGBRanker进行超级参数调整和测量性能

问题描述 投票:0回答:1

我正在处理来自Kaggle competition的数据集,其中训练数据包含来自查询(q1,q2,.. qn)的结果,即srch_id。每个查询都会产生可变数量的结果(酒店广告),这些结果已被单击或已被单击并导致该酒店的预订。数据外观示例:

+-----------+-------------------+---------------+---------------+---------+--------+
| srch_id   | hotel_id          | feature 1     | feature 2     | clicked | bought |
+-----------+-------------------+---------------+---------------+---------+--------+
|         1 |                23 | x             | y             |       0 |      0 |
|         1 |                24 | x             | y             |       1 |      0 |
|         1 |                25 | x             | y             |       0 |      0 |
|         1 |                26 | x             | y             |       1 |      1 |
|         2 |                30 | x             | y             |       0 |      0 |
|         2 |                31 | x             | y             |       1 |      0 |
+-----------+-------------------+---------------+---------------+---------+--------+

我正在根据其功能(此处是功能1和功能2)来预测可能会导致预订哪些酒店广告。作为目标变量,我创建了一个标签y,该标签y为已预订,为1表示未预订但已单击,而0表示未预订且未单击。

我认为使用XGBoost将是解决此问题的好方法。由于我们正在处理排名结果,因此我已经使用标准参数实现了XGBRanker。对于每个查询,期望的输出应该是hotel_id,该ID按照预订的可能性进行排序。像这样:

query_id, hotel_id
1, 26
1, 24
1, 23
1, 25
2, ...

该评估是使用归一化折现累计收益ndcg完成的。现在,使用默认参数运行模型后,根据Kaggle,我的ndcg得分为0.36。不错,但是我想通过使用不同的参数来改进。使用XGBRanker时应如何调整?我在互联网上找不到结合XGBRanker和超参数调整的示例。我尝试了以下方法:

from xgboost.sklearn import XGBRanker
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV

model = XGBRanker(objective='rank:ndcg')

params={
 "learning_rate"    : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] ,
 "max_depth"        : [ 3, 4, 5, 6, 8, 10, 12, 15],
 "min_child_weight" : [ 1, 3, 5, 7 ],
 "gamma"            : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ],
 "colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7 ]
}

random_search = RandomizedSearchCV(model, param_distributions=params, n_iter=5, scoring='roc_auc', n_jobs=-1, cv=5, verbose=3)

group_sizes = [train_df[train_df.srch_id == _srch_id].shape[0] for _srch_id in train_df.srch_id.unique()]

random_search.fit(
    X = train_df.drop(['position','date_time', 'gross_bookings_usd', 'y'], axis=1), 
    y = train_df.y, 
    group = group_sizes
)

但是此代码遇到错误:

Check failed: gptr.size() != 0 && gptr.back() == info.labels_.Size(): group structure not consistent with #rows, group ponter size: 199796, labels size: 3966677, group pointer back: 4958347. 

几个问题:

  1. XGBRanker假设有一个目标,在这种情况下为ndcg。随机搜索CV带有评分功能。在这种情况下应该是什么?根据文档,Ndcg不是一个选项。
  2. 由于我使用的是XGBRanker,因此模型需要一个接受列表作为输入的组参数。此列表应包含查询的长度(“组”),它是group_sizes变量。我认为在CV中这些组是混乱的,因此代码不起作用。我应该怎么用呢?
python machine-learning scikit-learn xgboost
1个回答
0
投票

您是否尝试将组大小设置为查询中的行数?所以;

id;酒店

1; 12

1; 9

1; 10

1; 4

2; 3

2; 9

3; 5

3; 3

3; 1

组= [4,2,3]

组的总和应等于数据集中的总行数。

© www.soinside.com 2019 - 2024. All rights reserved.