首页 > 解决方案 > sparse.model.matrix 创建不一致的输出

问题描述

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

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

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。

标签: rmatrixsparse-matrix

解决方案


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

(1) 浮点计算本质上对微小差异敏感(平台、编译器、编译器设置...) (2) R 中的有序因子使用正交多项式对比(参见?contr.polyVenables 和 Ripley Modern Applied Statistics with S此处),其中涉及浮点计算。

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))可能会工作......


推荐阅读