温馨提示:本文翻译自stackoverflow.com,查看原文请点击:r - sparse.model.matrix creating inconsistent output
matrix r sparse-matrix

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

发布于 2020-04-10 17:20:34

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。

查看更多

提问者
user123965
被浏览
93
Ben Bolker 2020-02-03 21:45

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

(1)浮点计算本质上对小差异(平台,编译器,编译器设置...)敏感 (2)R中的有序因数使用正交多项式对比(请参阅带有S的?contr.poly Venables和Ripley Modern Applied Statistics,或在此处),其中涉及浮点计算。

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