时间序列数据在用机器学习算法建模之前,通常需要进行一些准备。
例如,差分运算可以用来去除序列中的趋势和季节性结构,以简化预测问题。某些算法,如神经网络,更倾向于在建模前对数据进行标准化和/或归一化。
应用于序列的任何转换操作也需要类似的逆转换应用于预测。这是必需的,以便计算出的性能度量与输出变量的尺度相同,并且可以与经典的预测方法进行比较。
在本文中,您将学习如何在机器学习中对时间序列数据执行和逆转四种常见的数据转换。
阅读本文后,你将了解:
- 如何在 Python 中转换和逆转换四种方法。
- 在转换训练集和测试集时需要注意的事项。
- 当数据集需要多个操作时,建议的转换顺序。
立即启动您的项目,阅读我的新书 《时间序列预测深度学习》,其中包括分步教程和所有示例的Python源代码文件。
让我们开始吧。

用于时间序列预测的 4 种常见机器学习数据转换
照片作者:Wolfgang Staudt,保留部分权利。
概述
本教程分为三个部分;它们是:
- 时间序列数据转换
- 模型评估注意事项
- 数据转换顺序
时间序列数据转换
给定一个单变量时间序列数据集,在使用机器学习方法进行建模和预测时,有四种流行的转换方法。
它们是
- 幂转换
- 差分转换
- 标准化
- 归一化
让我们依次快速查看每种方法以及如何在 Python 中执行这些转换。
我们还将回顾如何反转转换操作,因为当我们要以原始尺度评估预测以便直接比较性能度量时,这需要这样做。
您还喜欢在机器学习建模中使用哪些其他时间序列数据转换方法吗?
在下面的评论中告诉我。
时间序列深度学习需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
幂转换
幂转换可去除数据分布的偏移,使分布更接近正态(高斯)。
在时间序列数据集上,这可以有效地去除随时间变化的方差。
流行的例子包括对数转换(仅限正值)或广义版本,如 Box-Cox 转换(仅限正值)或 Yeo-Johnson 转换(正值和负值均可)。
例如,我们可以使用 SciPy 库中的 boxcox() 函数在 Python 中实现 Box-Cox 转换。
默认情况下,该方法将对转换的 lambda 值进行数值优化,并返回最优值。
1 2 3 4 5 |
from scipy.stats import boxcox # 定义数据 数据 = ... # box-cox 转换 result, lmbda = boxcox(data) |
该转换可以被逆转,但需要下面列出的一个名为 *invert_boxcox()* 的自定义函数,该函数接受一个转换后的值以及用于执行转换的 lambda 值。
1 2 3 4 5 6 7 8 9 |
from math import log from math import exp # 逆转单值的 boxcox 转换 def invert_boxcox(value, lam): # log case if lam == 0: return exp(value) # all other cases return exp(log(lam * value + 1) / lam) |
将幂转换应用于数据集并反转转换的完整示例列在下面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 幂转换和反转示例 from math import log from math import exp from scipy.stats import boxcox # 逆转单值的 boxcox 转换 def invert_boxcox(value, lam): # log case if lam == 0: return exp(value) # all other cases return exp(log(lam * value + 1) / lam) # 定义数据集 data = [x for x in range(1, 10)] print(data) # 幂转换 transformed, lmbda = boxcox(data) print(transformed, lmbda) # 逆转换 inverted = [invert_boxcox(x, lmbda) for x in transformed] print(inverted) |
运行示例将打印原始数据集、幂转换结果以及反转转换后接近原始值的结果。
1 2 3 4 |
[1, 2, 3, 4, 5, 6, 7, 8, 9] [0. 0.89887536 1.67448353 2.37952145 3.03633818 3.65711928 4.2494518 4.81847233 5.36786648] 0.7200338588580095 [1.0, 2.0, 2.9999999999999996, 3.999999999999999, 5.000000000000001, 6.000000000000001, 6.999999999999999, 7.999999999999998, 8.999999999999998] |
差分转换
差分转换是去除时间序列系统性结构的一种简单方法。
例如,可以通过从序列中的每个值中减去前一个值来去除趋势。这称为一阶差分。该过程可以重复(例如,对差分序列进行差分)以去除二阶趋势,依此类推。
可以通过类似的方式通过减去前一个季节的观测值(例如,对于具有年度季节性结构的数据,提前 12 个时间步)来去除季节性结构。
可以通过下面列出的名为 *difference()* 的自定义函数计算序列中的单个差分值。该函数接受时间序列和差分计算的间隔,例如,1 用于趋势差分,12 用于季节性差分。
1 2 3 |
# 差异数据集 def difference(data, interval): return [data[i] - data[i - interval] for i in range(interval, len(data))] |
同样,此操作可以通过一个自定义函数进行逆转,该函数将原始值加回差分值,名为 *invert_difference()*,它接受原始序列和间隔。
1 2 3 |
# 逆差分 def invert_difference(orig_data, diff_data, interval): return [diff_data[i-interval] + orig_data[i-interval] for i in range(interval, len(orig_data))] |
我们可以下面演示此函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 差分转换示例 # 差异数据集 def difference(data, interval): return [data[i] - data[i - interval] for i in range(interval, len(data))] # 逆差分 def invert_difference(orig_data, diff_data, interval): return [diff_data[i-interval] + orig_data[i-interval] for i in range(interval, len(orig_data))] # 定义数据集 data = [x for x in range(1, 10)] print(data) # 差分转换 transformed = difference(data, 1) print(transformed) # 逆差分 inverted = invert_difference(data, transformed, 1) print(inverted) |
运行示例将打印原始数据集、差分转换结果以及反转转换后的原始值。
注意,转换后的序列将丢失前“interval”个值。这是因为它们在“interval”时间步之前没有值,因此无法进行差分。
1 2 3 |
[1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 1, 1, 1, 1, 1, 1, 1] [2, 3, 4, 5, 6, 7, 8, 9] |
标准化
标准化是一种针对高斯分布数据的转换。
它减去均值并将结果除以数据样本的标准差。这会将数据转换为均值为零(居中),标准差为 1。由此产生的分布称为标准高斯分布,或标准正态分布,因此得名。
我们可以使用 scikit-learn 库中的 StandardScaler 对象在 Python 中执行标准化。
此类允许通过调用 *fit()* 在训练数据集上拟合转换,通过调用 *transform()* 将其应用于一个或多个数据集(例如训练集和测试集),并提供一个函数通过调用 *inverse_transform()* 来反转转换。
下面的示例将应用一个完整的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 标准化示例 from sklearn.preprocessing import StandardScaler from numpy import array # 定义数据集 data = [x for x in range(1, 10)] data = array(data).reshape(len(data), 1) print(data) # 拟合转换 transformer = StandardScaler() transformer.fit(data) # 差分转换 transformed = transformer.transform(data) print(transformed) # 逆差分 inverted = transformer.inverse_transform(transformed) print(inverted) |
运行示例将打印原始数据集、标准化转换结果以及反转转换后的原始值。
注意,数据应以多行一列的形式提供。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[[1] [2] [3] [4] [5] [6] [7] [8] [9]] [[-1.54919334] [-1.161895 [-0.77459667] [-0.38729833] [ 0. [ 0.38729833] [ 0.77459667] [ 1.161895 [ 1.54919334]] [[1.] [2.] [3.] [4.] [5.] [6.] [7.] [8.] [9.]] |
归一化
归一化是将数据从原始范围重新缩放到 0 到 1 之间的新范围。
与标准化一样,可以使用 scikit-learn 库中的转换对象来实现,特别是 MinMaxScaler 类。除了归一化之外,此类还可以通过在对象构造函数中指定首选范围来将数据重新缩放到您想要的任何范围。
它可以以相同的方式用于拟合、转换和逆转换。
完整的示例列在下面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 归一化示例 从 sklearn.预处理 导入 MinMaxScaler from numpy import array # 定义数据集 data = [x for x in range(1, 10)] data = array(data).reshape(len(data), 1) print(data) # 拟合转换 transformer = MinMaxScaler() transformer.fit(data) # 差分转换 transformed = transformer.transform(data) print(transformed) # 逆差分 inverted = transformer.inverse_transform(transformed) print(inverted) |
运行示例将打印原始数据集、归一化转换结果以及反转转换后的原始值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[[1] [2] [3] [4] [5] [6] [7] [8] [9]] [[0. [0.125] [0.25 ] [0.375] [0.5 [0.625] [0.75 ] [0.875] [1. ] [[1.] [2.] [3.] [4.] [5.] [6.] [7.] [8.] [9.]] |
模型评估注意事项
我们已经提到了在模型的预测上反转转换的重要性,以便计算出与其他方法直接可比的模型性能统计量。
此外,另一个令人担忧的问题是数据泄露。
上述三种数据转换会从提供的 数据集中估计系数,然后用于转换数据。特别是
- 幂转换:lambda 参数。
- 标准化:均值和标准差统计量。
- 归一化:最小值和最大值。
这些系数必须仅在训练数据集上估计。
一旦估计完成,就可以在评估模型之前,使用系数将转换应用于训练集和测试集。
如果在将数据集分割为训练集和测试集之前使用整个数据集来估计系数,那么就会存在少量信息从测试集泄露到训练集的情况。这可能导致模型技能的估计值偏高。
因此,您可能需要通过领域知识来增强系数的估计,例如对未来所有时间段的预期最小/最大值。
通常,差分不会出现相同的问题。在大多数情况下,例如一步预测,滞后观测值可用于执行差分计算。如果不是,则可以使用滞后预测作为真实观测值的代理来进行差分计算。
数据转换顺序
您可能希望尝试在建模前对时间序列应用多种数据转换。
这很常见,例如应用幂转换以去除增加的方差,应用季节性差分以去除季节性,以及应用一步差分以去除趋势。
转换操作的顺序很重要。
直观地说,我们可以思考转换如何相互作用。
- 幂转换可能应该在差分之前执行。
- 季节性差分应该在一步差分之前执行。
- 标准化是线性的,应该在任何非线性转换和差分之后应用于样本。
- 归一化是线性操作,但为了保持首选尺度,它应该是最后执行的转换。
因此,建议的数据转换顺序如下:
- 幂转换。
- 季节性差分。
- 趋势差分。
- 标准化。
- 归一化。
显然,您只会使用特定数据集所需的转换。
重要的是,当转换操作被逆转时,逆转换操作的顺序必须相反。具体来说,逆操作必须按以下顺序执行:
- 归一化。
- 标准化。
- 趋势差分。
- 季节性差分。
- 幂转换。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
文章
- 如何在 Python 中使用幂变换进行时间序列预测数据
- 如何使用 Python 中的差分变换去除趋势和季节性
- 如何使用 Python 差分时间序列数据集
- 如何在 Python 中对时间序列数据进行归一化和标准化
API
- scipy.stats.boxcox API
- sklearn.preprocessing.MinMaxScaler API
- sklearn.preprocessing.StandardScaler API
文章
总结
在本文中,您学习了如何在机器学习中对时间序列数据执行和逆转四种常见的数据转换。
具体来说,你学到了:
- 如何在 Python 中转换和逆转换四种方法。
- 在转换训练集和测试集时需要注意的事项。
- 当数据集需要多个操作时,建议的转换顺序。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
非常感谢。我想知道如何使用 Yeo-Johnson 转换,因为我的数据包含负值。
抱歉,目前我还没有实际示例。
如果我通过信号处理将自己的数据集分成 6 部分,每个部分都使用归一化。如何确保尺度?
也许只在训练数据上准备任何数据缩放。
如果我有来自训练集和测试集之外的新数据,如何将新数据作为模型的输入?
在将新数据用作预测输入之前,以与训练数据相同的方式准备新数据。
如何找到我的回复?关闭浏览器后,我在网站上找不到我的回复。
使用您已经用于预处理训练集数据的相同方法和系数
尊敬的先生,
先生,我使用了 2014-2019 年的数据集来训练 ML 时间序列模型。我可以使用该模型预测新数据集吗?
谢谢您。
当然可以。
请问您能给我发一些关于 R 的教程吗?
谢谢。
抱歉,我没有 R 中的时间序列预测教程。
这里有 Python 示例
https://machinelearning.org.cn/start-here/#timeseries
好的,谢谢。
我对于 PT 和标准缩放感到非常困惑。幂转换将(或至少应该)产生与标准缩放相同的结果,因为它们的主要目标都是使数据遵循高斯分布。
进行 PT -> 标准化的目的是什么?它们似乎本质上是相同的。
Jason,
我明白了。谢谢。
不客气。
并非完全如此,幂转换会改变高斯分布的形状,而标准化只会强制数据遵循标准高斯分布——它仍然可能偏斜。
嗨,Jason,
趋势差分是否会使 LSTM 的结果变差
我在一种情况下进行差分然后标准化数据,在另一种情况下仅标准化。
https://imgur.com/a/fRSlWNM
谢谢!
山姆
这可能会有帮助,也可能没有。尝试对有和没有差分进行建模,并比较结果。
嗨,Jason,
我对 invert_difference 感到困惑。
我们应用 difference(data, interval),其中 data=TRAINING SET。拟合后,我们得到了一个“差分”形式的模型。因此,我们需要将它们转换为训练、验证和测试集(由模型计算)的原始数据,以便与观测数据进行比较。我们可以使用
invert_difference(orig_data, diff_data, interval),其中
diff_data 可用,但我们没有所有三个集合的 orig_data!事实上,我们逆转差分来计算原始数据!
你能解释一下吗?谢谢
是的,可以通过从训练数据传播到测试数据来逆转预测中的差分,例如,训练集中的最后一个实际观测值将有助于逆转第一个预测观测值。
您有这方面的示例吗,Jason?
是的,上面的教程就是这样做的。
你好 Jason,
关于标准化,如果我们有 X_train、y_train、X_test、y_test
1) 如果问题是时间序列预测,并且我们在拟合之前对 X_train 和 X_test 进行了标准化,那么在预测之前(在 model.fit() 之后,在 model.predict() 之前),我们是否需要对训练数据再次进行反标准化?或者我们应该仅对预测值进行反标准化?
2) 我们是否应该考虑标准化 y_train 和 y_test?或者这毫无意义?我一直在网上阅读一些代码,发现两者都有。
您的反馈将不胜感激!提前谢谢。
在估计模型性能之前,应该对预测值进行反向缩放。
我们不需要输入,并且反向缩放或不反向缩放它们对模型技能没有影响。
如果您不确定是否执行转换,则评估带转换和不带转换的模型,并比较其技能。
嗨,Jason,
我该如何对预测值进行反向缩放,然后再计算训练误差?
上面的教程已经展示了。
所以,我在训练集上使用缩放后的数据拟合我的模型,使用缩放后的训练数据计算训练集上的预测值,反向缩放训练预测值,然后使用实际训练数据集的逆值和预测训练数据集的逆值来获得训练 MSE。
这是正确的吗?
听起来不错,我想!
非常感谢,Jason。
我正在使用 Python 进行多步时间序列预测的多变量数据。
我是否可以遵循与单变量相同的方法?还是使用其他方法?
谢谢。
也许可以尝试并比较一下?
如果变量之间存在依赖性,那么将它们一起建模将导致更好的性能。
谢谢你的回复
我在这段代码中发现了一个错误(我的数据有 5 个变量)
series = Series.from_csv(‘sample_hourly_data.csv’, header=0)
dataframe = DataFrame(series.values)
dataframe.columns = [‘P2P’, ‘IM’, ‘VoIP’, ‘Streaming’, ‘SNS’]
x = sqrt(dataframe.columns)
ValueError: Length mismatch: Expected axis has 1 elements, new values have 5 elements
错误表明您的示例中的数据和列不匹配。
Jason,您对时间序列分类的数据准备有什么建议吗?谢谢。
是的,我写了几篇关于这个主题的文章。也许可以比较缩放输入和不缩放输入、使输入平稳和不使输入平稳的结果。
谢谢你的建议,Jason。
你好,我的时间序列既有负值也有零值,预处理该怎么办?
我还有一些看起来像异常值的值,是否有办法用其他值替换它们,比如用邻近值之间的平均值?
也许可以尝试一系列不同的数据预处理方法。
标准化、归一化、幂变换是一个很好的开始,同时也可以使序列平稳。
尝试移除候选异常值,看看是否能提高模型性能。
嗨,Jason,
要遵循的步骤 –
幂转换。
季节性差分。
趋势差分。
标准化。
归一化。
1) 我的问题是,我们需要为所有上述步骤创建单独的变量(例如,第一列的幂变换、第二列的季节性差分,依此类推),还是所有步骤都需要用于创建单个变量?然后我们可以从中创建一个滞后变量?
2) 我们是否也需要对 Y 变量执行上述步骤?
不,它们都应用于相同的数据。
是的,这些步骤将根据需要应用于每个变量。
嗨,Jason,
我还是不太清楚上面的答案。
“它们都应用于相同的数据”所以基本上你的意思是,我需要创建一个变量,并且只在该变量上执行所有转换——例如(幂变换、季节性差分、趋势差分、标准化、归一化)?
然后转换后的变量将用作 Y,我们将通过创建该 Y 变量的滞后变量来创建 X 变量?
是的。
你好 Jason,
我们需要转换 Y 变量,然后使用 Y 变量的滞后形式作为 X 变量吗?
是的。
你好,我有一个问题,关于之后使用反向变换对数据进行缩放。
当我们训练和测试 LSTM 模型时,我们会得到预测结果,但我们得到的结果不是真实值,而是缩放后的值。那么如何才能将真实值恢复回来,以便将预测结果与真实数据进行比较?
非常感谢!
您必须对测试集和预测值进行反向缩放,然后计算误差——如上所述。
嗨,Jason,
我正在为训练和测试数据构建带有窗口的 LSTM 模型,但在使用 MinMaxScalar 方法进行预测时未能获得良好的预测。我找到的方法是,通过将窗口中的每个值除以第一个值来归一化每个窗口/段,因此在这种情况下,最后一个值的预测将是相对于窗口初始值的相对变化。但是,我不太确定如何最终反归一化我的数据。
有什么建议吗?
反向执行您用于归一化数据的过程。
如果您不确定,也许可以尝试在 Python 或 Excel 中使用独立的示例进行操作,直到您理解前向和后向过程。
很棒的教程!
Jason,您能否向我解释一下,我们是否可以像本教程一样将时间序列数据转换为小波变换?
也许可以,我没有例子,抱歉。
Hi Kasmiri,您成功转换了吗?
你好 Jason,我有一个数据集,其中包含城市中车辆的位置,以每个时间间隔采样。所以这个时间序列没有特殊的模式,也不是高斯的,也没有季节性。我是否可以使用仅归一化来重新缩放我的值?
您有什么建议?
提前感谢
也许可以尝试缩放输入,并将其与在原始数据上拟合的模型进行比较。
感谢 Jason 将这些不同的变换整合到一个教程中。这非常有帮助,尤其是它们的顺序。
您是否在您的网站上讨论过这些方法可以与哪些方法一起使用以及为什么?仅仅是平稳性吗?还是为了最大化信噪比,在这种情况下,我们可以将任何方法都包装在变换-反变换中?如果我问得很蠢,错过了非常明显的一点,请原谅。
本质上,我们是否是为了让算法能够处理或偏好高斯分布,从而将训练数据转换为更接近高斯分布(以一种可以系统性反向的方式)?然后,为需要这些算法和方法的算法和方法将该高斯分布进行标准化和归一化?
是的,当然。
很好的问题。
我建议采用将变换或变换序列作为处理方法,测试每种方法,并找出哪种方法能产生有技能的模型。
我们没有关于何时使用何种模型/表示的良好理论,而且通常当算法的期望被忽略或违反时,就会取得良好/最佳的结果。
谢谢 Jason。所以,与其只通过可能非常多的变换排列手动探索问题情况(可能还有可视化),不如也值得尝试一些类似的方法,比如:
变换的排列(这可能是一个非常大的数字)
您想尝试的预测方法
拟合模型
然后比较所有这些的准确性?
您说的“处理”是什么意思?
是的。处理是通过准备数据来尝试最好地揭示问题未知的潜在结构给学习算法的不同方法。
关于将模型拟合包装在处理的盒子中,除了所有可能的变换组合之外,我意识到像差分或取对数这样的变换可以多次进行。顺序也很重要吗?也就是说,我们实际上关心的是所有的排列,而不是所有的组合?抱歉,我今天脑子有点糊涂。
是的,我认为顺序很重要,并且我在教程中建议了一个顺序。
我认为不需要多种处理方式。
感谢所有的回答,Jason。希望您不介意问题仍然不断出现。作为关于顺序是否重要的问题的独立问题,我也意识到自动化这些处理是一个多么艰巨的任务,特别是如果我们包含更多更广泛的变换。您知道是否有常见的/标准的算法来搜索这个变换排列空间吗?
网格搜索是一个不错的开始,贝叶斯优化很常见,随机搜索也是。如果您有大量的选项,那么遗传算法/基因组计划甚至简单的爬山法都无法比拟。
这些变换对于深度学习来说比对于其他机器学习方法(如回归和其他统计建模方法)更有用吗?
也许吧。现代神经网络相当健壮。
试试看。
对于神经网络,变换是否会剥离它们可以用来学习某些复杂性的数据,也就是说,变换甚至可能在它们的情况下是不受欢迎的?
也许吧,但几乎可以肯定不是。
你好 Jon 和 Jason,我正在查看所有评论,寻找和 Jon 的问题完全一样的东西,因为我的股票市场预测结果在回归模型和树模型上通过滞后 1 差分提高了 15-20%,但在简单的神经网络(MLP)上却大幅下降。到目前为止,我还没有尝试 RNN 或组合方法,但到目前为止,看起来神经网络不喜欢差分,并且更喜欢缩放,对于这个问题尤其如此。我一定会围绕一个健壮的“处理箱”系统来构建我的研究,并为不同的模型尝试它们的不同排列。
谢谢你们两位,
此致
很高兴听到这个。
另外,我认为股票无法以经济有效的方式进行预测。
https://machinelearning.org.cn/faq/single-faq/can-you-help-me-with-machine-learning-for-finance-or-the-stock-market
同意您的观点,感谢您的反馈。就我个人而言,我只从教育角度使用股票数据。实际上,我还有一个与您的文章相关的技术问题。
如果我们先对整个数据集进行差分,然后再将其分割成训练集和验证集,并保留历史值用于未来的差分逆运算,那么使用这个历史值来差分逆运算测试集上的预测值是否正确?或者我们需要为每个训练或测试区间保留历史值?
使用以下示例
原始结果:[3, 2, 5, 1, 6, 2, 7, 9, 8]
整个差分结果:[-1, 3, -4, 5, -4, 5, 2, -1]
历史值:3
训练结果:[-1, 3, -4, 5, -4, 5]
测试结果:[ 2, -1]
预测结果:假设是 [1, -1]
我如何仅针对测试集对这个预测结果进行差分逆运算?我认为使用历史值 3 是不正确的,我们应该使用历史值 7(见原始结果)。使用 3,我们将得到未差分的预测值 [4, 2],而使用 7,我们将得到 [8, 6],差异很大。
提前非常感谢。
您可以在分割后进行差分,只是有时会很麻烦。也许您应该这样做以确保避免数据泄露。
你好 Jason,
您是否对在数据集上执行 Box-Cox 反变换有任何建议,其中最佳 lambda 值在 -2 到 -3 的范围内?我得到的错误是,根据公式
exp(log(lam * value + 1) / lam)
是 Python 无法执行负数的对数,因此会引发错误。
有没有解决办法?您的答案非常感谢。
也许在对数之前向数据添加一个常数,然后在反向后减去。
亲爱的Brownlee先生,
我想确定一个库存系统的理论“当前”性能。为此,我想确定这个具有趋势和季节性的时间序列的方差。
时间序列是加性的。考虑到上述原则,我想知道方差是否在所有值上都相同?如果不是,是否可以通过执行反向变换运算来计算每个时期的方差?
提前感谢。
诚挚的问候,
Teun J.
计算单个观测值的方差对我来说没有意义,抱歉。不太确定我能否提供帮助。
亲爱的Brownlee先生,
抱歉我的问题表述不清。我不是要计算单个观测值的方差。然而,在每个时间间隔具有相同的方差,而需求值差异很大,这似乎很奇怪。
例如,方差为 100,在需求为 50 的时期,这比在需求为 500 的时期更显著?我想知道如何处理这个问题。
诚挚的问候,
Teun J.
有时变量中的大方差可以通过幂变换来解决。也许可以尝试一下,并将结果分布与原始数据的分布进行比较。
感谢您如此精彩的解释!
我想知道将 ML 模型预测值的对数进行反向运算以恢复到原始值是否有意义?我的意思是,从物理上讲,这有意义吗?
因为当我得到一个可信的拟合模型,如 log(y) = f(x) 时,我比较 log(y_real) vs log(y_pred),我得到一条直线,就像一个好的模型通常描述的那样。但如果我比较这些值的指数,结果完全糟糕!因此,我真的不知道我们是否必须停留在对数值上。
此致,
Marc
是的。如果您取对数,则需要 e^x 才能回到原始单位。
我正在检测自动化车辆时间序列数据的异常,数据特征是车内速度、GPS 速度、车内加速度,时间序列数据是平稳的。我想知道是否可以在自动化车辆数据上使用差分预处理?非常感谢。
如果您的数据是平稳的,为什么还要进行差分?数据并没有阻止您,但您需要说明为什么想要这样做。
你好 Jason。解释得很棒。只是有点困惑,通常我们在先将数据分割成训练-测试集,然后仅根据训练数据找到均值和标准差指标进行转换。但对我来说,这个工作流程对于差分变换没有意义,我不知道如何变换我的数据——是在分割之前还是之后?我在 Kaggle 上只找到了一项这样的代码实现,其中作者在分割之前对整个数据集进行了转换。所以我想那是对的。
此外,我一直在尝试和创建不同的函数来转换我的数据,但在反向变换部分卡住了。我尝试了 cumsum() 和带有负移位的滚动和,但反向变换不正确。
但是,您的代码在进行修改后几乎可以正常工作——我可以在我的项目中使用您的函数吗?
在分割成训练和测试/验证集后进行归一化。原因是避免任何数据泄露。
数据泄露
数据泄露是指在创建模型时使用了训练数据集以外的信息。这些附加信息可以使模型了解或知道它本来不知道的内容,从而使正在构建的模型性能估计无效。
嗨 Jason,
非常欣赏您的博客内容,它们非常棒!
我有一个关于单变量时间序列预测不太清楚的问题,那就是数据集的分割、监督处理和归一化数据的顺序是如何确定的?
提前感谢
请参阅我之前的回复。
a=分割数据集,b=监督处理,c=归一化数据
我对这三者的顺序的理解是 c-b-a
不确定这是否正确
请参阅我之前的回复。
嗨,Jason,
如果您没有看到我的问题,我将再发一条信息
首先,您的博客内容非常棒,它确实帮助了很多人!
我的问题是关于单变量多步预测模型,我对以下三个步骤的顺序不太确定
a) 分割数据集
b) 归一化数据
c) 监督处理
这三者的确切顺序是什么?
提前感谢。
诚挚的问候,
克里斯
你好 Chris……您陈述的顺序在机器学习中是首选的。
你好,请问如何实际移除趋势和季节性?例如,我使用 ARIMA(0,1,1)(0,1,1)[12] 和 ARIMA(0,1,1)(0,1,1)[52] 模拟数据,所以在将其输入 ANN 之前,我应该有
# 差异数据集
def difference(data, order)
return [data[i] – data[i – order] for i in range(order, len(data))]
# create a list of configs to try
def model_configs()
# define scope of configs
n_input = [1]
n_nodes = [100]
n_epochs = [1, 10,20,50,100]
n_batch = [32,64,128]
n_diff = [13]
# create configs
configs = list()
for i in n_input
for j in n_nodes
for k in n_epochs
for l in n_batch
for m in n_diff
cfg = [i, j, k, l, m]
configs.append(cfg)
print(‘Total configs: %d’ % len(configs))
return configs
n_diff=13 是吗?
我看到了这篇文章 https://machinelearning.org.cn/how-to-grid-search-deep-learning-models-for-time-series-forecasting/,模型是 ARIMA(0,1,1)(0,1,1)[12],但 n_diff=12 仅此而已?为什么?并在我模拟的数据上尝试一下
Low_Size480 <- replicate(500, sim_sarima(n = 504, model = list(ma = -0.8, sma = 0.4, iorder=1,siorder=1, nseasons = 12)))
sum(Low_Size480[,1]==0)
Low_Size480<- Low_Size480[-1:-24,]
但 ANN 的结果无法胜过 SARIMA……你能帮帮我吗
你好 Kelly…你可能会对以下资源感兴趣
https://machinelearning.org.cn/time-series-seasonality-with-python/
https://machinelearning.org.cn/remove-trends-seasonality-difference-transform-python/
另外,你也可以考虑使用深度学习方法进行时间序列预测
https://machinelearning.org.cn/start-here/#deep_learning_time_series