用 scikit-learn 拟合向量自回归模型
Posted
技术标签:
【中文标题】用 scikit-learn 拟合向量自回归模型【英文标题】:Vector autoregressive model fitting with scikit-learn 【发布时间】:2014-01-07 23:57:03 【问题描述】:我正在尝试使用 scikit-learn 中包含的广义线性模型拟合方法来拟合向量自回归 (VAR) 模型。线性模型有 y = X w 的形式,但系统矩阵 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)? 我忘了提到 AR 过程是线性的,带有加性噪声。所以我假设系统的性质是 Y_t=F(Y_t-1, X_t),其中 F() 是线性函数,X_t 是白噪声。 那么看看这个:statsmodels.sourceforge.net/stable/generated/… 非常好的建议。 Statsmodel 具有满足日常 VAR 需求的所有功能。不幸的是,我不能使用它是有原因的:(1)我想避免额外的依赖。 (2) 我需要支持 scikit-learn 中可用的正则化和稀疏估计器。 【参考方案1】:为了预测矩阵而不是向量,Lasso 和 ElasticNet 与它们的 MultiTask* 对应:
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.MultiTaskLasso.html http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.MultiTaskElasticNet.html
【讨论】:
【参考方案2】:使用这种回归公式获得的性能和内存优化有多重要?鉴于您的重新表述破坏了 scikit-learn,我不会真正称其为优化......我建议:
运行未优化的版本并等待(如果可能)。
Git pull 以下code,据说可以解决你的问题。它在您从 scikit-learn github 项目发布的对话中被引用。有关从 git pull 构建 scikit-learn 的说明,请参阅 here。然后,您可以将分支的 scikit-learn 位置添加到您的 python 路径并使用修改后的库代码执行回归。请务必发布您的经验和遇到的任何问题;我相信 scikit 开发人员会很感激的。
【讨论】:
我已经为您的回答授予了赏金,因为它包含了很好的建议。但是,我还不完全相信接受你的回答。运行未优化的版本值得一试,但从以前的 matlab 实现来看,我预计内存消耗(因子 100)和性能(秒 -> 分钟)会有巨大差异。我之前没有考虑过您的第二个建议,因为它们似乎独立优化了每个“任务”(即 W 中每一行的不同 alpha)。真的是这样吗? 好像是这样。如果我从您发布的链接中理解讨论,那么原始实施者认为 Lasso 和 E-Net 不适合多重回归问题。因为 E-Net(以及作为 E-Net 子集的 Lasso)对 alpha 的选择很敏感,所以在多元回归中,一个组件任务可能会“主导”回归,从而导致其他任务的性能不佳。您能否就问题的维度和性质提供更多背景信息?您最初的问题是 VAR 问题,还是 VAR 结构源自您的重新表述? 另外,如果这个讨论足够技术性,可能值得通过Cross Validated向社区提问... 最初的问题是将 VAR 模型拟合到时间序列数据(EEG 源)以进行后续连接分析。我正在编写一个库,所以我需要在维度上保持灵活。我自己的岭回归实现运行良好,但我想支持 sklearn 作为模型拟合后端,以便用户可以使用不同的方法,而无需我重新实现***。对每个“任务”使用不同的正则化参数感觉不对;最初的问题不是用“任务”来表达,而是由一个描述多个信号交互的模型组成。以上是关于用 scikit-learn 拟合向量自回归模型的主要内容,如果未能解决你的问题,请参考以下文章
[机器学习与scikit-learn-30]:算法-回归-普通线性模型拟合非线性分布数据-遇到的问题
[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例