为什么 xgboost.QuantileDMatrix 使用自定义数据迭代器对数据进行四次传递?

问题描述 投票:0回答:1

我正在尝试使用自定义数据迭代器,如此处所示,因为我的数据集太大。为了测试它是如何工作的,我正在使用示例的子集并运行以下代码。

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
时,它会遍历整个数据集四次。我试图理解为什么它要传递数据四次。有没有一种方法可以只通过一次数据来实现它正在做的事情?

python machine-learning parallel-processing xgboost quantile
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.