我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。
您会被两个问题的结合所困扰:
(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))
可能会起作用...