不同的结果sklearn vs statsmodels和sklearn在不同的机器上

时间:2016-02-22 23:23:18

标签: scikit-learn statsmodels jupyter-notebook

我发现这个是一个真正令人头疼的问题。我有一个python 2笔记本,我用它来在笔记本电脑和台式机上进行线性回归。在笔记本电脑上sklearn提供与statsmodels相同的结果。但是,在桌面上,statsmodels会提供正确的结果,但sklearn会给出错误的结果。许多系数估计值刚刚超过应有的8个数量级,例如304952680 vs -0.1271。再次,我保存笔记本,将其拉到笔记本电脑上,再次运行,statsmodels vs sklearn线性回归结果相同。在桌面上从头开始重新连接并重新运行笔记本,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

1 个答案:

答案 0 :(得分:1)

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

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

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

注意:在我的假设中,我可能错了。通过奇异值验证共线性会很好。如果您这样做,请发表评论。

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