xgboost watchlist参数:DMatrix对象不可迭代

时间:2015-09-03 13:29:22

标签: python python-2.7 numpy xgboost

我正在尝试在数据集X-train, X_test上训练xgboost模型。 代码:

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在最后一行。

需要做什么?

编辑: 如果我故意将np.array置换为TypeError: iteration over a 0-d array,我会得到DMatrix

编辑2: 如果我以这种方式完全避免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 我收到了另一个错误

hAxis

3 个答案:

答案 0 :(得分:2)

根据documentation,监控数据集应以下列形式传递:

\\S

因此,您的代码应该更改为:

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

另外,您可能想要使用

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

,以便生成的掩码是布尔numpy数组而不是bool列表。否则,切片可能无法按预期工作,尽管没有错误(检查原始代码中的训练和验证数据的维度)。

答案 1 :(得分:1)

watchlist = [(dtest, 'test'), (dtrain, 'train')]
bst = xgb.train(params, dtrain, num_rounds, watchlist)

这对我来说很好。

答案 2 :(得分:1)

我目前无法发表评论,但这也许会对某人有所帮助。 就我而言,评估清单中设置的评估和训练顺序很重要。

如果在eval_sets中训练DMatrix首先出现,则它起作用(第一个图)。如果我首先拥有eval DMatrix,则根据训练数据(第二个数据)评估提前停止。这通常不是您想要的。下面的示例代码。

eval_sets = [(Dtrain, 'train'), (Deval, 'eval')] eval_sets = [(Deval, 'eval'), (Dtrain, 'train')]

# train test split and retain test data for final evaluation
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)  

# split train set again into train and validation set
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25)

Dtrain = xgb.DMatrix(X_train, y_train)  
Deval = xgb.DMatrix(X_val, y_val)
eval_sets = [(Dtrain, 'train'), (Deval, 'eval')]
model = xgb.train(params_booster, Dtrain, 
                  verbose_eval=verbose_eval_, evals=eval_sets,        
                  early_stopping_rounds=10, evals_result=progress, 
                  num_boost_round = 250)