xgBoost [Rank:Pairwise]:交叉验证没有按预期工作(它启动运行时错误)

时间:2017-11-16 09:37:26

标签: python machine-learning ranking cross-validation xgboost

  • 操作系统:MacOSX 10.12.4
  • 编译器:gcc5
  • 使用的包(python / R / jvm / C ++):Python
  • ' xgboost'使用的版本:0.6(昨天从
  • Python版本= 2.7.13

重现的步骤

我想应用成对排名模型,作为此库中的一个(https://github.com/dmlc/xgboost)。

在设置DMatrix并使用set_group()方法(我已经将numpy.array数据结构传递给此方法)之后,我在CrossValidation时遇到了问题。 这是我的Python源代码:

xgdmat = xgb.DMatrix(X_training, y_training) # Create our DMatrix to make XGBoost more efficient
xgdmat.set_group(group=groups_query_id) # Set the query_id values to DMatrix data structure

model_parameters = {'objective': 'rank:pairwise', 'seed': 0, 'booster' : ['gbtree', 'gblinear, dart'],
'eta': [0.1, 0.2, 0.3, 0.4, 0.5], 'gamma' : [0, 1],
'subsample': [0.5, 0.75, 0.9],
'max_depth': [3, 5], 'min_child_weight': 1, 'max_delta_step' : 0,
'colsample_bytree': [0.5, 0.75, 0.9], 'colsample_bylevel' : [0.5, 0.75, 0.9],
'lambda' : 1, 'alpha' : 0, 'tree_method' : ['auto', 'exact', 'approx', 'hist']}

cv_xgb = xgb.cv(params=model_parameters, dtrain=xgdmat, num_boost_round=1000, nfold=10, metrics=['auc', 'ndcg', 'map'], early_stopping_rounds=100) #THE PROBLEM OCCURS HERE!!!

print cv_xgb.tail(5)

final_gb = xgb.train(model_parameters, xgdmat, num_boost_round=500)

当我启动这个程序时,我发现了这种问题:
"检查失败:(src.info.group_ptr.size())==(0)切片不支持组结构"

 [15:43:58] dmlc-core/include/dmlc/logging.h:235: [15:43:58] src/c_api/c_api.cc:342: Check failed: (src.info.group_ptr.size()) == (0) slice does not support group structure

[15:43:58] dmlc-core / include / dmlc / logging.h:235:[15:43:58] src / c_api / c_api.cc:342:检查失败:(src.info.group_ptr .size())==(0)切片不支持组结构 回溯(最近一次调用最后一次):File" /Users/edoardo/PycharmProjects/MasterThesisProject/extra/Prova.py" ;,第225行,在metodo3()文件" / Users / edoardo / PycharmProjects / MasterThesisProject / extra / Prova.py",第164行,在metodo3指标= [' auc,'' ndcg',' map'],early_stopping_rounds = 100)文件" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/xgboost/training.py" ;,第371行,cv cvfolds = mknfold(dtrain, nfold,params,seed,metrics,fpreproc,stratified,folds)File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/xgboost/training.py" ,第248行,在mknfold中dtrain = dall.slice(np.concatenate([idset [i] for i in range(nfold)if k!= i]))File" /Library/Frameworks/Python.framework/版本/ 2.7 / lib / python2.7 / site-packages / xgboost / core.py",第531行,在切片ctypes.byref(res.handle)中))文件" / Library / Frameworks / Python。框架/版本/ 2.7 / lib中/ python2.7 / site-packages中/ xgboost / core.py",第127行,在_check_call中引发XGBoostError(_LIB.XGBGetLastError())xgboost.core.XGBoostError:[15:43:58] src / c_api / c_api.cc:342:检查失败:( src.info.group_ptr.size())==(0)切片不支持组结构

你有什么尝试?

  1. 我尝试传递numpy.array作为set_group()方法的输入
  2. 我尝试将列表作为set_group()方法的输入传递
  3. 解决此问题的任何提示或解决方法?我知道很多人和我有同样的问题,但我无法找到解决方案。

1 个答案:

答案 0 :(得分:0)

同样的事发生在我身上。 根据我的错误消息,也许它与xgb.cv有关,并且很有趣。

基本上对于群体信息,应该进行分层的nfold,但如何进行分层的nfold?有标签还是group_info?哪一个更有意义呢?也许它不清楚。

尝试直接使用sklearn的分层K-Folds代替。或者只使用不同的组。有些人为火车,有些人为考试。