【问题标题】:Different results sklearn vs statsmodels and sklearn on different machines不同机器上的 sklearn vs statsmodels 和 sklearn 结果不同
【发布时间】:2016-11-19 10:15:36
【问题描述】:

我发现这个真是让人头疼。我有一个 python 2 笔记本,用于在笔记本电脑和台式机上进行线性回归。在笔记本电脑上sklearn 给出与 statsmodels 相同的结果。但是,在桌面上,statsmodels 给出了正确的结果,但sklearn 给出了错误的结果。许多系数估计值刚刚比应有的值大 8 个数量级,例如,304952680-0.1271。再次,我保存笔记本,将其拉到我的笔记本电脑上,再次运行它,statsmodelssklearn 线性回归结果相同。在桌面上从头开始重新连接并重新运行笔记本,statsmodels 再次正确,但sklearn LinearRegression 再次爆炸。我很迷惑。有人有什么想法吗?

这是通过 nbviewer 链接的两个要点。它们很长,但例如比较单元格 59 和 62,变量 M12_CS_Months_Since_Last_Gift。对于笔记本,statsmodels(单元格 59)与 sklearn(单元格 62)一致。对于桌面,他们不同意(请参阅桌面单元 62 中的该变量)。可能值得注意的一件事是:数据的特征在于对应于相同观察值的预测空间的大段。也许这表明建议的接近共线性?我会检查奇异值。欢迎提出其他建议或对该建议采取后续行动。笔记本电脑是 64 位 windows 8.1/statsmodels v.0.6.1/sklearn 0.17。桌面是 windows 10 64 位,相同的 statsmodels/sklearn 模块版本。 笔记本:http://nbviewer.jupyter.org/gist/andersrmr/fb7378f3659b8dd48625 桌面:http://nbviewer.jupyter.org/gist/andersrmr/76e219ad14ea9cb92d9e

【问题讨论】:

  • 能否举一个可重现的例子,说明两组硬件的区别?
  • 另外,你是如何在每台机器上安装 python、statsmodels 和 sklearn 的?
  • 如何创建可重现的跨硬件差异示例?两台机器都是windows anaconda安装的。笔记本电脑仍然在 Windows 8.1 上,台式机是 Windows 10。桌面 anaconda 安装要更新得多。
  • 好吧,你表面上是在两台机器上对同一个数据集进行线性回归,所以你应该在问题中包含那个数据集,这样人们就可以自己测试它,看看他们是否得到一致的答案。您还应该显示用于执行回归的命令。最后,您应该编辑问题以包含硬件和安装信息,而不是在 cmets 中发布它。以下是关于如何创建可重现示例的一些很好的解释:stackoverflow.com/questions/20109391/…
  • 我同意代码和数据(或至少一些关于数据的统计数据)会有所帮助。最好包括您正在使用的 sklearn 和 statsmodels 版本。另外,您说系数不同。这种差异是否会显着影响预测值,或者这些差异是否会在您的数据上相互平衡?我怀疑您的问题是由几乎线性相关的数据列的存在引起的。您可以通过各种方式检查线性相关性。一个简单的方法是计算奇异值。

标签: scikit-learn statsmodels jupyter-notebook


【解决方案1】:

我看了你的笔记本。看起来您的笔记本电脑和台式机模型在训练集上的性能几乎相同。这意味着这些大系数值在您的训练集上相互平衡。因此,笔记本电脑的结果并非完全错误,它只是违背了您可能想要附加到它的那种解释。它也有更大的过度拟合风险(我没有看到你是否在测试集上得分,但你应该这样做)。基本上,如果您尝试将此拟合模型应用于违反训练集中观察到的共线性的示例,您将得到荒谬的预测。

为什么这发生在一台机器上而不是另一台机器上?基本上,几乎共线的预测变量集上的系数在数值上是不稳定的,这意味着非常小的扰动会导致大的差异。因此,用户通常不可见的基础数值库中的差异可能导致系数发生显着变化。如果您从线性代数的角度来考虑它,那么为什么会发生这种情况是有道理的。如果两个预测变量完全共线,则它们的系数之和将是固定的,但只要另一个系数平衡,两个系数中的任何一个都可以无限制地增长。

解决办法是什么?如果这些变量之间始终存在真实、精确的依赖关系,您可能会忽略这个问题。但是,我不会,因为你永远不知道。否则,要么手动删除依赖列(这不会损害预测),使用自动变量选择或降维技术进行预处理,或者使用正则化回归方法(例如岭回归)。

注意:我的假设可能是错误的。最好通过奇异值来验证共线性。如果你这样做,请发表评论。

第二个注意事项:有最小二乘求解器会自动将相关列清零。如果您查看 scipy.linalg.lstsq,您可以传递一个截止参数 (cond) 以将小的奇异值归零。此外,如您所见,一些求解器比其他求解器更稳定。您总是可以只使用更稳定的求解器。

【讨论】:

  • 这是一个奇异的设计矩阵。 statsmodels 摘要显示条件数为 1.13e+16,这意味着本质上存在奇异特征值。 statsmodels 默认使用 pinv,它在 SVD 中使用正则化,使用非常小的小于 1e-15 IIRC 的 numpy 默认值。 (摘要的打印版本会显示警告文本,但它不包含在 html 版本中。)
猜你喜欢
  • 2020-06-23
  • 2014-01-08
  • 2021-12-26
  • 2018-06-04
  • 2021-01-01
  • 2016-11-21
  • 2018-11-28
  • 2018-06-14
  • 2016-10-24
相关资源
最近更新 更多