2015-09-03 15 views
1

Я пытаюсь обучить модель xgboost на наборе данных X-train, X_test. Код:xgboost параметр наблюдения: объект DMatrix не итерируемый

xgb_params = { 
    "objective": "multi:softmax", 
    "eta": 0.3, 
    "num_class": 62, 
    "max_depth": 10, 
    "nthread": 4, 
    "eval_metric": "merror", 
    "print.every.n": 1 
    #"silent": 1 
} 
num_rounds = 2 

mask = np.random.choice([False, True], len(X_train), p=[0.75, 0.25]) 
not_mask = [not i for i in mask] 

dtrain = xgb.DMatrix(X_train[not_mask], label=y[not_mask]) 
dtrain_watch = xgb.DMatrix(X_train[mask], label=y[mask]) 
dtest = xgb.DMatrix(X_test) 

gbdt = xgb.train(xgb_params, dtrain, num_rounds, dtrain_watch) 
preds = gbdt.predict(dtest) 

Но я получаю сообщение об ошибке: TypeError: 'DMatrix' object is not iterable на второй последней строке.

Что нужно сделать?

EDIT: Если я типаж в np.array намеренно, я получаю TypeError: iteration over a 0-d array

EDIT 2: Если я избегаю DMatrix полностью так: watchlist = list(np.append(X_train[mask], np.matrix(y[mask]).transpose(), axis=1)) я получаю другую ошибку

xgboost.py", line 340, in __init__ 
    raise TypeError('invalid cache item: {}'.format(type(d).__name__)) 
TypeError: invalid cache item: matrix 
+0

Не похоже, что у 'DMatrix' есть поддержка итераций: https://github.com/dmlc/xgboost/blob/master/python-package/xgboost/core.py#L127 – shuttle87

+0

Правда, так что мне нужно придумать это? – sinhayash

ответ

1

Согласно documentation, контрольные наборы данных должны быть переданы в следующем виде:

evallist = [(dtest,'eval'), (dtrain,'train')] 

Таким образом, ваш код должен быть изменен на что-то вроде этого:

evallist = [(dtrain_watch, 'eval')] 
gbdt = xgb.train(xgb_params, dtrain, num_rounds, evallist) 

Кроме того, вы можете использовать

not_mask = ~mask 

вместо так, чтобы полученная маска является булевой NumPy массив вместо список bools. В противном случае нарезка может работать не так, как вы ожидали, хотя ошибки нет (проверьте размер данных обучения и валидации в исходном коде).