sparse.model.matrix 创建不一致的输出

sparse.model.matrix creating inconsistent output

我在两台不同的服务器上有一个 xgboost 模型 - 测试服务器和生产服务器。每个服务器都有完全相同的数据和完全相同的代码,但是当我将相同的模型应用于每个环境中的相同数据时,我得到的结果略有不同。我们需要结果相同。

我发现以下行 returns 的稀疏矩阵对象在每个服务器上都不同:

mm <- sparse.model.matrix(y ~ ., data = df.new)[,-1]

测试服务器上的 mm@i@x 长度为 182,而生产服务器上的 mm@i@x 长度为 184。我再次比较了两个服务器的 df.new,它们是相同的。

我已经尝试在生产服务器上降级 Matrix 包以便版本匹配,但它仍然产生不同的结果。我剩下的唯一想法是匹配每个包的版本。

有人对可能发生的事情有什么建议吗?不幸的是,我无法共享数据,但如果有帮助的话,它是 227 个混合类型的变量(转换为稀疏模型矩阵时为 775 个)。很多变量大多为0.

不知道有没有区别,测试服务器是Windows,生产服务器是Linux.

你被两个问题的结合所困扰:

(1) 浮点计算是 inherently sensitive to small differences (platform, compiler, compiler settings ...) (2) R 中的有序因子使用 正交多项式 对比(参见 ?contr.poly、Venables 和 Ripley Modern Applied Statistics with S,或here),涉及浮点运算

dd <- data.frame(x=ordered(0:2))
> Matrix::sparse.model.matrix(~x,dd)
3 x 3 sparse Matrix of class "dgCMatrix"
  (Intercept)           x.L        x.Q
1           1 -7.071068e-01  0.4082483
2           1 -7.850462e-17 -0.8164966
3           1  7.071068e-01  0.4082483

您可以看到此处的一项接近但不完全等于零。到目前为止,我还没有真正想出一个例子来显示我手头的两个平台(Ubuntu Linux 和 MacOS)之间的差异,但这几乎可以肯定是你的来源问题;几乎为零的条目在一个平台上计算为完全零,而在另一个平台上则不然。

这个问题可能没有完美的解决方案,但是 zapsmall() 会将小条目转换为零,而 drop0 会将它们从显式转换为隐式(结构)零条目,因此 drop0(zapsmall(mm)) 可能有效 ...