r - 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。
解决方案
你被两个问题的结合所困扰:
(1) 浮点计算本质上对微小差异敏感(平台、编译器、编译器设置...)
(2) R 中的有序因子使用正交多项式对比(参见?contr.poly
Venables 和 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))
可能会工作......
推荐阅读
- php - 无法从 epever 读取数据到树莓派
- javascript - li 元素的数组
- mysql - Left join where left table column = something or null
- java - 数组输出循环
- sweetalert2 - 无法在 Laravel 6.0 中安装 SweetAlert2
- r - 将 *.txt 输出文件中的数据提取到 R 中
- c# - 试图让 HttpTrigger 传递一个 blob
- python - python 中是否有类似于 `numpy.cumsum` 或 `numpy.cumprod` 的函数,如`cumreduce`?
- mysql - UPDATE TRIGGER 中的“WHERE”条件给出语法错误:mysql 5.7 版
- javascript - setState 被设置为数组 onClick 的最后一个元素,而与目标元素无关