💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 如何开发一种熟练的机器学习时间序列预测模型 > 原文: [https://machinelearningmastery.com/how-to-develop-a-skilful-time-series-forecasting-model/](https://machinelearningmastery.com/how-to-develop-a-skilful-time-series-forecasting-model/) 您交给数据并告知他们开发预测模型。 _ 你做什么的?_ 这是一种常见的情况;远比大多数人想象的要普遍。 * 也许您会收到一个 CSV 文件。 * 也许您可以访问数据库。 * 也许你正在开始比赛。 问题可以合理地定义: * 您拥有或可以访问历史时间序列数据。 * 您知道或可以找出需要预测的内容。 * 您知道或者可以了解在评估候选模型时最重要的是什么。 那么你如何解决这个问题呢? 除非你经历过这场审判,否则你可能会挣扎。 * 你可能很难,因为你是机器学习和时间序列领域的新手。 * 即使您拥有机器学习经验,也可能会因为时间序列数据不同而挣扎。 * 即使您具有时间序列预测背景,您也可能会遇到困难,因为机器学习方法可能优于您的数据的传统方法。 在所有这些情况下,您将从仔细和系统地解决问题中受益。 在这篇文章中,我想给你一个特定的,可操作的程序,你可以用它来处理你的时间序列预测问题。 让我们开始吧。 ![How to Develop a Skilful Time Series Forecasting Model](https://img.kancloud.cn/2f/46/2f468cd4dc01a648bbc3db935bd35d9d_640x277.jpg) 如何开发熟练的时间序列预测模型 照片由[制作肯尼亚](https://www.flickr.com/photos/makeitkenya/22036888582/),保留一些权利。 ## 流程概述 这个过程的目标是尽可能快地获得“_ 足够好的 _”预测模型。 这个过程可能会或可能不会提供最好的模型,但它会提供一个好的模型:一个比基线预测更好的模型,如果存在这样的模型。 通常,此过程将提供的模型占问题可达到的 80%到 90%。 这个过程很快。因此,它专注于自动化。基于仔细分析,搜索超参数而不是指定超参数。我们鼓励您并行测试模型套件,快速了解哪些有效,哪些无效。 尽管如此,这个过程非常灵活,如果您有时间和资源,您可以在给定的步骤中循环或尽可能深入。 这个过程分为四个部分;他们是: 1. 定义问题 2. 设计测试线束 3. 测试模型 4. 完成模型 您会注意到该过程不同于预测建模问题的经典线性工作。这是因为它旨在快速获得工作预测模型,然后放慢速度,看看是否可以获得更好的模型。 您处理新的时间序列预测问题的过程是什么? 在评论中分享。 ## 如何使用此过程 最大的错误是跳过步骤。 例如,几乎所有初学者所犯的错误就是直接进行建模,而没有深入了解正在解决的问题或如何稳健地评估候选解决方案。这几乎总会导致大量的浪费时间。 慢下来,按照流程,完成每一步。 我建议为每个可以随时重新运行的实验提供单独的代码。 这很重要,以便您在发现错误,修复代码和重新运行实验时可以回退。您正在运行实验并快速迭代,但如果您是草率的,那么您不能相信任何结果。在设计用于评估候选模型的测试工具时,这一点尤其重要。 让我们仔细看看这个过程的每一步。 ## 1.定义问题 定义您的时间序列问题。 在每个主题中要考虑和激发问题的一些主题如下: 1. 输入与输出 1. 预测的输入和输出是什么? 2. 内生与外生 1. 什么是内生和外生变量? 3. 非结构化与结构化 1. 时间序列变量是非结构化的还是结构化的? 4. 回归与分类 1. 您正在研究回归或分类预测建模问题吗? 2. 有哪些方法来构建时间序列预测问题? 5. 单变量与多变量 1. 您是在处理单变量或多变量时间序列问题吗? 6. 单步与多步 1. 您需要单步骤还是多步骤预测? 7. 静态与动态 1. 您需要静态或动态更新的模型吗? 即使您必须估计或猜测,也要回答每个问题。 一些有用的工具可以帮助您获得答案: * 数据可视化(例如线图等)。 * 统计分析(例如 ACF / PACF 图等)。 * 领域专家。 * 项目利益相关 在了解更多信息后,请更新这些问题的答案。 ## 2.设计测试线束 设计可用于评估候选模型的测试工具。 这包括用于估计模型技能的方法和用于评估预测的度量。 如果您正在寻找想法,下面是一个常见的时间序列预测模型评估方案: 1. 将数据集拆分为训练和测试集。 2. 在训练数据集上拟合候选方法。 3. 直接对测试集进行预测或使用前向验证。 4. 计算将预测与预期值进行比较的指标。 测试工具必须坚固耐用,您必须完全信任它提供的结果。 一个重要的考虑因素是确保用于数据准备的任何系数仅从训练数据集中估算,然后应用于测试集。这可能包括数据标准化的平均值和标准差。 ## 3.测试模型 使用您的测试工具测试许多模型。 我建议您仔细设计实验,以测试标准模型的一套配置并让它们运行。每个实验都可以将结果记录到文件中,以便您可以快速发现每次运行中最前三到五个最熟练的配置。 您可以设计实验的一些常见方法类别包括: * 基线。 * 持久性(网格搜索持久的滞后观察) * 滚动移动平均线。 * ... * 自回归。 * ARMA 用于固定数据。 * ARIMA 用于趋势数据。 * SARIMA 提供季节性数据。 * ... * 指数平滑。 * 简单的平滑 * Holt Winters 平滑 * ... * 线性机器学习。 * 线性回归 * 岭回归 * 套索回归 * 弹性网络回归 * ...。 * 非线性机器学习。 * k-最近邻居 * 分类和回归树 * 支持向量回归 * ... * 合奏机器学习。 * 套袋 * 推进 * 随机森林 * 梯度提升 * ... * 深度学习。 * MLP * CNN * LSTM * 杂种 * ... 此列表基于单变量时间序列预测问题,但您可以根据问题的具体情况对其进行调整,例如:使用 VAR / VARMA /等。在多变量时间序列预测的情况下。 根据您的需要,插入更多您最喜欢的经典时间序列预测方法和机器学习方法。 这里的顺序很重要,其结构越来越复杂,从古典到现代的方法。早期的方法很简单,快速提供良好的结果;后来的方法更慢,更复杂,但也有更高的标准,以明确熟练。 由此产生的模型技能可用于棘轮。例如,最佳持久性配置的技能提供了所有其他模型必须超越的基线技能。如果自回归模型比持久性更好,那么它就会成为一个优秀的新级别,以便将方法视为技巧。 理想情况下,您希望在进入下一个级别之前耗尽每个级别。例如。充分利用自回归方法,并在继续使用指数平滑方法之前,将结果用作新基线来定义“熟练”。 我最后深入学习,因为通常神经网络在时间序列预测方面很差,但在这方面仍有很大的改进和实验空间。 您拥有的时间和资源越多,您可以评估的配置就越多。 例如,有了更多的时间和资源,您可以: * 在已知已经表现良好的配置周围以更精细的分辨率搜索模型配置。 * 搜索更多模型超参数配置。 * 使用分析在要搜索的模型超参数上设置更好的边界。 * 使用领域知识更好地准备数据或设计输入功能。 * 探索不同的潜在更复杂的方法。 * 探索表现良好的基础模型的集合。 我还鼓励您将数据准备方案作为模型运行的超参数包括在内。 一些方法将执行一些基本数据准备,例如 ARIMA 中的差分,然而,通常不清楚究竟需要什么数据准备方案或方案组合来最佳地将数据集呈现给建模算法。而不是猜测,网格搜索并根据实际结果决定。 一些要考虑的数据准备方案包括: * 差异化以消除趋势。 * 季节性差异以消除季节性。 * 标准化为中心。 * 标准化为重新缩放。 * 电源转换使正常。 如此多的搜索可能会很慢。 加快模型评估的一些想法包括: * 通过云硬件(例如 Amazon EC2)并行使用多台计算机。 * 减小训练或测试数据集的大小,以使评估过程更快。 * 如果以后有时间,请使用更粗糙的超参数网格并圈回。 * 也许不要为前进验证中的每个步骤重新设计模型。 ## 4.完成模型 在上一个时间步骤结束时,您知道您的时间序列是否可预测。 如果它是可预测的,您将拥有一个熟悉该问题的前 5 到 10 个候选模型的列表。 您可以选择一个或多个模型并完成它们。这包括在所有可用的历史数据(训练和测试)上训练新的最终模型。 该模型已准备就绪;例如: * 预测未来。 * 将模型保存到文件以供以后用于进行预测。 * 将模型合并到用于进行预测的软件中。 如果您有时间,可以随时回到上一步,看看是否可以进一步改进最终模型。 如果数据随时间显着变化,则可能需要定期进行此操作。 ## 进一步阅读 如果您希望深入了解,本节将提供有关该主题的更多资源。 * [什么是时间序列预测?](https://machinelearningmastery.com/time-series-forecasting/) * [如何通过时间序列预测项目](https://machinelearningmastery.com/work-time-series-forecast-project/) * [如何训练最终机器学习模型](https://machinelearningmastery.com/train-final-machine-learning-model/) ## 摘要 在这篇文章中,您发现了一个简单的四步过程,您可以使用该过程快速发现针对时间序列预测问题的熟练预测模型。 你觉得这个过程有用吗? 请在下面告诉我。 你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。