预测大师的秘籍:揭开时间序列的真相

news/2024/12/19 11:32:37/文章来源:https://www.cnblogs.com/jellyai/p/18616808

上一篇:《用人工智能模型预测股市和加密货币的K线图》

序言:预测时间序列,乍听之下似乎离我们普通人很遥远,甚至有些晦涩难懂。其实该技术早已渗透进了我们的日常生活。天气预报每天提醒你是否带伞、股市的波动影响你的投资决策、电力公司的负荷管理让你享受稳定的电网服务……这些无不依赖时间序列分析的强大力量。本篇将带你从最简单的预测方法出发,逐步揭开时间序列的面纱,让你看到这门技术是如何在普通人和机器学习这门高深技术之间架起一座桥梁

时间序列预测技术

在进入基于机器学习的预测(将在接下来的几章中详细讨论)之前,我们先来探索一些更加简单的预测方法。这些方法可以帮助您建立一个基准,用以衡量机器学习预测的准确性。

通过简单预测建立基准

预测时间序列的最基本方法是假设在时间 t+1t+1t+1 的预测值等于时间 ttt 的值,实际上就是将时间序列向前平移一个周期。

让我们从创建一个包含趋势、季节性和噪声的时间序列开始:

def plot_series(time, series, format="-", start=0, end=None):

plt.plot(time[start:end], series[start:end], format)

plt.xlabel("Time")

plt.ylabel("Value")

plt.grid(True)

def trend(time, slope=0):

return slope * time

def seasonal_pattern(season_time):

"""这是一个任意模式,您可以根据需要更改"""

return np.where(season_time < 0.4,

np.cos(season_time * 2 * np.pi),

1 / np.exp(3 * season_time))

def seasonality(time, period, amplitude=1, phase=0):

"""在每个周期内重复相同的模式"""

season_time = ((time + phase) % period) / period

return amplitude * seasonal_pattern(season_time)

def noise(time, noise_level=1, seed=None):

rnd = np.random.RandomState(seed)

return rnd.randn(len(time)) * noise_level

time = np.arange(4 * 365 + 1, dtype="float32")

baseline = 10

series = trend(time, .05)

baseline = 10

amplitude = 15

slope = 0.09

noise_level = 6

创建时间序列

series = baseline + trend(time, slope) \

  • seasonality(time, period=365, amplitude=amplitude)

加入噪声

series += noise(time, noise_level, seed=42)

绘制该序列后,您会看到类似图 9-6 的结果。

                                                  图 9-6:包含趋势、季节性和噪声的时间序列

现在你已经有了数据,可以像处理任何数据源一样,将其拆分为训练集、验证集和测试集。当数据中存在某种季节性特征时,就像在本例中看到的那样,在拆分时间序列时最好确保每个部分都包含完整的季节。因此,例如,如果你想将图 9-6 中的数据拆分为训练集和验证集,一个不错的拆分点可能是时间步 1000,这样训练数据包含到第 1000 步为止,而验证数据则从第 1000 步开始。

在这里你实际上并不需要进行拆分,因为你只是做一个简单的预测,每个时间步 ttt 的值仅仅是时间步 t−1t-1t−1 的值。但为了便于接下来的几个图表说明,我们将聚焦于从时间步 1000 开始的数据。

要从某个分割时间点开始预测序列,这个时间点存储在变量 split_time 中,你可以使用如下代码:

naive_forecast = series[split_time - 1:-1]

图 9-7 显示了验证集(从时间步 1000 开始,split_time 设置为 1000)及其叠加的简单预测结果。


图 9-7:时间序列上的简单预测

看起来效果相当不错——预测值和实际值之间有一定关系,并且在时间轴上绘制时,预测值与原始值似乎非常接近。但你会如何衡量这种预测的准确性呢?

衡量预测准确性

有多种方法可以衡量预测的准确性,但我们将重点关注其中两种:均方误差(MSE)和平均绝对误差(MAE)。

• 对于 MSE,你只需计算时间 ttt 上预测值与实际值的差异,将其平方(以去掉负值),然后计算这些平方差的平均值。

