在XGBoost中,使用预排序的方法来处理节点分裂,会先对每个特征按照特征值大小进行排序,然后保存为block结构,后面的迭代中会重复地使用这个结构,使计算量大大减小。
对这一点存在一些疑问:
举例说明,假设一个样本有“年龄”,“身高”两个特征,取值分别为
[23,24,25,26,27,99],[244,180,181,175,172,168]。
预排序后分别为
[23,24,25,26,27,99],[168,172,175,180,181,244]。
假设第一次选择“年龄”为26进行分裂,分裂后节点左侧的样本为“年龄”[23,24,25]
,身高[244,180,181]
,节点右侧样本为“年龄”[27,99]
,身高[172,168]
。此时,因为切分后样本的变化,身高数据与预排序结果不同,需要重新进行排序,计算节点分裂增益。
如果上述过程没有错误的话,预排序并没有使计算量大幅度减小。不知道有没有哪位大佬可以解答我的困惑。