时间序列分类 - 结果很差

机器算法验证 时间序列 分类
2022-03-12 00:06:46

我正在研究一个时间序列分类问题,其中输入是手机帐户前 21 天的时间序列语音使用数据(以秒为单位)。相应的目标变量是该帐户是否在 35-45 天范围内取消。所以这是一个二分类问题。

到目前为止,我尝试过的所有方法(在不同程度上)都得到了非常糟糕的结果。首先,我尝试了 k-NN 分类(进行了各种修改),结果非常糟糕。这导致我从时间序列中提取特征 - 即均值、方差、最大值、最小值、总零天、总尾随零天、上半年平均值和下半年平均值之间的差异等,并且最具预测性的特征似乎是全部零天和总尾随零天(使用几种分类算法)。这表现最好,但表现仍然不是很好。

我的下一个策略是对训练集中的负样本进行过采样,因为它们太少了。这导致了更正确的取消预测,但代价是更多的误报。

我开始认为时间序列使用数据本身可能根本不是很有预测性(尽管常识说它应该是)。也许有一些我没有考虑的潜在变量。查看数据还显示了一些奇怪的行为。即一些例子显示很少或减少使用(或有时根本没有)并且不取消,有些显示使用量增加确实取消。也许这种矛盾的行为不会为分类器生成非常清晰的决策边界。

另一个可能的错误来源是许多训练示例非常稀疏(即很多天使用 0)。我还没有尝试过的一个想法是将时间序列分成多个片段并以这种方式生成一些特征,但我并不抱太大希望。

3个回答

我在应用带有动态时间扭曲的 KNN 作为距离度量方面取得了相当大的成功。

我的研究(pdf)表明这种方法很难被击败。下面的示意图来自我在github上的 KNN 和 DTW 的 python 实现。或在IPython Notebook中查看

KNN 和 DTW

如果你训练的数据集非常大,我建议对距离矩阵进行层次聚类。然后从所需的集群中采样以生成较小的训练数据集。hclust将确保您拥有代表数据中广泛的时间序列特征的时间序列。

时间序列分类的两种方法

如何处理分类任务的时间结构化输入有两种方法:

  1. 专用时间序列模型:机器学习算法直接包含时间序列。我将 KNN 与 DTW 模型计入此类别。
  2. 基于特征的方法:在这里,时间序列被映射到另一个可能更低维的表示。这意味着特征提取算法计算特征,例如时间序列的平均值或最大值。然后将这些特征作为特征矩阵传递给“正常”机器学习,例如神经网络、随机森林或支持向量机。这种方法的优点是可以更好地解释结果。此外,它使我们能够使用完善的监督机器学习理论。

过去,我也成功地使用 DTW 成功部署了 KNN。但是,我几乎总是能够通过使用精心设计的功能的模型来超越它的准确性。此外,用于二进制分类的 KNN 与 DTW 的比例为 O(n_t · m_{train} · m_{test}),其中 n_t 是时间序列的长度,mtrain 和 mtest 分别是训练和测试集中的设备数量. 这意味着计算需要很长时间..

因此,我建议采用基于特征的方法。

tsfresh 计算大量特征

python 包tsfresh从包含时间序列的 pandas.DataFrame 计算大量此类特征。您可以在http://tsfresh.readthedocs.io找到它的文档

在此处输入图像描述

您可以尝试使用它来计算大量特征。稍后,您可以过滤特征的重要性并确定有希望的候选者。

免责声明:我是 tsfresh 的作者之一。

在时间序列问题中,当预测现象在时间上与训练数据相距很远时,性能通常会迅速下降。我在这篇文章中描述了一个相关问题:为什么当测试集远离火车时性能下降如此之快?

这通常是合乎逻辑的:在此处描述的问题中,我们尝试预测人类行为(取消手机帐户的决定)。这样的决定很可能受到一些最近发生的事件的影响(例如恼人的技术问题,或令人沮丧的求助热线电话),而不是时间更远的事件。我的假设:第 35-45 天取消的主要原因可能是第 31 天收到第一张发票。

因果事件(例如收到发票时的挫败感)和目标行动(取消)之间可能存在几天的差距。这个以用户挫败感增加为特征的短时期确实可以反映在行为变化中(第 31 天到第 35 天之间),并且可以通过分类器检测到。但由于训练集仅包含截至第 21 天的数据,它错过了那些最重要的信号。换句话说,火车与目标变量没有因果关系。

解决方案:获取直接在目标动作之前的训练数据。然后尝试提前1-2天预测目标动作。提前 15 天预测相同的可能性很小。

出于这个原因,文献建议每次在预测之前,在最新数据上重新训练时间序列模型。在这种特殊情况下,这意味着我们需要取消事件前几天的通话数据。这是一篇关于此的文章:ML时间序列预测正确的方法