我正在处理来自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.
几个问题:
您是否尝试将组大小设置为查询中的行数?所以;
id;酒店
1; 12
1; 9
1; 10
1; 4
2; 3
2; 9
3; 5
3; 3
3; 1
组= [4,2,3]
组的总和应等于数据集中的总行数。