在任何时间序列预测问题中,建立基准都至关重要。
性能基准可以让你了解所有其他模型在你的问题上实际表现如何。
在本教程中,你将学习如何开发一种持久性预测模型,你可以使用它来计算 Python 中时间序列数据集的基准性能水平。
完成本教程后,您将了解:
- 计算时间序列预测问题性能基准的重要性。
- 如何在 Python 中从头开始开发持久性模型。
- 如何评估持久性模型的预测并使用它来建立性能基准。
通过我的新书《使用 Python 进行时间序列预测入门》开启你的项目,包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。
- 2019 年 4 月更新:更新了数据集链接。

如何使用 Python 为时间序列预测制作基线预测
照片由 Bernard Spragg. NZ 拍摄,保留部分权利。
预测性能基准
预测性能基准提供了比较的依据。
它是你问题中所有其他建模技术的参考点。如果模型达到的性能低于或等于基准,则该技术应进行修正或放弃。
用于生成预测以计算基准性能的技术必须易于实现,并且不涉及问题特定的细节。
在你的预测问题上建立性能基准之前,你必须开发一个测试工具。这包括:
- 你打算用于训练和评估模型的数据集。
- 你打算用于估计技术性能的重采样技术(例如,训练/测试分割)。
- 你打算用于评估预测的性能度量(例如,均方误差)。
准备好后,你需要选择一种朴素技术,你可以用它来做出预测并计算基准性能。
目标是尽快在你的时间序列预测问题上获得基准性能,以便你可以更好地理解数据集并开发更高级的模型。
用于进行基准预测的良好技术具有三个特性:
- 简单:一种需要很少或不需要训练或智能的方法。
- 快速:一种实现速度快且计算上微不足道的预测方法。
- 可重复:一种确定性方法,这意味着给定相同的输入,它会产生预期的输出。
用于建立基准性能的常用算法是持久性算法。
停止以**慢速**学习时间序列预测!
参加我的免费7天电子邮件课程,了解如何入门(附带示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
持久性算法(“朴素”预测)
监督机器学习最常见的基准方法是 零规则 算法。
该算法在分类情况下预测多数类,或在回归情况下预测平均结果。这可以用于时间序列,但未考虑时间序列数据集中的序列相关结构。
用于时间序列数据集的等效技术是持久性算法。
持久性算法使用上一个时间步 (t-1) 的值来预测下一个时间步 (t+1) 的预期结果。
这满足了基准预测的上述三个条件。
为了使其具体化,我们将研究如何开发持久性模型并使用它来为简单的单变量时间序列问题建立基准性能。首先,让我们回顾一下洗发水销售数据集。
洗发水销售数据集
此数据集描述了三年内每月洗发水销售数量。
单位是销售计数,共有 36 个观测值。原始数据集归功于 Makridakis、Wheelwright 和 Hyndman (1998)。
以下是数据的前 5 行样本,包括标题行。
1 2 3 4 5 6 |
"Month","Sales" "1-01",266.0 "1-02",145.9 "1-03",183.1 "1-04",119.3 "1-05",180.3 |
以下是整个数据集的图表,你可以在其中下载数据集并了解更多信息。

洗发水销售数据集
该数据集显示出增加的趋势,可能还有一些季节性成分。
下载数据集并将其放在当前工作目录中,文件名为“shampoo-sales.csv”。
以下代码片段将加载洗发水销售数据集并绘制时间序列。
1 2 3 4 5 6 7 8 9 10 |
from pandas import read_csv from pandas import datetime from matplotlib import pyplot def parser(x): 返回 datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) series.plot() pyplot.show() |
运行示例将绘制时间序列,如下所示

