xgboost 监视列表参数:DMatrix 对象不可迭代
xgboost watchlist parameter: DMatrix object is not iterable
我正在尝试在数据集 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
编辑 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
根据documentation,监控数据集应按以下形式传递:
evallist = [(dtest,'eval'), (dtrain,'train')]
因此,您的代码应更改为如下所示:
evallist = [(dtrain_watch, 'eval')]
gbdt = xgb.train(xgb_params, dtrain, num_rounds, evallist)
此外,您可能想使用
not_mask = ~mask
相反,生成的掩码是布尔 numpy 数组而不是布尔值列表。否则,虽然没有错误,但切片可能无法按预期工作(检查原始代码中训练和验证数据的维度)。
watchlist = [(dtest, 'test'), (dtrain, 'train')]
bst = xgb.train(params, dtrain, num_rounds, watchlist)
这对我来说效果很好。
我还不能发表评论,但也许这对某人有帮助。
在我的例子中,观察列表中设置的 eval 和 train 的顺序很重要。
如果在 eval_sets 中训练 DMatrix 排在第一位,它就可以工作(第一个图)。如果我首先有 eval DMatrix,则会根据训练数据(第二数据)评估提前停止。这不是你通常想要的。下面的示例代码。
# 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)
我正在尝试在数据集 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
编辑 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
根据documentation,监控数据集应按以下形式传递:
evallist = [(dtest,'eval'), (dtrain,'train')]
因此,您的代码应更改为如下所示:
evallist = [(dtrain_watch, 'eval')]
gbdt = xgb.train(xgb_params, dtrain, num_rounds, evallist)
此外,您可能想使用
not_mask = ~mask
相反,生成的掩码是布尔 numpy 数组而不是布尔值列表。否则,虽然没有错误,但切片可能无法按预期工作(检查原始代码中训练和验证数据的维度)。
watchlist = [(dtest, 'test'), (dtrain, 'train')]
bst = xgb.train(params, dtrain, num_rounds, watchlist)
这对我来说效果很好。
我还不能发表评论,但也许这对某人有帮助。 在我的例子中,观察列表中设置的 eval 和 train 的顺序很重要。
如果在 eval_sets 中训练 DMatrix 排在第一位,它就可以工作(第一个图)。如果我首先有 eval DMatrix,则会根据训练数据(第二数据)评估提前停止。这不是你通常想要的。下面的示例代码。
# 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)