ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

在 ML-For-Beginners 中构建全新的 ARIMA 模型:从新数据准备、可视化到 MAPE 精度评估的完整实战

在 ML-For-Beginners 中构建全新的 ARIMA 模型:从新数据准备、可视化到 MAPE 精度评估的完整实战 在 ML-For-Beginners 中构建全新的 ARIMA 模型从新数据准备、可视化到 MAPE 精度评估的完整实战【免费下载链接】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/assignment.md保加利亚语译本位于 translations/bg/7-TimeSeries/2-ARIMA/assignment.md英文原版位于 translations/en/7-TimeSeries/2-ARIMA/assignment.md所布置的实践作业为核心主题。该作业要求学习者在课程示例 ARIMA 模型之外用全新数据再构建一个 ARIMA 模型把全过程注释在 Jupyter Notebook 中完成数据与模型的可视化并采用 MAPE平均绝对百分比误差检验模型精度。本文将把这份作业拆解为可直接照做的技术路线结合仓库中能量负荷energy load数据的完整参考流水线说明如何正确切分时间序列、缩放数据、确定(p,d,q)与季节阶数、执行 walk-forward 验证并解读 MAPE最终交付一份能匹配评分表中“优秀”档位的高质量 Notebook。作业要求拆解与评分标准先精确理解作业本身。原文指令只有一段核心描述你已经在课程中构建过一个 ARIMA 模型现在请用新鲜的数据再构建一个新模型可尝试 Duke 大学提供的时间序列数据集之一把工作注释在 notebook 中可视化数据与模型并用MAPE检验其精度。配套的评分表Rubric是判断完成度的关键对应关系如下评分标准优秀Exemplary合格Adequate待改进Needs Improvement交付物提交的 notebook 中构建并测试了新 ARIMA 模型配有可视化解释并明确给出模型精度提交的 notebook 未做注释或含有 bug提交的 notebook 不完整翻译脚注免责声明提示保加利亚语版本由 AI 翻译服务生成准确性以英语原文为准。因此下面所有技术细节均以仓库中英文课程内容为准这一点在引用时需要注意。由此可归纳出作业的四个显式验收点本文随后将逐一覆盖新数据与课程示例energy.csv不同的、独立的时间序列数据新 ARIMA 模型完整经历“切分 → 建模 → 预测”流程注释 可视化notebook 中每一关键步骤配有解释文字与图表MAPE 精度以量化数字陈述模型误差。前置技术概念ARIMA / SARIMA 核心知识回顾作业要求“可视化数据与模型”“解释精度”若没有扎实的概念支撑注释环节将无从下笔。课程正文 7-TimeSeries/2-ARIMA/README.md 已系统给出 ARIMA 建模所需的核心概念以下按“解释进 notebook 注释”的维度整理平稳性Stationarity统计意义上数据分布在时间平移后不发生变化即为平稳。非平稳数据会因趋势、季节性等产生波动分析前必须做变换处理例如季节性可通过“季节性差分”消除。差分Differencing将非平稳数据转化为平稳数据的过程——通过差分去除时间序列水平的变化从而消除趋势与季节性、稳定序列均值。AR自回归模型“回看”过去的取值即滞后项 lag来对当前值建模例如“用前几月的销量解释本月销量”。I整合相对于 ARMA 模型ARIMA 的“I”指差分步骤的施加即数据经过若干次差分以消除非平稳性后称为“整合”。MA移动平均输出变量由当前与过去若干期的误差项决定。参数组p, d, qp对应自回归部分纳入历史值d对应差分的阶数q对应移动平均部分。当数据具有季节性energy 数据即如此时还需要第二组季节参数P, D, Q与季节周期长度m这就是 SARIMA本课实际使用的是 statsmodels 的SARIMAX含外生变量的季节 ARIMA即便本例不传外生变量。参考流水线课程里 energy 负荷数据是如何“从零到 MAPE”的作业的真正难点在于你不是凭空创新而是要在课程已跑通的完整流水线上替换数据。因此吃透课程示例代码是新模型能否一次做对的关键。完整代码位于课程working目录7-TimeSeries/2-ARIMA/working/notebook.ipynb保加利亚语译本对应 translations/bg/7-TimeSeries/2-ARIMA/working/notebook.ipynb示例数据为 7-TimeSeries/data/energy.csvGEFCom 2014 电力负荷数据列为timestamp, load, temp2012 年初至 2014 年底逐小时 26000 余条记录。第一步工具函数与数据装载仓库把数据读取与 MAPE 计算封装进了公共模块 common/utils.py。load_data见 load_data 定义读取 CSV 后将timestamp解析为索引并用pd.date_range(..., freqH)按小时重索引从而暴露数据中缺失的时间片energy load_data(./data)[[load]] energy.head(10)这里只取了load一列因为作业与课程都聚焦单变量时间序列预测。数据装载后先画出 2012 年 1 月到 2014 年 12 月全部负荷曲线确认明显的日周期与季节周期——“可视化数据”正是评分表中优秀档的显式要求之一energy.plot(yload, subplotsTrue, figsize(15, 8), fontsize12) plt.xlabel(timestamp, fontsize12) plt.ylabel(load, fontsize12) plt.show()第二步按时间先后切分训练集与测试集时间序列建模最忌讳“用未来信息预测过去”。课程给出的切分原则是测试集必须在时间上晚于训练集。示例中训练期为 2014-11-01 起、测试期自 2014-12-30 起的逐小时数据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)输出训练集 1416 行、测试集 48 行。课程随后把两段数据并置绘制直观展示“前段训练、后段测试”的时序关系由于电力负荷具有强烈的季节规律且近期行为更相似用较近的短窗口训练即可得到不错效果课程还注明由于拟合函数在拟合期内做样本内验证这里省略单独的验证集。第三步缩放数据到 (0,1)ARIMA/SARIMAX 建模前先做两步准备按时间段过滤出需要的数据再做缩放把数据投影到 0 到 1 区间scaler MinMaxScaler() train[load] scaler.fit_transform(train) test[load] scaler.transform(test)关键陷阱是scaler只能对训练集fit测试集只用transform否则会把测试集分布信息泄漏进训练流程。课程用并排直方图对比原始数据与缩放后数据的分布这类可视化也应写进你的作业 notebook。第四步定义 SARIMAX 模型并拟合定义模型分三步用SARIMAX()声明模型并传入参数用fit()训练用forecast()指定未来步数horizon预测order (4, 1, 0) # (p, d, q) seasonal_order (1, 1, 0, 24) # (P, D, Q, m)m24 表示以 24 小时为季节周期 model SARIMAX(endogtrain, orderorder, seasonal_orderseasonal_order) results model.fit() print(results.summary())seasonal_order中的24与逐小时数据的“一天 24 小时”周期对应换成新数据时这一步必须依据你自己的数据频率与周期重设见下文第五节的通用化说明。课程同时提示人工挑选最优参数较为困难且耗时正文中建议考虑借助auto_arima()一类的自动搜索函数辅助确定参数组合。第五步walk-forward前向滚动验证要评估时序模型课程采用业界标准的walk-forward 验证从序列起点开始在训练集上训练预测下一个时间步用真实值评估预测再把真实值并入训练集、同时按“固定窗口”丢掉序列开头最旧的观测如此滚动直到覆盖全部测试数据。这种重训机制让模型在每个时间步上都能给出尽可能好的预测代价是计算量随滚动次数线性增长。HORIZON 3 # 一次向前预测 3 小时 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)shift(-t, freqH)把真实负荷按时间向前平移t小时从而为每个时间点生成“t1、t2、… 的真实值”列供预测对照。随后以固定 720 小时30 天窗口滚动拟合与预测%%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)注意示例中滚动验证阶段使用的阶数为order(2,1,0)、seasonal_order(1,1,0,24)与先前演示拟合的(4,1,0)不同——参数选择本就需要在多组候选中尝试取舍这也是作业要求在 notebook 中注释模型理由的原因。预测完成后把所有预测拼成便于评估的长表并用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()课程给出的前几行输出为prediction约 2900–3010、actual约 2886–3023量纲与原始负荷一致。第六步用 MAPE 检验精度并可视化MAPE平均绝对百分比误差把每个预测点的|actual − predicted| / actual累加并除以拟合点数得到一个百分比形式的相对误差。课程对该指标的分步计算如下多步时先按h分组再求平均if(HORIZON 1): eval_df[APE] (eval_df[prediction] - eval_df[actual]).abs() / eval_df[actual] print(eval_df.groupby(h)[APE].mean()) print(One step forecast MAPE: , (mape(eval_df[eval_df[h] t1][prediction], eval_df[eval_df[h] t1][actual]))*100, %) print(Multi-step forecast MAPE: , mape(eval_df[prediction], eval_df[actual])*100, %)其中mape(predictions, actuals)即 utils.py 中的同名函数def mape(predictions, actuals): Mean absolute percentage error return ((predictions - actuals).abs() / actuals).mean()课程在 energy 数据上得到的参考结果是单步预测 MAPE ≈0.557%多步预测 MAPE ≈1.146%。MAPE 数值越小越好——可以粗浅理解为“MAPE 为 10 表示预测平均偏了 10%”。最后把红色“实际值”曲线与蓝色、随预测步长变淡变细的“预测值”曲线叠绘肉眼核对模型贴合度为“全新数据集”构建新 ARIMA 的五步通用方案理解了参考流水线后把它泛化到作业所需的新数据上。以下每个阶段都对应 notebook 中应出现的一个注释小节可直接套用。1. 选择并导入新数据统一时间索引作业建议的数据源Duke 大学时间序列数据集合集不在仓库内需自行下载因此导入代码必须按数据实际格式改写。可沿用的原则是load_data这类工具期望 CSV 内含时间列并希望将其设为索引、按固定频率重排以暴露缺失时间片。若新数据是月度或季度粒度示例中freqH、季节周期24必须相应替换为MS/QS与对应周期数。建议在 notebook 首个注释单元中写明数据来源、时间范围、采样频率、是否单变量/含缺失这正是评分表“注释清楚”的体现。2. 时间上严格“前训后测”地切分无论新数据粒度如何都要保证test_start_dt晚于训练区间并将训练起始日与测试起始日写成变量。切分后用课程同款并置绘图确认“训练/测试在时间上不重叠”可直接套用前文train、test的过滤代码。3. 审视平稳性并说明差分新数据很可能非平稳。可在 notebook 里先绘制原始序列观察趋势与季节周期必要时给出差分解释这与d、D阶数的设定直接相关。对明显的季节周期把季节差分与seasonal_order的设定一并写进注释。4. 确定(p,d,q)与季节参数声明并拟合模型先手工设定一组合适候选可从较小的阶数如(2,1,0)起步再用课程示范的SARIMAXfit()流程验证如需自动化搜索可参考课程正文提到的auto_arima()。务必在注释中记录你尝试过哪些组合、为何保留最终组合、results.summary()给出的拟合统计如何支撑该选择。5. 滚动预测、反缩放、MAPE 与可视化收尾复用 walk-forward 循环与eval_df构造逻辑forecast(stepsHORIZON)得到多步预测scaler.inverse_transform还原量纲最后输出单步与多步两个 MAPE 数值并绘图。把 MAPE 结果作为一个醒目结论句写进 notebook例如“本模型在验证期单步 MAPE 为 x%”这正是评分表“给出精度”的落点。把工作“注释化”决定优秀档与合格档的分水岭按评分表未注释或含 bug 的 notebook 只能评为“合格”可见注释本身就是作业的核心交付物。一份优秀 notebook 应做到每个代码单元前有一个 Markdown 单元回答“这步在做什么、为什么这样做、结果说明什么”可视化出现在数据探索、切分、缩放分布、滚动预测对比等每个关键节点模型构建处说明所选order/seasonal_order的考量结尾明确给出 MAPE 数值与一句结论。仓库中 7-TimeSeries/2-ARIMA/solution/notebook.ipynb译本见 translations/bg/7-TimeSeries/2-ARIMA/solution/notebook.ipynb是上述完整流程的“完成态”示例可作为注释风格与代码组织的直接参照。MAPE 之外评估的局限与课后挑战MAPE 直观、无量纲、便于跨场景比较但它的分母是真实值actual当真实值接近 0 时误差会被急剧放大因此并不适合所有数据。这也是为什么课程在课后挑战中要求进一步研究时间序列精度的其他检验方式如 MAD、MSD 等并把调研结果注记在 notebook 中——你在新模型的作业里可以顺带补充 12 个对比指标及其结果作为对“精度评估”的加分说明。提交前的自查清单对照评分表做最终检查数据确实是“新的”——与课程 energy.csv 无关的另一组时间序列训练/测试严格按时间先后切分代码中无未来信息泄漏缩放器只对训练集fit每个代码块前都有解释性 Markdown 注释无 bug、可从头到尾运行可视化齐备数据曲线、切分图、缩放分布图、预测 vs 实际对比图明确打印/陈述 MAPE 数值单步与多步notebook 结论段落总结模型结构、参数选择理由与最终精度。完成以上六项即可对齐评分表“优秀”档一份注释完整、经过测试、配可视化解释且精度明确的新 ARIMA 模型 notebook。仓库内相关文件速查用途路径作业原文保加利亚语关联文档translations/bg/7-TimeSeries/2-ARIMA/assignment.md作业原文英文7-TimeSeries/2-ARIMA/assignment.mdARIMA 课程正文7-TimeSeries/2-ARIMA/README.md课程 working notebook7-TimeSeries/2-ARIMA/working/notebook.ipynb完成态示例 notebook7-TimeSeries/2-ARIMA/solution/notebook.ipynb数据装载与 MAPE 工具common/utils.py示例数据 energy.csv7-TimeSeries/data/energy.csv前序课时时间序列与数据准备7-TimeSeries/1-Introduction/README.md【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表