
用新数据集构建你的第二个 ARIMA 模型ML-For-Beginners 时序预测实战作业全解析【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners导读本文围绕 ML-For-Beginners 课程《7-TimeSeries/2-ARIMA》的课后作业作业原文展开在已经跟随课程用能源负荷数据构建过一个 ARIMA/SARIMA 模型之后要求你换一份全新的数据集从零构建一个新的 ARIMA 模型并在 notebook 中完成数据可视化、模型训练与 MAPE 精度评估。读完本文你将掌握 ARIMA 的核心参数含义、完整建模流水线、walk-forward前向滚动验证方法以及如何将这套方法论迁移到任意新数据上交付一份符合优秀Exemplary标准的作业。作业目标与验收标准作业原文的要求非常精炼共三件事用新鲜数据构建一个新的 ARIMA 模型官方建议尝试 Duke 大学提供的时序数据集在 notebook 中完整注释工作过程包括数据可视化与模型可视化使用 MAPE平均绝对百分比误差测试模型精度。对应的评分细则Rubric如下标准优秀Exemplary合格Adequate待改进Needs Improvement—提交的 notebook 中包含一个构建、测试并加以解释的新 ARIMA 模型附有可视化与明确的精度数值notebook 未注释或包含 bugnotebook 不完整可以看出评价的关键词是完整、可解释、可量化仅仅跑通代码不够必须做到有注释、有图、有 MAPE 数值。本文后续将逐项拆解如何达成。前置知识ARIMA 到底是什么在动手前先回顾本课 README 中反复强调的三个核心概念——它们是选择新数据集和调参时的判断依据。平稳性Stationarity在统计学语境中平稳性指数据的分布在时间平移下不发生改变。非平稳数据会因趋势trend产生波动必须先经过变换才能被建模分析。例如季节性seasonality会给数据引入波动可以通过季节性差分seasonal differencing消除。差分Differencing差分是将非平稳数据变换为平稳数据的过程通过去除不恒定的趋势消除时间序列水平上的变化从而稳定序列的均值。判断一份新数据集是否需要差分、需要几阶差分直接决定了 ARIMA 参数d的取值。AR / I / MA 三部分拆解ARIMAAutoRegressive Integrated Moving Average由三部分组成AR自回归模型向后看用数据中**过去的取值lags滞后项**对当前值做回归。例如月销数据中每个月的销售额就是演化变量模型将其对其自身的历史滞后值回归。I积分/Integrated区别于 ARMA 模型这里的I指数据经过差分步骤被积分处理以消除非平稳性。MA移动平均输出变量由当前与过去的滞后项误差决定。一句话总结ARIMA 的目标是让模型尽可能贴合时序数据的特殊形态。参数体系p、d、q 与季节性参数 P、D、Q这是把模型迁移到新数据时最关键的环节。普通 ARIMA 有三个参数p自回归部分的阶数决定模型纳入多少过去值d积分部分的阶数即对序列施加的差分次数q移动平均部分的阶数。如果数据存在季节性比如课程中的小时级电力负荷数据一天 24 小时呈现明显的日周期就需要使用季节 ARIMASARIMA额外增加一组参数P、D、Q与p、d、q含义相同但作用于季节性分量另外还需指定季节周期长度m如小时数据的m24月度数据的m12。课程中的参考实现见 working/notebook.ipynb使用的是statsmodels的SARIMAXorder (4, 1, 0) seasonal_order (1, 1, 0, 24) model SARIMAX(endogtrain, orderorder, seasonal_orderseasonal_order) results model.fit() print(results.summary())提示手挑参数比较主观且耗时。课程也指出可以考虑使用pmdarima库的auto_arima()自动搜索较优参数组合。完整建模流水线把课程步骤迁移到新数据要拿到优秀评级作业 notebook 至少应复刻课程 README 中演示的这条完整流水线。以下步骤均以课程能源负荷数据为例换成你的新数据集时只需替换数据源与参数。第一步加载数据与依赖库课程使用仓库通用的数据加载函数load_data定义在 7-TimeSeries/common/utils.py它会按小时频率重建完整时间索引便于发现缺失时间段。依赖库加载代码如下import os import warnings import matplotlib.pyplot as plt import numpy as np import pandas as pd import datetime as dt import math from pandas.plotting import autocorrelation_plot from statsmodels.tsa.statespace.sarimax import SARIMAX from sklearn.preprocessing import MinMaxScaler from common.utils import load_data, mape from IPython.display import Image %matplotlib inline pd.options.display.float_format {:,.2f}.format np.set_printoptions(precision2) warnings.filterwarnings(ignore) # 忽略告警信息数据加载与概览energy load_data(./data)[[load]] energy.head(10)load_data的源码实现值得注意它读取 data/energy.csvGEFCom2014 竞赛的 2012–2014 三年小时级电力负荷数据并将timestamp设为索引后按freqH重建完整索引——这套标准化时间索引的思路同样适用于你的新数据集。第二步划分训练集与测试集划分的关键原则是测试集必须覆盖训练集之后的时间段确保模型无法偷看未来信息。课程中的划分train_start_dt 2014-11-01 00:00:00 test_start_dt 2014-12-30 00:00:00 train energy.copy()[(energy.index train_start_dt) (energy.index test_start_dt)][[load]] test energy.copy()[energy.index test_start_dt][[load]] print(Training data shape: , train.shape) print(Test data shape: , test.shape)输出示例Training data shape: (1416, 1) Test data shape: (48, 1)课程用相对较小的训练窗口约两个月即可因为电力负荷有很强的短期自相似性——这对你选择新数据也有启发优先选择具有明显周期/自相关结构的数据ARIMA 才能发挥价值。第三步数据缩放将训练数据缩放到 (0, 1) 区间便于模型收敛与数值稳定scaler MinMaxScaler() train[load] scaler.fit_transform(train) train.head(10)之后用同一scaler变换测试数据注意是transform而非fit_transform避免数据泄漏test[load] scaler.transform(test) test.head()课程还演示了用直方图对比原始数据 vs 缩放后数据的分布这是作业中值得保留的可视化动作。第四步实现 SARIMAX 模型设置预测步数horizon并实例化模型# 指定向前预测的步数 HORIZON 3 print(Forecasting horizon:, HORIZON, hours) order (4, 1, 0) seasonal_order (1, 1, 0, 24) model SARIMAX(endogtrain, orderorder, seasonal_orderseasonal_order) results model.fit() print(results.summary())fit()会输出一张模型摘要表课程特别注明由于SARIMAX在拟合时使用样本内验证in-sample validation所以流水线中省略了单独的验证集。第五步walk-forward前向滚动验证这是时序模型评估的金标准也是作业中测试精度环节的推荐做法。思路是每次用当前训练窗口预测下一个时间步把真实值并入训练窗口同时从窗口头部丢弃最旧观测以保持窗口固定如此滚动直到覆盖整个测试期。固定窗口既能保证训练效率又让每次预测都只使用截止到该时刻的信息。首先为每个 horizon 步构造带偏移的测试标签test_shifted test.copy() for t in range(1, HORIZON1): test_shifted[loadstr(t)] test_shifted[load].shift(-t, freqH) test_shifted test_shifted.dropna(howany) test_shifted.head(5)然后滚动训练与预测%%time training_window 720 # 用最近 30 天720 小时训练 train_ts train[load] test_ts test_shifted history [x for x in train_ts] history history[(-training_window):] predictions list() order (2, 1, 0) seasonal_order (1, 1, 0, 24) for t in range(test_ts.shape[0]): model SARIMAX(endoghistory, orderorder, seasonal_orderseasonal_order) model_fit model.fit() yhat model_fit.forecast(steps HORIZON) predictions.append(yhat) obs list(test_ts.iloc[t]) # 移动训练窗口 history.append(obs[0]) history.pop(0) print(test_ts.index[t]) print(t1, : predicted , yhat, expected , obs)运行过程输出示例2014-12-30 00:00:00 1 : predicted [0.32 0.29 0.28] expected [0.32945389435989236, 0.2900626678603402, 0.2739480752014323] 2014-12-30 01:00:00 2 : predicted [0.3 0.29 0.3 ] expected [0.2900626678603402, 0.2739480752014323, 0.26812891674127126]最后把预测与真实值对齐并用scaler.inverse_transform还原到原始量纲得到可解释的评估表eval_df pd.DataFrame(predictions, columns[tstr(t) for t in range(1, HORIZON1)]) eval_df[timestamp] test.index[0:len(test.index)-HORIZON1] eval_df pd.melt(eval_df, id_varstimestamp, value_nameprediction, var_nameh) eval_df[actual] np.array(np.transpose(test_ts)).ravel() eval_df[[prediction, actual]] scaler.inverse_transform(eval_df[[prediction, actual]]) eval_df.head()输出示例已还原为 MW 量纲timestamphpredictionactual02014-12-30 00:00:00t13,008.743,023.0012014-12-30 01:00:00t12,955.532,935.0022014-12-30 02:00:00t12,900.172,899.00用 MAPE 量化精度作业的硬性要求作业明确要求测试其精度使用 MAPE。MAPEMean Absolute Percentage Error平均绝对百分比误差的定义是预测值与真实值之差取绝对值后除以真实值再对所有预测点求平均。用课程配套的mape()函数见 7-TimeSeries/common/utils.py即可直接计算def mape(predictions, actuals): Mean absolute percentage error predictions np.array(predictions) actuals np.array(actuals) return (np.absolute(predictions - actuals) / actuals).mean()在多步预测场景下按 horizon 分组计算各步的平均百分比误差APE并输出整体 MAPEif(HORIZON 1): eval_df[APE] (eval_df[prediction] - eval_df[actual]).abs() / eval_df[actual] print(eval_df.groupby(h)[APE].mean()) # 单步预测 MAPE print(One step forecast MAPE: , (mape(eval_df[eval_df[h] t1][prediction], eval_df[eval_df[h] t1][actual]))*100, %) # 多步预测 MAPE print(Multi-step forecast MAPE: , mape(eval_df[prediction], eval_df[actual])*100, %)课程在能源负荷数据上的参考结果One step forecast MAPE: 0.5570581332313952 % Multi-step forecast MAPE: 1.1460048657704118 %数值越低越好MAPE 为 10 意味着预测平均偏差 10%。0.5% 左右的单步 MAPE 说明模型精度相当高。作为对比基准你的新数据集若也呈现强自相关/周期性通常应追求个位数百分比的 MAPE。最后务必像课程那样把精度画出来——单步预测直接叠加actual与prediction曲线多步预测则绘制真实值曲线并用透明度/线宽递减的蓝色曲线叠加t1、t2……各步预测直观展示误差随预测步数增加而放大的趋势if(HORIZON 1): ## 单步预测绘图 eval_df.plot(xtimestamp, y[actual, prediction], style[r, b], figsize(15, 8)) else: ## 多步预测绘图 plot_df eval_df[(eval_df.ht1)][[timestamp, actual]] for t in range(1, HORIZON1): plot_df[tstr(t)] eval_df[(eval_df.htstr(t))][prediction].values fig plt.figure(figsize(15, 8)) ax plt.plot(plot_df[timestamp], plot_df[actual], colorred, linewidth4.0) ax fig.add_subplot(111) for t in range(1, HORIZON1): x plot_df[timestamp][(t-1):] y plot_df[tstr(t)][0:len(x)] ax.plot(x, y, colorblue, linewidth4*math.pow(.9,t), alphamath.pow(0.8,t)) ax.legend(locbest) plt.xlabel(timestamp, fontsize12) plt.ylabel(load, fontsize12) plt.show()如何选择新数据集实用建议作业建议从 Duke 大学的时序数据集集中挑选。结合本课建模流水线的要求选择时可以参考以下标准这些是课程内容推导出的实践准则而非官方强制规定单变量优先流水线以单列load为目标新数据最好也是单变量序列便于直接套用SARIMAX(endog...)时间索引完整最好有连续、等间隔的时间戳小时/日/月均可load_data的按频率重建索引思路可帮你检查缺失值有可建模的结构带趋势或季节性如气温、销量、流量类数据比纯随机噪声更容易调出低 MAPE 的模型样本量适中小时级数据建议至少数百个点避免训练窗口如 720 步无数据可用。作业自查清单从合格到优秀对照评分细则在提交前逐项检查你的 notebook新模型确实构建并运行换用了新数据集且不是照抄能源数据全程有注释每个单元格用 Markdown/注释说明做了什么、为什么这么做——这是Exemplary与Adequate的分水岭可视化完整至少包含数据整体走势图、训练/测试划分图、预测 vs 真实值对比图精度明确量化给出单步及多步MAPE 数值并用一句话解读数值好坏无 bug 可复现从头到尾可Run All通过。延伸挑战作业本身是开放式的课程在 README 末尾的 Challenge 中还留了两个进阶方向可作为优秀作业的加分项探索其他精度指标除了 MAPE还可以研究 MAD平均绝对偏差、MSD均方偏差等时序精度度量并在 notebook 中对比说明各自的适用场景自动调参用pmdarima的auto_arima()自动搜索order与seasonal_order与手动调参结果对比验证参数选择的合理性。总之这份作业的真正价值不在于跑通代码而在于让你把平稳性判断 → 参数选择 → 滚动验证 → MAPE 评估这一整套 ARIMA 方法论迁移到一份全新的数据上并形成可复现、可解释的完整实验记录——这正是时序预测工程师的日常基本功。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考