• 对于 MAE,你计算时间 ttt 上预测值与实际值的差异,取绝对值(代替平方以去掉负值),然后计算这些绝对差值的平均值。

对于我们基于合成时间序列创建的简单预测,可以使用以下代码计算 MSE 和 MAE:

print(keras.metrics.mean_squared_error(x_valid, naive_forecast).numpy())

print(keras.metrics.mean_absolute_error(x_valid, naive_forecast).numpy())

我得到了一个 MSE 值为 76.47,一个 MAE 值为 6.89。像任何预测一样,如果你能降低误差,就可以提高预测的准确性。接下来我们看看如何实现这一点。

更少的简单预测:使用移动平均进行预测

之前的简单预测方法是将时间 t−1t-1t−1 的值作为时间 ttt 的预测值。使用移动平均的方法类似,但不是只取时间 t−1t-1t−1 的值,而是取一组值(比如 30 个),计算它们的平均值,并将其作为时间 ttt 的预测值。以下是代码实现:

def moving_average_forecast(series, window_size):

"""预测最近一组值的平均值。

如果 window_size=1,则等同于简单预测"""

forecast = []

for time in range(len(series) - window_size):

forecast.append(series[time:time + window_size].mean())

return np.array(forecast)

moving_avg = moving_average_forecast(series, 30)[split_time - 30:]

plt.figure(figsize=(10, 6))

plot_series(time_valid, x_valid)

plot_series(time_valid, moving_avg)

图 9-8 显示了移动平均值与数据的对比。


图 9-8:绘制移动平均值

在我绘制这个时间序列后,得到了 MSE 值为 49 和 MAE 值为 5.5。因此,预测准确性确实有所提升。但这种方法没有考虑到趋势或季节性,因此通过一些分析,我们可能还能进一步改进预测。

改进移动平均分析

鉴于这个时间序列的季节周期是 365 天,你可以使用一种叫做“差分”的技术来平滑趋势和季节性。差分的做法是将时间 ttt 的值减去时间 t−365t-365t−365 的值。这将使图形变得平坦。以下是代码:

diff_series = (series[365:] - series[:-365])

diff_time = time[365:]

现在你可以计算这些差分值的移动平均值,并将过去的值加回来:

diff_moving_avg = moving_average_forecast(diff_series, 50)[split_time - 365 - 50:]

diff_moving_avg_plus_smooth_past = moving_average_forecast(series[split_time - 370:-360], 10) + diff_moving_avg

绘制该结果(参见图 9-9)后,你会发现预测值已有明显改进:趋势线非常接近实际值,尽管噪声被平滑了。季节性和趋势都得到了有效反映。


图 9-9:改进的移动平均值

通过计算 MSE 和 MAE,这一改进的效果得到了进一步验证——在本例中,我得到了 MSE 值为 40.9 和 MAE 值为 5.13,显示出预测的明显提升。

总结

本章介绍了时间序列数据及其一些常见属性。你创建了一个合成的时间序列,并学习了如何对其进行简单预测。从这些预测中,你使用均方误差(MSE)和平均绝对误差(MAE)建立了基准测量。这是一个从 TensorFlow 的短暂休息,但在下一章中,你将重新使用 TensorFlow 和机器学习,看看是否能进一步提高预测的准确性!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855316.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Maps 抢先体验:解锁 Solar API 的更多覆盖范围和更深入的见解

随着全球能源需求的上升,住宅太阳能发电成为可持续发展未来的关键因素。要充分发挥太阳能的潜力,可获得且可扩展的解决方案至关重要。Cloud Ace 作为 Google Cloud Premier Partner将为大家同步谷歌地图最新信息:Cloud Ace - 谷歌云 | 谷歌云全球战略合作伙伴 | 云服务器据点…

易基因: ChIP-seq等揭示糖皮质激素和TET2共调控促进癌症转移的表观遗传机制|项目文章

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 结直肠癌(colorectal cancer,CRC)是全球范围内致死率极高的癌症之一,尤其是晚期患者。尽管手术切除是CRC的主要治疗手段,但肿瘤转移仍是影响患者长期生存的关键难题,而化疗对于提高生存率的效果有限。糖…

