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



我发现这个真的很头疼。我有一个python 2笔记本,我用它来在笔记本电脑和台式机上进行线性回归。在笔记本电脑上,sklearn给出的结果与统计模型相同。但是,在桌面上,statsmodels给出了正确的结果,但sklearn给出了错误的结果。许多系数估计值刚刚比应有的系数大了 8 个数量级,例如,304952680 vs -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位,相同的统计模型/sklearn模块版本。笔记本:http://nbviewer.jupyter.org/gist/andersrmr/fb7378f3659b8dd48625桌面:http://nbviewer.jupyter.org/gist/andersrmr/76e219ad14ea9cb92d9e

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新