You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

xgboost.QuantileDMatrix使用自定义迭代器为何四次遍历数据集?

问题原因与解决方案

为什么会遍历四次?

你看到的四次遍历是因为QuantileDMatrix的默认行为:它需要构建分位数草图(用于直方图优化的分桶计算),默认会通过多轮遍历数据来精确估算分位数统计量,确保后续模型训练的数值精度。这个过程是XGBoost内部为生成高质量分位数摘要触发的,和你的迭代器逻辑无关。

另外你的迭代器存在计算错误:

self.batches = np.ceil(len(df) // self.batch_size)

//是整数除法,比如len(df)=100、batch_size=30时,100//30=3,np.ceil(3)还是3,但实际应该是4个批次(30+30+30+10)。正确计算应为:

self.batches = int(np.ceil(len(df) / self.batch_size))

这个错误会导致最后一个小批次被跳过,需要修正。

如何实现单次遍历?

可以通过给QuantileDMatrix指定参数,强制单次遍历构建分位数草图:
创建xgb_data时添加single_pass=True参数:

xgb_data = xgb.QuantileDMatrix(iterator, single_pass=True)

这个参数会让XGBoost只遍历一次数据生成分位数草图,代价是分位数精度略有降低(误差由sketch_eps参数控制,默认0.01),但多数场景下这个精度损失可接受。

若需要更高精度同时减少遍历次数,还可调整sketch_eps参数(值越小精度越高,所需遍历次数可能越多),结合single_pass=True使用即可。

内容的提问来源于stack exchange,提问作者user601297

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:22:18