我正在尝试使用自定义数据迭代器,如此处所示,因为我的数据集太大。为了测试它是如何工作的,我正在使用示例的子集并运行以下代码。
X
是我的数据的 numpy 数组。
我的迭代器如下所示
class IterForQDMatrix(xgb.core.DataIter):
def __init__(self, df, batch_size):
self.df = df
self.batch_size = batch_size
self.batches = np.ceil(len(df) // self.batch_size)
self.it = 0
super().__init__()
def reset(self):
self.it = 0
def next(self, input_data):
if self.it == self.batches:
print("done")
return 0
a = self.it * self.batch_size
b = min((self.it + 1) * self.batch_size, len(self.df))
input_data(data=self.df[a:b, : -1], label=self.df[a:b, -1])
self.it += 1
return 1
iterator = IterForQDMatrix(X, 30)
xgb_data = xgb.QuantileDMatrix(iterator)
当我运行上面的代码时,我注意到
"done"
被打印了四次,这意味着当我将迭代器传递给 xgb.QuantileDMatrix
时,它会遍历整个数据集四次。我试图理解为什么它要传递数据四次。有没有一种方法可以只通过一次数据来实现它正在做的事情?
QuantileDMatrix 在其构建过程中消耗迭代器四次以执行以下任务:
计算总体数据形状 \https://github.com/dmlc/xgboost/blob/master/src/data/iterative_dmatrix.cc#L172
构建直方图
https://github.com/dmlc/xgboost/blob/master/src/data/iterative_dmatrix.cc#L206\
将 bin 索引存储在行主顺序矩阵中\ https://github.com/dmlc/xgboost/blob/master/src/data/iterative_dmatrix.cc#L242\
将 bin 索引存储在列主顺序矩阵中
https://github.com/dmlc/xgboost/blob/master/src/data/iterative_dmatrix.cc#L267