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)
有时特征可以有 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)