矩阵恢复技术在时间序列缺失值填补中的应用

31 阅读7分钟

时间序列缺失值填补:矩阵恢复技术详解

时间序列中的缺失值处理并不简单。在我关于时间序列预测的书中,我讨论了从正确思考缺失值的方式到一些处理缺失数据的算法技术(如季节性插值)的多种方法。

矩阵恢复技术

矩阵恢复技术广泛应用于推荐系统中,用于完成用户-物品交互矩阵以便向用户推荐更好的物品。但这些技术在其他领域也有广泛应用,其中一个用途就是填补数据集中的缺失值。这种方法不是孤立地看待每个时间序列,而是依赖一组相关的时间序列来填补缺失数据。

核心思想是:我们假设存在一个低秩矩阵能够忠实地表示较大矩阵中的信息,并尝试找到该矩阵。

附加信息

矩阵的秩是其线性无关列向量或行向量的最大数量。从定义可知,它总是小于或等于矩阵中的列数(或行数)。如果矩阵中的任何列(或行)是任何其他列(或行)的线性组合,我们说该矩阵不是满秩的。

我们可以将其表述为一个学习问题,学习一个矩阵:

![矩阵公式]

其中λ是控制训练误差容忍度的正则化参数。但秩的最小化是难解的,因此我们有许多替代方法或启发式方法来解决这个优化问题。

矩阵分解

让我们使用推荐系统中的例子来理解这个概念(因为它更容易理解),然后将直觉扩展到时间序列。

推荐系统中的用户-物品矩阵是一个沿行排列用户、沿列排列物品(比如电影)的矩阵。在用户和物品的交集处,我们有用户对该物品的评分。如果我们有m个用户和n个物品,我们有一个m×n的交互矩阵R。我们假设每个用户和物品可以由一组k个属性表示,其中k远小于矩阵的原始大小。这是可能的,因为矩阵的列和行之间存在主导相关性。

现在让我们将注意力转向一组相关的时间序列。我们有一组n个时间序列,每个有m个时间步长,这给了我们一个大小为m×n的交互矩阵R。与用户-物品矩阵类似,这个矩阵也有主导相关性,即存在一组较小的模式可以描述该矩阵。

当我们对此类矩阵应用矩阵分解时,我们再次得到两个矩阵U和V,使得R ≈ U×V^T。矩阵U具有与时间方面相关的潜在因子,矩阵V具有特定于单个时间序列的潜在因子。

但我们如何获得这些矩阵?这就是梯度下降发挥作用的地方。我们可以使用观测值上的损失(L1、L2或任何其他回归损失)通过梯度下降来学习这些矩阵。一旦我们有了这些矩阵,我们就有了通过将两个矩阵相乘来恢复缺失数据的方法。

我们将使用Python库fancyimpute进行此练习。它实现了许多矩阵恢复技术,我们可以使用与scikit-learn类似的API。

from fancyimpute import MatrixFactorization
recovered_matrix_mf = MatrixFactorization(
    rank=50).fit_transform(all_ts_df.values)

矩阵的秩是一个超参数,我们需要通过良好的交叉验证设置来找到它。对于此练习,我们只是进行了简单的网格搜索,将人工创建的时间序列间隙作为测试集。

截断奇异值分解和迭代奇异值分解

计算分解矩阵的另一种方法是使用奇异值分解(SVD)。SVD是一种技术,通过它我们可以将任何实矩阵分解为奇异矩阵和奇异值。SVD可以表示为以下方程,其中R是原始矩阵,U是左奇异矩阵,V是右奇异矩阵,Σ是具有r个奇异值的对角矩阵。

![SVD公式]

Σ中的奇异值以最高值出现在对角线顶部的方式排列,并且随着我们沿对角线向下移动而减小。U和V的维度使得矩阵乘法可以恢复原始矩阵。

虽然这看起来很简单,但有一个问题。SVD不适用于不完整矩阵。因此,如果我们有缺失值,在进行SVD之前需要用某些东西填充。这有点违背目的,不是吗?一种方法是用零、均值或某种近似值填充,执行SVD,然后使用得到的矩阵恢复数据中的缺失值。但这会做的是将您用来填充缺失值的相同近似值作为结果返回。

这就是截断SVD的用武之地。截断SVD假设我们不需要所有奇异值来重建矩阵。相反,它选择k个最高奇异值,并仅使用这些来重建矩阵。当我们使用k个奇异值时,我们也将仅使用U和V的前k列来执行恢复原始矩阵R所需的矩阵乘法。

这使我们能够提取数据中的关键模式,并使用它来重建缺失数据。因此,在重建矩阵时,我们可以忽略用来填充初始矩阵的近似值,而支持数据中的主导模式。

迭代SVD是另一种启发式方法,试图克服SVD之前填充缺失值的初始值所产生的不准确性。在迭代SVD中,我们多次执行此截断SVD,每次迭代用估算值替换缺失值。我们首先用零、均值或其他近似值估算缺失值,并运行截断SVD以恢复缺失值。然后用新的缺失值替换我们之前的近似值,并再次运行截断SVD。这个过程一直持续,直到达到最大迭代次数或收敛标准。

软填补

软填补是另一种以SVD为核心的技术。2010年,Rahul Mazumder等人发表了一篇名为"Spectral Regularization Algorithms for Learning Large Incomplete Matrices"的论文。这是一种类似于迭代SVD的启发式方法,但不是每次迭代使用固定秩,而是使用阈值技术来选择要使用的重要奇异值。我们有一个称为shrinkage的参数,用于确定每次迭代中奇异值被"收缩"的程度。

fancyimpute实现了该算法,我们可以使用。关键超参数是shrinkage_value,而不是调整秩。

质心恢复

质心分解是SVD的近似。它计算质心值、加载向量、分别近似SVD的奇异值、右奇异矩阵和左奇异矩阵的相关向量。矩阵R的质心分解形式为R = L×C^T,其中L是m×n矩阵,C是n×n矩阵。但与截断SVD类似,在质心分解中,我们在重建原始矩阵时也将结果矩阵截断为k。

Khayati, M等人提出了一种可扩展的算法来计算质心分解,可用于矩阵恢复。我们在相关的Github存储库中的src/imputation/matrix_recovery.py中实现了此恢复技术。

关键参数再次类似于秩:truncation。它决定了在生成分解矩阵时我们强制实施的秩减少量。与往常一样,我们使用类似网格搜索的方法和强大的交叉验证设置来找到它。

参考文献

  1. Mazumder, Rahul & Hastie, Trevor & Tibshirani, Robert. (2010). Spectral Regularization Algorithms for Learning Large Incomplete Matrices. Journal of machine learning research : JMLR. 11. 2287-2322.
  2. Khayati, M., Cudré-Mauroux, P. & Böhlen, M.H. Scalable recovery of missing blocks in time series with high and low cross-correlations. Knowl Inf Syst 62, 2257–2280 (2020).