XGBoost 是否区分 R 中稀疏矩阵中的缺失值和 0?

Does XGBoost distinguish between missing values and 0s in a sparse matrix in R?

有时特征可以有 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 class 清楚地区分了缺失数据和 0,但据我了解,假设 dgCMatrix 中缺失数据的值为 0。

我想知道的是,当 XGBoost 尝试拆分这些数据时,它是否分别处理 0 和丢失的数据?换句话说,当 XGBoost 尝试根据此功能进行拆分时,它是否遵循 NA 协议(检查两个拆分方向)以查找丢失的数据,或者它是否将丢失的数据发送到与非稀疏 0 值相同的位置?

虽然要回答确切的问题:

是的,增益计算不考虑缺失值(不添加到提升树中 children 的梯度和粗麻布的总和),而考虑 0 值(并添加到提升树中 children 的梯度和 hessian 的总和)

所以,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)