python - xgboost 监视列表参数 : DMatrix object is not iterable

标签 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

编辑 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

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

关于python - xgboost 监视列表参数 : DMatrix object is not iterable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32377040/

相关文章:

python - 使用 pymssql 成功连接到 Azure 上的 MS SQL DB,执行 INSERT 语句,没有错误消息,但插入了 0 行

python - Numpy Array 将主数组的列非顺序划分为n个子数组

python - 如何对数组中的范围值求和,其中每行都有不同的范围

python - Pandas GroupBy 列值并根据每个组中的值创建固定大小的列表

python - Django 在渲染中传递多个变量

python - 在没有管理员在场的情况下删除私信

python - 根据我给定的列表获取行,而无需修改顺序或唯一列表

Appengine 上的 Python 使用 BeautifulSoup ImportError : No module named bs4

python - mysql数据库优先级顺序

Windows 上的 Python : path as subprocess argument gets modified and generating error