Java如何用HaspMap统计次数并排序详解

java统计单词频率 继上一讲Java用PDFTextStripper来解析pdf文件提取文字 - ivanlee717 - 博客园讲了如何接收和解析pdf之后,我们把pdf文件全部转为了String类型的字符串,那么这一讲聊聊怎么去统计每个词出现的频率。 正则过滤 首先我们需要把单词弄出来,把其他的文字过滤掉。…

IEC101/140 监视点与控制点

IEC101/140 监视点与控制点 IEC-60870-5-104 协议适用于远程控制设备和系统,通过数据传输来监控和控制地理上广泛的过程。该协议结合了 IEC-60870-5-101 协议和 TCP/IP 提供的传输功能。 任何使用 IEC-60870-5-104 协议的应用程序都将有一个主站(控制站)和一个或多个从站(受…

android emulator 设置代理

android emulator 设置代理 由于开发的 app 需要访问 google 服务,那么跑虚拟机的时候就需要设置网络代理,试了几种方法都没成功,记录一下 因为已知我开发电脑的代理地址和端口,只需要把电脑的代理设置到 emulator 上就可以了 设置Android Studio代理 先在Android Studio上…

Redux Thunk深入理解与使用指南

一、什么是 Redux Thunk? 在 React 应用中,Redux 是一个常用的状态管理工具。但 Redux 本身是一个纯同步状态管理工具,它的 dispatch 方法默认只支持同步操作。如果我们想要处理异步逻辑(如请求接口、延时操作等),需要使用中间件(middleware)。Redux Thunk 就是一个用于…

无人车队运营需要的远程驾驶平台

无人车队在全时商业化运营的过程中,不可避免会出现自动驾驶无法处理的极端、异常场景。为提高运营效率,避免配备随车安全员带来的成本上升与风险增加,使用远程驾驶系统对无人车队运营进行辅助是较为经济且可靠的解决方案。经纬恒润远程驾驶系统具备丰富的功能和宽广的能力覆…

求职者必备:如何用管理软件实现高效的Offer规划

一、毕业季Offer规划的复杂性 毕业季的Offer规划不仅仅是简单的找工作过程,更是一次紧张的时间赛跑。从投递简历、面试安排、薪资谈判到最终的决定,整个过程充满了大量的任务和步骤。这些任务和环节涉及不同的公司、职位要求、面试形式以及其他各种变量。如果没有一个高效的工…

函数式接口之方法作为参数

在现实开发中,肯定会遇到这样一种情况,有几个业务场景,里面的大部分业务逻辑都一样,只有某些逻辑不同,而这些不同的逻辑又依赖于前面的逻辑,你会选择写重复代码去实现还是选择抽取公共方法,对那些不同的逻辑做单独处理?是不是理解起来比较抽象,简单就一句话,怎么把方…

胖东来成功背后的管理智慧:零售行业如何借鉴?

零售行业通过选择合适的看板软件、实施看板管理以及持续优化与改进等步骤,可以实现管理优化和效率提升。这将有助于企业更好地应对市场竞争、提高客户满意度和实现可持续发展。胖东来创始人于东来在社交平台分享了胖东来商贸集团2024年的营业情况。数据显示,截至2024年11月26…

旅游公司各部门联动,何种办公软件能高效协同?

在旅游行业蓬勃发展且竞争日益激烈的当下,高效的团队协作与个人学习效率提升成为旅游公司脱颖而出的关键因素。尤其是对于 MBTI 类型中倾向于有序规划的 J 人而言,可视化的团队协作办公软件犹如得力助手,能够让复杂的旅游业务流程清晰呈现,促进信息的高效流通与任务的顺利推…

linux操作系统安装

1.centenos镜像文件下载 2.创建一个虚拟机 1)打开VMware软件,选择创建新的虚拟机,在弹出的虚拟机向导的窗口选择自定义配置,点击下一步;2)默认设置3)选择稍后安装系统4)客户机操作系统选择Linux,版本选择CentOS 7(64位)5)命名虚拟机,选择存储路径6)处理器配置根据…