XGBoost:xgb.cv调用有什么问题?

时间:2016-06-06 01:28:33

标签: python xgboost

我试图在Python上使用xgboost。

这是我的代码。 xgb.train有效,但我误以为xgb.cv 虽然看起来我用它是正确的方法。

以下适用于我:

###### XGBOOST ######

import datetime
startTime = datetime.datetime.now()

import xgboost as xgb
data_train   = np.array(traindata.drop('Category',axis=1))
labels_train = np.array(traindata['Category'].cat.codes)

data_valid   = np.array(validdata.drop('Category',axis=1))
labels_valid = np.array(validdata['Category'].astype('category').cat.codes)

weights_train = np.ones(len(labels_train))
weights_valid  = np.ones(len(labels_valid ))

dtrain = xgb.DMatrix( data_train, label=labels_train,weight = weights_train)
dvalid  = xgb.DMatrix( data_valid , label=labels_valid ,weight = weights_valid )

param = {'bst:max_depth':5, 'bst:eta':0.05, # eta [default=0.3]
         #'min_child_weight':1,'gamma':0,'subsample':1,'colsample_bytree':1,'scale_pos_weight':0, # default
         # max_delta_step:0 # default
         'min_child_weight':5,'scale_pos_weight':0, 'max_delta_step':2,
         'subsample':0.8,'colsample_bytree':0.8,
         'silent':1, 'objective':'multi:softprob' }

param['nthread'] = 4
param['eval_metric'] = 'mlogloss'
param['lambda'] = 2
param['num_class']=39

evallist  = [(dtrain,'train'),(dvalid,'eval')] # if there is a validation set
# evallist  = [(dtrain,'train')]                   # if there is no validation set

plst = param.items()
plst += [('ams@0','eval_metric')]

num_round = 100

bst = xgb.train( plst, dtrain, num_round, evallist,early_stopping_rounds=5 ) # early_stopping_rounds=10 # when there is a validation set

# bst.res=xgb.cv(plst,dtrain,num_round,nfold = 5,evallist,early_stopping_rounds=5)

bst.save_model('0001.model')

# dump model
bst.dump_model('dump.raw.txt')
# dump model with feature map
# bst.dump_model('dump.raw.txt','featmap.txt')

x = datetime.datetime.now() - startTime
print(x)

但如果我更改了这一行:

bst = xgb.train( plst, dtrain, num_round, evallist,early_stopping_rounds=5 )

到此:

bst.res=xgb.cv(plst,dtrain,num_round,nfold = 5,evallist,early_stopping_rounds=5)

我收到以下意外错误:

  
File "<ipython-input-46-ebdf0546f464>", line 45
    bst.res=xgb.cv(plst,dtrain,num_round,nfold = 5,evallist,early_stopping_rounds=5) SyntaxError: non-keyword arg after
keyword arg

编辑: 遵循以下来自@martineau的建议,并尝试此

bst.res=xgb.cv(plst,dtrain,num_round,evallist,nfold = 5,early_stopping_rounds=5)

产生此错误

  

TypeError Traceback(最近一次调用   最后)in()        43#bst = xgb.train(plst,dtrain,num_round,evallist,early_stopping_rounds = 5)#early_stopping_rounds = 10#when   有一个验证集        44   ---&GT; 45 bst.res = xgb.cv(plst,dtrain,num_round,evallist,nfold = 5,early_stopping_rounds = 5)        46        47 bst.save_model(&#39; 0001.model&#39;)

     

TypeError:cv()为关键字参数获取了多个值&#39; nfold&#39;

2 个答案:

答案 0 :(得分:2)

您无法在evallist中使用cv。 因此,您应该从evallist调用的参数中删除xgb.cv。 换句话说,你应该尝试:

bst.res = xgb.cv(plst, dtrain, num_round, nfold=5, early_stopping_rounds=5)

而不是

bst.res=xgb.cv(plst,dtrain,num_round,nfold = 5,evallist,early_stopping_rounds=5)

克里斯, python培训API在pith版本和github中的当前主分支之间略有变化。他们主要向verbose_eval函数添加了关键字args callbacksfoldscvverbose_evalcallbacks关键字已经存在于train函数的点数版本中,但不存在于cv函数中。

答案 1 :(得分:0)

我的理解是,通过pip安装xgboost导致此错误,现在已经过时了。应该按如下方式安装XGBoost:

git clone --recursive https://github.com/dmlc/xgboost
cd xgboost; make -j4 
cd python-package; sudo python setup.py install