> For the complete documentation index, see [llms.txt](https://skywateryang.gitbook.io/timeseriesanalysis101/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://skywateryang.gitbook.io/timeseriesanalysis101/8.-mo-xing-ping-gu-he-xing-neng-kao-lv/8.2-ji-suan-xiao-lv-de-kao-lv.md).

# 8.2 计算效率的考虑

在时间序列模型的评估中，准确率总是第一的考虑因素，但有时关于计算效率的考虑也十分重要，尤其是当面对超大数据集或广泛部署应用的时候。

当我们给模型喂入时间序列训练数据集时，一个常见的操作是将原始数据预处理为滑动窗口的数据，例如你的窗口长度是3，这会将你的训练样本扩大3倍。因此如果你遇到了训练时的计算效率问题，可以考虑不要使用重复数据。

以实际数据为例，一个时间序列数据集是\[1,2,3,4,5,6,7,8,9,10]。

在不考虑计算效率的情况下，我们通常会这样构建训练样本。

| 输入       | 输出  |
| -------- | --- |
| \[1,2,3] | 4   |
| \[2,3,4] | 5   |
| \[3,4,5] | 6   |
| ...      | ... |

如果计算资源有限制，可以尝试这样的样本构建方式。

| 输入       | 输出  |
| -------- | --- |
| \[1,2,3] | 4   |
| \[4,5,6] | 7   |
| \[7,8,9] | 10  |
| ...      | ... |

第二个可用的编码上的方法是使用生成器构建训练样本而不是使用列表显式构建，这使得能够在有限的内存中训练更多的样本数据。

另一个常用的解决资源限制的方式是预计算，这对于时间序列数据是很常用的，因为时间序列数据是有序的，这使得很多时候我们无法使用并行计算的方式来提高计算效率，因此可以使用预计算解决这一问题，尤其是当你的应用是高度时间敏感的，如医疗预测，车辆位置估计等，当得到最新数据以后再计算可能会有较高的时间延迟。

例如你正在使用一个循环神经网络，它接受多个信息通道，经过 100 步时间步长训练，你可以预先计算前 99 个时间步，然后当最后一个数据点终于进来时，你只需要做最后一组矩阵乘法（和其他激活函数计算）而不是 100。理论上这可以加快你的响应时间 100 倍。

对于时间序列数据的储存也有一些技巧，当数据本身很大时，更推荐存储为二进制格式而不是通常的csv格式。因为二进制数据已经是序列化后的数据，在程度读取时仅需要更好的IO，使得读数据更快速，并且二级制格式经过压缩后占据空间更小，可以在内存中运行更多数据。

出于应用的角度，对于时间序列数据的分析有两个需要经常思考的权衡点。

* 使用全部数据并不总是更好的
* 更复杂的模型并不总是更好的

诚然，在不考虑效率的时候，使用更复杂的模型在全部数据上训练总是可行的，但是在很多时候这是完全没有必要的，这会导致大量资源的浪费，这就需要我们根据行业经验和数据经验在效果和效率上做权衡，选择合适的折中点。

对第一点再介绍几种常用的选择部分数据的方法，

* 下采样：可以选择>1的时间间隔构建训练输入，例如选择第一，第三，第五，第七个时间点（共4个值）的值作为输入，而不是选择从第一到第七个时间点（共7个值）的值作为输入
* 只在最新的数据上训练
* 减少时间窗口的长度
