sklearn 与 statsmodels 和 sklearn 在不同机器上的不同结果
Different results sklearn vs statsmodels and sklearn on different machines
我发现这个真的让人头疼。我有一个 python 2 笔记本,我用它在笔记本电脑和台式机上进行线性回归。在笔记本电脑上 sklearn
给出与 statsmodels 相同的结果。但是,在桌面上,statsmodels
给出了正确的结果,而 sklearn
给出了错误的结果。许多系数估计值比它们应该的值大了 8 个数量级,例如 304952680
vs -0.1271
。再次,我保存了笔记本,将其拉到我的笔记本电脑上,再次 运行,statsmodels
与 sklearn
线性回归结果相等。重新连接并在桌面上从头开始重新 运行 笔记本,同样,statsmodels
是正确的,但是 sklearn
LinearRegression
再次爆炸。我很困惑。有人有什么想法吗?
这是通过 nbviewer 链接的两个要点。它们很长,但比较一下,例如,单元格 59 和 62,变量 M12_CS_Months_Since_Last_Gift
。对于笔记本,statsmodels(单元格 59)与 sklearn(单元格 62)一致。对于桌面,他们不同意(请参阅桌面单元格 62 中该变量的放大图)。可能值得注意的一件事:数据的特点是预测变量 space 的大段对应于相同的观察值。也许这表明建议的接近共线性?我会检查奇异值。欢迎提出其他建议或跟进该建议。笔记本电脑是 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
我看了你的笔记本。看起来您的笔记本电脑和台式机型号在训练集上的表现几乎相同。这意味着这些大系数值在您的训练集上相互平衡。因此,笔记本电脑的结果并不完全错误,它只是违背了您可能想要附加的那种解释。它也有更大的过拟合风险(我没有看到你是否在测试集上给它打分,但你应该这样做)。基本上,如果您尝试将此拟合模型应用于违反训练集中观察到的共线性的示例,您将得到荒谬的预测。
为什么这发生在一台机器上而不是另一台机器上?基本上,几乎共线的预测变量集的系数在数值上是不稳定的,这意味着非常小的扰动会导致很大的差异。因此,用户通常看不到的基础数值库中的差异可能会导致系数发生显着变化。如果您从线性代数的角度考虑它,就会明白为什么会发生这种情况。如果两个预测变量完全共线,则它们的系数之和将是固定的,但只要另一个系数平衡,两个系数中的任何一个都可以无限制地增长。
有什么解决办法?如果这些变量之间始终存在真实、准确的依赖关系,则您可以忽略该问题。但是,我不会,因为你永远不知道。否则,要么手动删除相关列(这不会影响预测),使用自动变量选择或降维技术进行预处理,要么使用正则化回归方法(例如岭回归)。
注意:我的假设可能是错误的。最好通过奇异值来验证共线性。如果你这样做,请发表评论。
第二个注意:最小二乘求解器会自动将相关列归零。如果您查看 scipy.linalg.lstsq,您可以传递一个截止参数 (cond
) 以便将小的奇异值归零。此外,如您所见,某些求解器比其他求解器更稳定。你总是可以只使用更稳定的求解器。
我发现这个真的让人头疼。我有一个 python 2 笔记本,我用它在笔记本电脑和台式机上进行线性回归。在笔记本电脑上 sklearn
给出与 statsmodels 相同的结果。但是,在桌面上,statsmodels
给出了正确的结果,而 sklearn
给出了错误的结果。许多系数估计值比它们应该的值大了 8 个数量级,例如 304952680
vs -0.1271
。再次,我保存了笔记本,将其拉到我的笔记本电脑上,再次 运行,statsmodels
与 sklearn
线性回归结果相等。重新连接并在桌面上从头开始重新 运行 笔记本,同样,statsmodels
是正确的,但是 sklearn
LinearRegression
再次爆炸。我很困惑。有人有什么想法吗?
这是通过 nbviewer 链接的两个要点。它们很长,但比较一下,例如,单元格 59 和 62,变量 M12_CS_Months_Since_Last_Gift
。对于笔记本,statsmodels(单元格 59)与 sklearn(单元格 62)一致。对于桌面,他们不同意(请参阅桌面单元格 62 中该变量的放大图)。可能值得注意的一件事:数据的特点是预测变量 space 的大段对应于相同的观察值。也许这表明建议的接近共线性?我会检查奇异值。欢迎提出其他建议或跟进该建议。笔记本电脑是 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
我看了你的笔记本。看起来您的笔记本电脑和台式机型号在训练集上的表现几乎相同。这意味着这些大系数值在您的训练集上相互平衡。因此,笔记本电脑的结果并不完全错误,它只是违背了您可能想要附加的那种解释。它也有更大的过拟合风险(我没有看到你是否在测试集上给它打分,但你应该这样做)。基本上,如果您尝试将此拟合模型应用于违反训练集中观察到的共线性的示例,您将得到荒谬的预测。
为什么这发生在一台机器上而不是另一台机器上?基本上,几乎共线的预测变量集的系数在数值上是不稳定的,这意味着非常小的扰动会导致很大的差异。因此,用户通常看不到的基础数值库中的差异可能会导致系数发生显着变化。如果您从线性代数的角度考虑它,就会明白为什么会发生这种情况。如果两个预测变量完全共线,则它们的系数之和将是固定的,但只要另一个系数平衡,两个系数中的任何一个都可以无限制地增长。
有什么解决办法?如果这些变量之间始终存在真实、准确的依赖关系,则您可以忽略该问题。但是,我不会,因为你永远不知道。否则,要么手动删除相关列(这不会影响预测),使用自动变量选择或降维技术进行预处理,要么使用正则化回归方法(例如岭回归)。
注意:我的假设可能是错误的。最好通过奇异值来验证共线性。如果你这样做,请发表评论。
第二个注意:最小二乘求解器会自动将相关列归零。如果您查看 scipy.linalg.lstsq,您可以传递一个截止参数 (cond
) 以便将小的奇异值归零。此外,如您所见,某些求解器比其他求解器更稳定。你总是可以只使用更稳定的求解器。