有时功能可能有0和缺少值。例如,也许你可以测量一组棒球投手每投手每场比赛的击球数,你最终得到的是一个特征向量
feats <- c(NA, NA, NA, 3.7, 0, 2.2)
在这里,1投手平均每场比赛0次三振,3投手没有记录任何数据,因为他们还没有投球。当我们将其转换为稀疏矩阵时,我们会得到类似的东西
library(Matrix)
sparse1 <- sparseMatrix(i=4:6, j=rep(1, 3), x=c(3.7, 0, 2.2), dims=c(6, 1))
sparse1
[1,] .
[2,] .
[3,] .
[4,] 3.7
[5,] 0.0
[6,] 2.2
在这里,dgCMatrix
类清楚地将缺失的数据与0区分开来,但据我所知,dgCMatrix
中的缺失数据被假定为取值0。
我想知道的是,当XGBoost试图分割这些数据时,它是否分别处理0和丢失的数据?换句话说,当XGBoost尝试拆分此功能时,它是否遵循NA协议(检查两个拆分方向)以查找丢失的数据,还是将丢失的数据发送到与非稀疏0值相同的位置?
要回答确切的问题:
是的,增益计算不考虑缺失值(不增加增强树中子项的梯度和粗体的总和),同时考虑0值(并添加到子项的梯度和粗体的总和)在一个助推树)
所以,0和缺失值是不一样的。
在您的代码中,您明确指定稀疏矩阵的表示。所有其他人都被隐含地假定为零。它们被显示为点,但这并不意味着它们是NA。 as.matrix()
将显示这些点实际上是零。
library(Matrix)
sparse1 <- sparseMatrix(i=4:6, j=rep(1, 3), x=c(3.7, 0, 2.2), dims=c(6, 1))
as.matrix(sparse1)