我发现这是一个真正的伤脑筋。我有一个python 2笔记本,我用它在笔记本电脑和台式机上做线性回归。在膝上型计算机上,sklearn给出的结果与状态模型相同。然而,在桌面上,statsmodels给出了正确的结果,但是sklearn给出了错误的结果。一些系数估计值比它们应该的要大8个数量级,例如,304952680对-0.1271。再次,我保存笔记本,把它放在我的笔记本电脑上,再运行它,statsmodels和sklearn线性回归结果是相等的。在桌面上重新连接并重新运行笔记本,statsmodels也是正确的,但是sklearn LinearRegression再次崩溃。我很困惑。有人有什么想法吗?
以下是通过nbviewer链接的这两位专家。它们很长,但是比较,例如,59号和62号细胞,可变的M12_CS_Months_Since_Last_Gift。对于该笔记本,状态模型(单元格59)与滑雪板(单元格62)一致。对于桌面,他们不同意(请参阅桌面单元格62中的变量爆破)。值得注意的一点是:数据的特征是预测空间的大段对应于相同的观测值。也许这就像建议的那样接近共线性?我会检查奇异值。欢迎就该建议提出更多建议或采取后续行动。膝上型计算机是64位windows 8.1/statsmodel v.0.6.1/sklearn 0.17。桌面是windows 10 64位,相同的状态模型/滑雪板模块版本。笔记本电脑:http://nbviewer.jupyter.org/gist/andersrmr/fb7378f3659b8dd48625桌面:http://nbviewer.jupyter.org/gist/andersrmr/76e219ad14ea9cb92d9e
发布于 2016-02-25 23:11:30
我看了你的笔记本。看起来,您的笔记本电脑和台式机在培训集上的性能几乎是相同的。这意味着这些大系数值在您的培训集上相互平衡。所以,笔记本电脑的结果并不是完全错误的,它只是无视你想要附加到它上面的那种解释。它也有更大的风险是过度健康(我没有看到你是否在测试集得分,但你应该)。基本上,如果你试图把这个拟合的模型应用到一个违反训练集观察到的colinearity的例子上,你就会得到荒谬的预测。
为什么这种情况发生在一台机器上而不是另一台机器上?基本上,近似共线性预测集上的系数在数值上是不稳定的,这意味着很小的扰动会导致很大的差异。因此,用户通常看不到的底层数字库的差异会导致系数的显著变化。如果你从线性代数的角度来考虑它,你就会明白为什么会发生这种情况。如果两个预测因子完全是共线性的,则它们的系数之和是固定的,但只要其他系数平衡,这两个系数中的任何一个都可以不受约束地增长。
解决办法是什么?如果这些变量之间存在着真实的、确切的依赖关系,那么您可能会忽略这个问题。但是我不会因为你永远都不知道。否则,要么手动删除相关列(这不会影响预测),要么使用自动变量选择或降维技术进行预处理,要么使用正则化回归方法(如岭回归)。
注:可能我在这里的假设是错误的。用奇异值来验证结界性是很好的。如果你这样做,请评论。
第二个注意事项:这里有最小二乘的求解器,它将自动地将依赖列为零。如果您查看scipy.linalg.lstsq,您可以传递一个截止参数(cond),以使小的奇异值为零。另外,正如你所看到的,有些求解者比其他人更稳定。你总是可以使用更稳定的解算器。
https://stackoverflow.com/questions/35565895
复制相似问题