洗发水销售数据集图
持久性算法
在 Python 中可以轻松实现持久性模型。
我们将本节分为 4 个步骤:
- 将单变量数据集转换为监督学习问题。
- 为测试工具建立训练和测试数据集。
- 定义持久性模型。
- 进行预测并建立基准性能。
- 查看完整示例并绘制输出。
让我们开始吧。
步骤 1:定义监督学习问题
第一步是加载数据集并创建滞后表示。也就是说,给定 t-1 处的观测值,预测 t+1 处的观测值。
1 2 3 4 5 |
# 创建滞后数据集 values = DataFrame(series.values) dataframe = concat([values.shift(1), values], axis=1) dataframe.columns = ['t-1', 't+1'] print(dataframe.head(5)) |
此代码片段创建数据集并打印新数据集的前 5 行。
我们可以看到,第一行(索引 0)将不得不被丢弃,因为在第一次观测之前没有观测值可用于进行预测。
从监督学习的角度来看,t-1 列是输入变量(X),t+1 列是输出变量(y)。
1 2 3 4 5 6 |
t-1 t+1 0 NaN 266.0 1 266.0 145.9 2 145.9 183.1 3 183.1 119.3 4 119.3 180.3 |
步骤 2:训练集和测试集
下一步是将数据集分成训练集和测试集。
我们将把前 66% 的观测值用于“训练”,其余 34% 用于评估。在分割时,我们注意排除数据中带有 NaN 值的第一个行。
在这种情况下不需要训练;这只是习惯。然后将每个训练集和测试集分成输入变量和输出变量。
1 2 3 4 5 6 |
# 拆分为训练集和测试集 X = dataframe.values train_size = int(len(X) * 0.66) train, test = X[1:train_size], X[train_size:] train_X, train_y = train[:,0], train[:,1] test_X, test_y = test[:,0], test[:,1] |
步骤 3:持久性算法
我们可以将我们的持久性模型定义为一个函数,该函数返回作为输入提供的值。
例如,如果提供了 t-1 值 266.0,则将其作为预测返回,而实际的真实或预期值恰好是 145.9(取自我们滞后数据集中第一个可用行)。
1 2 3 |
# 持久性模型 def model_persistence(x): 返回 x |
步骤 4:进行并评估预测
现在我们可以在测试数据集上评估这个模型。
我们使用步进验证方法来完成此操作。
不需要模型训练或再训练,因此本质上,我们逐个时间步地遍历测试数据集并获取预测。
一旦为训练数据集中的每个时间步进行了预测,它们就会与预期值进行比较,并计算均方误差 (MSE) 分数。
1 2 3 4 5 6 7 |
# 步进验证 predictions = list() 对于 x 在 test_X: yhat = model_persistence(x) predictions.append(yhat) test_score = mean_squared_error(test_y, predictions) print('测试 MSE: %.3f' % test_score) |
在这种情况下,测试数据集上的误差超过 17,730。
1 |
测试 MSE: 17730.518 |
步骤 5:完整示例
最后,绘制一张图表,显示训练数据集以及测试数据集中与预期值有所偏差的预测。
从持久性模型预测的图表中可以看出,该模型比实际情况滞后 1 步。销售数据存在上升趋势和逐月波动,这突显了持久性技术的局限性。

