使用scikit-learn拟合向量自回归模型

13
我正在尝试使用scikit-learn中包含的广义线性模型拟合方法来拟合向量自回归(VAR)模型。线性模型的形式为y = Xw,但系统矩阵X具有非常特殊的结构:它是块对角线,并且所有块都相同。为了优化性能和内存消耗,该模型可以表示为Y = BW,其中B是来自X的块,而Y和W现在是矩阵而不是向量。 类LinearRegression、Ridge、RidgeCV、Lasso和ElasticNet可以轻松接受后一种模型结构。然而,由于Y是二维的,拟合LassoCV或ElasticNetCV会失败。
我发现了https://github.com/scikit-learn/scikit-learn/issues/2402 从这个讨论中,我认为LassoCV/ElasticNetCV的行为是有意的。 除了手动实现交叉验证外,是否有一种优化alpha/rho参数的方法?
此外,scikit-learn中的贝叶斯回归技术也期望y是一维的。有没有什么解决方法?
注:我使用的是稳定版scikit-learn 0.14。

你为什么要使用回归模型来处理自回归过程?你的系统实际上是什么性质:Y_t=F(Y_{t-1})、Y_t=F(Y_{t-1}, X_t) 还是 Y_t=F(X_t)? - Andrey Shokhin
我忘了提到AR过程是带有加性噪声的线性过程。因此,我认为系统的性质应该是Y_t=F(Y_{t-1}, X_t),其中F()是一个线性函数,X_t是白噪声。 - MB-F
2
请查看以下链接:http://statsmodels.sourceforge.net/stable/generated/statsmodels.tsa.vector_ar.var_model.VAR.html#statsmodels.tsa.vector_ar.var_model.VAR - Andrey Shokhin
非常好的建议。Statsmodel具有满足日常VAR需求的所有功能。不幸的是,我不能使用它的原因有: (1)我想避免额外的依赖。 (2)我需要支持scikit-learn中提供的正则化和稀疏估计器。 - MB-F
2个回答

3
使用这种回归公式获得的性能和内存优化有多重要?鉴于您的改编导致scikit-learn出现错误,我不认为它是一种优化……我建议:
  1. 运行未经优化的版本并等待(如果可能)。
  2. 获取以下 代码,据说可以解决您的问题。在你发布的scikit-learn github项目对话中引用了它。请参阅此处以获取从git pull构建scikit-learn的说明。然后,将分支的scikit-learn位置添加到你的python路径中,并使用修改后的库代码执行回归。确保记录您的经验和任何遇到的问题;我相信scikit的开发人员会感激的。

我已经为你的答案授予了悬赏,因为它包含了很好的建议。然而,我还没有完全被你的答案说服。尝试运行未经优化的版本可能是值得一试的,但是从以前的 MATLAB 实现中,我预计在内存消耗(因子 100)和性能(秒 - > 分钟)方面会有很大的差异。我之前没有考虑过你的第二个建议,因为它们似乎独立地优化每个“任务”(即 W 中每一行有不同的alpha)。这是否确实是这种情况? - MB-F
这似乎是正确的。如果我理解您张贴的链接中的讨论,原始实施者认为Lasso和E-Net不适合多元回归问题。由于E-Net(以及作为E-Net子集的Lasso)对alpha的选择敏感,在多重回归中,一个组件任务可能会“占主导地位”,导致其他任务性能差。您能否提供有关问题维度和性质的更多背景信息?您最初的问题是VAR问题吗,还是VAR结构源于您的重新制定? - fredbaba
1
此外,如果这个讨论变得足够技术性,或许值得向交叉验证社区提问... - fredbaba
原始问题是将VAR模型拟合到时间序列数据(EEG源)中,以进行后续的连接分析。我正在编写一个库,因此需要在维度上具有灵活性。我的Ridge回归的自己实现已经足够好了,但我想支持sklearn作为模型拟合后端,以便用户可以使用不同的方法,而无需我重新实现。为每个“任务”使用不同的正则化参数感觉不对;原始问题没有用“任务”来表达,而是由一个描述多个信号交互的模型组成。 - MB-F


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接