洗发水销售持久性模型
完整的示例如下所示。
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 30 31 32 33 34 35 36 37 38 39 40 41 |
from pandas import read_csv from pandas import datetime from pandas import DataFrame 从 pandas 导入 concat from matplotlib import pyplot from sklearn.metrics import mean_squared_error def parser(x): 返回 datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) # 创建滞后数据集 values = DataFrame(series.values) dataframe = concat([values.shift(1), values], axis=1) dataframe.columns = ['t-1', 't+1'] print(dataframe.head(5)) # 拆分为训练集和测试集 X = dataframe.values train_size = int(len(X) * 0.66) train, test = X[1:train_size], X[train_size:] train_X, train_y = train[:,0], train[:,1] test_X, test_y = test[:,0], test[:,1] # 持久性模型 def model_persistence(x): 返回 x # 步进验证 predictions = list() 对于 x 在 test_X: yhat = model_persistence(x) predictions.append(yhat) test_score = mean_squared_error(test_y, predictions) print('测试 MSE: %.3f' % test_score) # 绘制预测和预期结果 pyplot.plot(train_y) pyplot.plot([None 对于 i 在 train_y] + [x 对于 x 在 test_y]) pyplot.plot([None 对于 i 在 train_y] + [x 对于 x 在 predictions]) pyplot.show() |
我们已经看到了为洗发水销售问题从头开发的持久性模型的示例。
持久性算法是朴素的。它通常被称为朴素预测。
它对所应用的时间序列问题的具体细节不作任何假设。这使得它易于理解、快速实现和评估。
作为机器学习实践者,它也可以激发大量的改进。
把它们写下来。
这很有用,因为这些想法可以成为特征工程工作中的输入特征,或稍后在集成工作中可以组合的简单模型。
总结
在本教程中,你学习了如何使用 Python 在时间序列预测问题上建立基准性能。
具体来说,你学到了:
- 建立基准的重要性以及你可以使用的持久性算法。
- 如何在 Python 中从头实现持久性算法。
- 如何评估持久性算法的预测并将其用作基准。
你对基准性能或本教程有什么疑问吗?
在下面的评论中提出你的问题,我会尽力回答。
很棒的帖子。然而,我认为应该用 (t) 和 (t+1),而不是 (t-1) 和 (t+1)。前者表示滞后 2 个时间步;而持久性模型只需要 1 个时间步的回溯。
那样会更清楚,谢谢 Kevin。
有什么关于如何实现它的建议吗?
这仅仅是列声明的问题吗?
dataframe.columns = ['t-1', 't+1'] vs. dataframe.columns = ['t', 't+1']
...或者我需要更改更多代码逻辑吗?
好文章!
谢谢 Ansh。
创建基准预测。基准的难点当然在于未来。经济学家或气象学家在预测股市或天气方面的表现如何?不确定性是这项工作不可避免的一部分。
是的,我不确定我是否理解。也许你可以重述你的观点?
您好,我有一个问题。
引用:“如果模型达到的性能低于或等于基准,
……该技术应予以修正或放弃”
基准线在图中哪里?
就示例图而言,“低于或等于基准线”是什么意思?
红色和绿色的线描述了什么?
我假设
蓝线 = 训练数据
绿线 = 测试数据
红线 = 预测
我这样做对吗?
我不怕问愚蠢的问题。我学了很多,知道没有人无所不知 :-)。
这里,基准是你选择作为基准的模型。例如,一个持久性预测。
那么我就必须比较基准模型和所选模型的 MSE 值
来决定我所选的模型是否是预测某物的正确模型。
基准模型的性能是
测试得分:17730.518 MSE
我已将洗发水数据输入到您的多层感知器示例中。
测试 A)
多层感知器模型在洗发水数据上的性能是
训练得分:6623.57 MSE
测试得分:19589.78 MSE
MLP 模型测试分数:19589.78 MSE > 基准模型测试分数:17730.518 MSE
结论
所选的 MLP 模型预测了一些东西,因为它的 MSE 高于
使用相同原始数据时的基准模型的 MSE。
“这有一些意义”。
到目前为止,这是对的吗?
实际上,我希望更高的错误率是一个坏信号。
测试 B)
航空 LSTM 示例(用洗发水数据填充)
testScoreMyTest = mean_squared_error(testY[0], testPredict[:,0])
print(‘testScoreMyTest: %.2f MSE’ % (testScoreMyTest))
航空 LSTM 测试得分:20288.20 MSE > 基准模型测试得分:17730.518 MSE
结论
航空 LSTM 示例在洗发水数据上进行了预测。
这里我有一个问题。我想看看用户 Wollner 是否正确。
https://machinelearning.org.cn/time-series-prediction-lstm-recurrent-neural-networks-python-keras/#comment-383708
基准测试是否表明他错了???
我也尝试使用 RMSE
testScore = math.sqrt(mean_squared_error(test_y, predictions))
print(‘测试得分: %.2f RMSE’ % (testScore))
RMSE 值越小,模型的预测精度越好。
http://docs.aws.amazon.com/machine-learning/latest/dg/regression-model-insights.html
基准模型的性能是
testScore = math.sqrt(mean_squared_error(test_y, predictions))
print(‘测试得分: %.2f RMSE’ % (testScore))
测试得分:133.16 RMSE
我已将洗发水数据输入到您的多层感知器示例中。
测试 A)
多层感知器模型在洗发水数据上的性能是
测试得分:139.96 RMSE > 133.16 RMSE
测试 B)
航空 LSTM 示例(用洗发水数据填充)
测试得分:142.43 RMSE > 133.16 RMSE
结论
实际上,根据亚马逊的文档,我会说这两个模型
与基准模型相比表现不佳,因此它们
在专业上不适合解决“洗发水问题”。
我这里是不是有什么误解?
其目的是将基准模型的性能与你在问题上评估的所有其他模型进行比较。
关于 MSE,目标是最小化误差,因此值越小越好。
我尝试按照 https://matplotlib.net.cn/users/legend_guide.html 在图中添加标签
例如
pyplot.plot(train_y, label=’训练数据’)
但我每次都必须进入绘图窗口的选项并检查“自动生成标签”才能查看我的声明。
这种行为正常吗?
抱歉,我不是 matplotlib 专家,但你可以通过编程方式设置绘图的所有样式。
很棒的帖子,我阅读了整个迷你课程,现在正尝试实现它。
关于修改代码以接受多变量输入的任何提示?
谢谢。
我希望将来能更详细地介绍多变量情况。
为什么持久性模型图的步骤 5 中有间隙?如何弥补图中的间隙?
不确定我是否明白?
我们正在绘制不同的系列,因此它们在不同的位置开始和结束,并且具有不同的颜色。
我想你可以绘制任何你喜欢的东西,例如将历史记录与预测连接起来?
嘿,Jason
您能告诉我如何获得下个月的预测值吗?
假设我有 n 个月的数据,那么如何预测 n+1 个月的值呢?
是的,请看这篇文章
https://machinelearning.org.cn/make-sample-forecasts-arima-python/
嗨,Jason,
有没有办法在通过 ARIMA 进行预测时设置上限和下限?这对于避免业务数据中的错误值很有用。
你可以在评估之前对预测进行后处理。
是的,我做到了。我以为,也许有一种方法可以像在 R 中的 Prophet 中那样将边界作为参数传递。无论如何,谢谢 Jason 🙂
嗨,谢谢你的好帖子! 😀
我读了很多你的文章。不过,我有一个问题。
使用 LSTM 对随机游走过程(例如股票价格)进行预测会得到基线预测。
我怎样才能避免这种情况?
任何建议都会有所帮助。谢谢!
有些问题是不可预测的,例如随机游走。
谢谢你的博客,Jason。
即使读完了这篇文章,我也没有完全理解。
根据你的说法,持久性模型不是预测。在本文中,“预测”这个词可能不合适,不是吗?
你能告诉我吗;当我得到与原始数据图完全匹配的持久性图时,那意味着什么?
Ju
这是一种预测,只是一个朴素的预测。
Jason,此外在这个博客中,
如果我得到了与原始数据图完全匹配的基准线,我就不需要应用其他模型来解决目标问题了吗?
Ju
如果持久性模型给出零误差,则意味着你的时间序列是一条平坦的直线(例如没有信息)。
否则,也许你有一个 bug?
博士您好,
我在加载数据时遇到了问题,我似乎总是遇到带有 datetime 的数据的问题,但似乎无法找出问题所在,我是 Python 新手。希望能帮助我,因为我非常喜欢您的网站。错误似乎在第 6 行
/usr/local/bin/python3.7 /Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py
回溯(最近一次调用)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 3021 行,在 converter 中
date_parser(*date_cols), errors='ignore')
文件“/Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py”,第 6 行,在 parser 中
return datetime.strptime('190 ' +x, '%Y-%m')
TypeError: strptime() 参数 1 必须是 str,而不是 numpy.ndarray
处理上述异常时,发生了另一个异常
回溯(最近一次调用)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 3030 行,在 converter 中
dayfirst=dayfirst),
文件“pandas/_libs/tslibs/parsing.pyx”,第 434 行,在 pandas._libs.tslibs.parsing.try_parse_dates 中
文件“pandas/_libs/tslibs/parsing.pyx”,第 431 行,在 pandas._libs.tslibs.parsing.try_parse_dates 中
文件“/Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py”,第 6 行,在 parser 中
return datetime.strptime('190 ' +x, '%Y-%m')
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py”,第 577 行,在 _strptime_datetime 中
tt, fraction, gmtoff_fraction = _strptime(data_string, format)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py”,第 359 行,在 _strptime 中
(data_string, format))
ValueError: 时间数据 '190 1-01' 与格式 '%Y-%m' 不匹配
处理上述异常时,发生了另一个异常
回溯(最近一次调用)
文件“/Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py”,第 8 行,在
series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 678 行,在 parser_f 中
return _read(filepath_or_buffer, kwds)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 446 行,在 _read 中
data = parser.read(nrows)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 1036 行,在 read 中
ret = self._engine.read(nrows)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 1922 行,在 read 中
index, names = self._make_index(data, alldata, names)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 1426 行,在 _make_index 中
index = self._agg_index(index)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 1504 行,在 _agg_index 中
arr = self._date_conv(arr)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py”,第 3033 行,在 converter 中
return generic_parser(date_parser, *date_cols)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/date_converters.py”,第 39 行,在 generic_parser 中
results[i] = parse_func(*args)
文件“/Users/Brian/PycharmProjects/MachineLearningMasteryTimeSeries1/baselinezerorule.py”,第 6 行,在 parser 中
return datetime.strptime('190 ' +x, '%Y-%m')
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py”,第 577 行,在 _strptime_datetime 中
tt, fraction, gmtoff_fraction = _strptime(data_string, format)
文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py”,第 359 行,在 _strptime 中
(data_string, format))
ValueError: 时间数据 '190 1-01' 与格式 '%Y-%m' 不匹配
进程以退出代码 1 结束
这可能是你下载的数据集版本问题。
我在这里有一份可用的数据集副本
https://github.com/jbrownlee/Datasets
嗨,很棒的帖子,我只是想知道为什么我们需要 for 循环来计算
predictions
和错误率,而对我来说似乎我们可以简单地使用以下行test_score = mean_squared_error(test_y, test_X)
我错过了什么吗?
这更多的是方法论,你可以用任何你喜欢的东西替换持久性预测。
但我认为这不仅仅是为了更清楚。t-1 完全是错误的,它应该是 t。谢谢 Jason!
你好 Jason,感谢你的精彩教程!!
我们可以为多元时间序列建立持久性模型吗?
是的。
但这样做,我们只取目标列,而丢弃所有其他列,对吗?
是的,没错。
感谢您的出色工作,您是否仅通过查看图表就能发现模型是平稳的?文章提到数据可能显示出一些季节性成分?我们需要确认这一点吗?
你可以使用统计测试来检查时间序列是否平稳。
https://machinelearning.org.cn/time-series-data-stationary-python/
如果机器学习无法超越持久性模型(使用 t-1 数据进行 t+1 预测)的 RMSE,该怎么办?我们能做些什么来改进模型?或者是否有其他方法来衡量模型的预测能力?
你的时间序列可能无法预测。
尝试穷尽此列表中的所有想法
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
嗨,Jason,我想知道为什么预测模型看起来比测试数据错开了一步?我们的模型似乎比实际观测值晚了一点。那么如何纠正它呢?提前感谢。
这被称为持久性模型,它是最简单的时间序列预测方法,用于与更高级的方法进行比较。
感谢您的精彩文章。它们非常有帮助。
我正在尝试将 pytorch 预测基线应用于我的时间序列数据(太阳辐照度)。当我尝试预测少于 8 小时时,mse 等于或接近零,但当我进行其他预测时,mse 超过 100。
这正常吗?
以及
pytorch 预测使用哪种基线。
嗨,Louiza……非常欢迎你!
你可能正在处理回归问题并实现零预测误差。
或者,你可能正在处理分类问题并实现 100% 的准确率。
这很不寻常,原因有很多,包括:
你不小心在训练集上评估了模型性能。
你的保留数据集(训练集或验证集)太小或不具代表性。
你的代码中引入了一个错误,它正在做一些与你预期不同的事情。
你的预测问题很容易或微不足道,可能不需要机器学习。
最常见的原因是你的保留数据集太小或不代表更广泛的问题。
可以通过以下方法解决:
使用 k 折交叉验证来估计模型性能,而不是训练/测试拆分。
收集更多数据。
使用不同的数据拆分进行训练和测试,例如 50/50。
嗨,Jason – 我真的很喜欢这些教程!信息量很大。但有一个问题 – 我总是卡在所有练习的步进验证部分。当我执行代码 “test_score = mean_squared_error(test_y, predictions)” 时,我总是收到以下错误:
“发现输入变量的样本数量不一致”
有什么解决办法吗?我在洗发水、香槟和每日出生数据集上都遇到了相同的错误消息。非常感谢您的帮助!
这可能表明 test_y 和 predictions 中的样本数量不匹配。
也许你的示例中出现了 bug?
train_X, train_y = train[:,0], train[:,1]
test_X, test_y = test[:,0], test[:,1]
嗨,杰森,
我对步进验证和持久性模型有点困惑……我无法理解其目的……你能给我一个清晰的解释吗……
你可以在这里了解更多关于步进验证的信息
https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/
你好 Jason,
我可以在多元时间序列数据中使用步进验证吗?
是的,你可以在这里找到许多示例
https://machinelearning.org.cn/start-here/#deep_learning_time_series
谢谢你……
不客气!
嗨,Jason,
感谢您关于时间序列预测的精彩文章!
我想做多步预测,哪种基准模型是好的选择?如果我没理解错,持久性模型只是将时间 t-1 的值复制为时间 t 的预测,当预测多步时,它将是一条直线。
谢谢!
持久性是一个很好的基准模型,适用于一步和多步预测。
让我理解一下,您创建了一个持久性模型,它将问题框架为监督问题并查看性能,那么解决这个问题的最佳选择是什么?
这只是输入 (x) 和预测 (y) 吗?还是有其他更好的选择?
抱歉,我不明白你的问题,你能详细说明或重述一下吗?
嗨,Jason,
我觉得有些地方大错特错:你用测试数据进行预测……它应该从训练数据进行……测试数据应该用作真实值并与预测进行比较。
目前,你所做的只是值的偏移复制粘贴。这毫无用处,绝不是任何形式的预测。
当你刚接触时间序列时,这可能会令人困惑。
我们使用步进验证来评估模型——你可以在这里了解更多信息
https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/
嗨,Jason,
非常感谢您的精彩解释,我成了您的粉丝。
能给我处理多变量预测的链接吗?
问题:那么对于相同的数据集,如果我们构建任何其他模型,MSE 值应该小于 17,730 吗?我说的对吗?
不客气。
是的,博客上有很多,从这里开始
https://machinelearning.org.cn/start-here/#deep_learning_time_series
一个熟练的模型必须超越持久性模型。
谢谢你,Jason。
不客气。
嗨,在原始数据上应用基线模型(例如持久性)是必需的,还是可以在应用持久性模型之前应用差分或归一化?
实际上,在我的案例中,原始数据上的持久性模型给出了糟糕的结果,r2-score 为负数。但是当我对持久性模型应用季节性差分时,它给出了非常好的结果。
请给我一些建议,告诉我为什么会这样,我应该怎么做?
如果你愿意,可以使用具有季节性差分的持久性模型作为基准。这是你的项目!
是的,基准应该不做/少做假设,并在原始数据上操作。
你好,
我需要使用移动平均线(窗口大小为 3、7 和 30),然后计算 MAE 和 RMSE 吗?
我该怎么做?此外,shift(1) 和步进法在这种情况下是如何应用的?
shift(1) 与移动平均线的窗口大小 = 1 相同吗?
这将帮助你准备数据
https://machinelearning.org.cn/time-series-forecasting-supervised-learning/
嗨,Jason,
如果你的项目是每次预测 24 个样本。每小时数据预测一天。你能否建立一个反映这个过程的持久性模型?不是一次一个数据样本,而是一次 24 个样本。
例如,对于我测试数据集中(大约半年)的每一天,我的持久性模型将一次预测 24 个样本,这将是昨天的数据(24 个样本)
希望这有道理。我想我然后可以将这个持久性模型的 RMSE 结果与我实际的机器学习时间序列预测模型的相同测试数据集的一天预测结果的 RMSE 进行比较……对吗?
当然,我想你正在描述多步预测,例如输入若干时间步并预测若干时间步(7 天、24 小时、10 分钟等)。博客上有很多很多示例。
持久性模型可以进行多步预测吗?如何将其用作多元多步预测的基准模型?
当然,取每个变量的最后一个值,并将其用于每个预测步骤。
嗨,Jason,
在以下代码中,'190+x' 的目的是什么?
return datetime.strptime('190'+x, '%Y-%m')?
谢谢
为了正确解析数据中的日期。
嗨,Jason,感谢您的文章——这篇以及其他很多文章!
只是一个小小的提醒
from pandas import datetime – 导致警告
“FutureWarning: pandas.datetime 类已弃用,并将在未来的 pandas 版本中移除。请改从 datetime 模块导入。”
因此,在我的代码中,我已按照建议进行了更改
import datetime as dt
谢谢!
嗨,Jason,你能解释一下你的以下结论吗:“销售数据存在上升趋势和逐月波动,这突显了持久性技术的局限性。”
我不确定“逐月波动”
— 谢谢!
你好 Huy...以下内容可能对你有帮助
https://machinelearning.org.cn/decompose-time-series-data-trend-seasonality/
我不太确定你所说的“不需要模型训练或再训练,因此本质上,我们逐个时间步地遍历测试数据集并获取预测”是什么意思。如果模型不使用训练数据,那么将数据分成训练和测试的意义何在?根据我对此主题的理解,我是否可以说所有这些的目的是为了获得均方误差,并将其用作模型选择的基线?
嗨,Nate……如果可能,你应该有单独的训练、测试和验证数据集。
嘿,Jason
谢谢你,真的很有帮助!另外,非常感谢你的博客,多年来它一直非常有帮助——在这个快速发展的领域中,它能持续有用真是太棒了!!
关于这篇博客文章的两点快速反馈
– test_score = ((predictions – test_y) ** 2).mean() – 你从 sklearn 导入的功能也能做同样的事情,但让读者看到这不是导入函数背后的高深科学可能会很好 🙂
– 仅复制分步之间的代码片段会导致库无法正确导入,例如第一个片段有 from pandas import datetime。对于任何使用过这些库的人来说,这没什么问题,但对于初学者来说可能有点棘手!
嗨,Domi……非常欢迎你!感谢你的反馈!我们很感激!