ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

使用全新数据构建 SVR 时间序列预测模型:ML-For-Beginners 支撑向量回归扩展任务完整实战指南

使用全新数据构建 SVR 时间序列预测模型:ML-For-Beginners 支撑向量回归扩展任务完整实战指南 使用全新数据构建 SVR 时间序列预测模型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 / 3-SVR》的课后扩展任务assignment.md本仓库随附孟加拉语翻译版展开在已经掌握 SVR 建模流程的基础上用一套全新的时间序列数据重新构建 SVR 模型并在 notebook 中完成数据可视化、模型评估MAPE与超参数kernel、gamma、C、epsilon和 timesteps 的调优实验。读完本文你将掌握一套可直接复用的 SVR 时序建模工作流包括滑动时间窗构造、Min-Max 归一化、模型拟合与反归一化评估以及如何用网格试探法系统性寻找更优配置。任务是什么一节换个数据集再做一遍的巩固性作业这份 assignment 是整个课程第 7 单元第 3 课SVRSupport Vector Regressor的收官练习。它位于 7-TimeSeries/3-SVR/assignment.md原文在文本注解中明确说明其任务模板源于本单元第 2 课 ARIMA 的 assignment。该作业的本质是前提你已经跟随 3-SVR 课程正文 用 GEFCom 2014 能源负荷数据构建过一个 SVR 模型目标不要复用示例数据而是挑选一套新的时间序列数据集独立走完 数据加载 → 训练/测试划分 → 归一化 → 时间窗切分 → SVR 建模 → 反归一化 → 可视化 MAPE 评估 的完整链路附加实验分别调整 SVR 的关键超参数gamma、C、epsilon并尝试不同的timesteps取值观察并记录它们对预测精度的影响产出一份带注释的 notebook其中模型、可视化与精度结论并存作为可评分的交付物。因此这篇作业检验的不是会不会调包而是对 SVR 时序预测整个流程的独立理解数据为什么要这么切、窗口为什么要这么滑、归一化为什么在预测后要逆回去、MAPE 高低的含义是什么。下面先从课程参考实现入手把基线流程拆清楚再给出在新数据集上完成任务的行动清单。先回顾基线SVR 为什么适合时序预测从回归、SVM 到 SVR课程正文 README.md 用三个递进概念解释 SVR 的定位回归Regression监督学习的一种从一组输入预测连续值本质是在特征空间中拟合一条经过最多数据点的曲线或直线支持向量机SVM用于分类、回归和异常检测的监督模型在特征空间中表现为一个超平面——分类时它是决策边界回归时它是最佳拟合线。SVM 通常借助核函数将数据映射到更高维空间使其更容易被线性分离支持向量回归SVRSVM 家族中用于回归的成员目标是找到包含最多数据点的最佳拟合线超平面。何时该用 SVR 而不是 ARIMA同一课程单元中第 2 课介绍了 ARIMA 这一经典统计线性方法。课程指出很多时序数据天然存在非线性特征线性模型无法刻画而 SVM/SVR 由于能在回归中考虑数据非线性通过核函数因此在时序预测场景中往往表现更佳。这就是本节作业假设你已经理解的技术背景——当面对带明显周期与非线性波动的新数据集时SVR 是一个值得优先尝试的回归器。基线参考实现全拆解直接继承课程代码新作业要求你独立复现的流程正是 working/notebook.ipynb 中演示过的内容同目录 solution/notebook.ipynb 为完整参考答案。逐段拆解如下。第 0 步导入依赖与工具函数import sys sys.path.append(../../)import os import warnings import matplotlib.pyplot as plt import numpy as np import pandas as pd import datetime as dt import math from sklearn.svm import SVR from sklearn.preprocessing import MinMaxScaler from common.utils import load_data, mape注意最后一行from common.utils import load_data, mape——课程把公共函数收敛在 7-TimeSeries/common/utils.py。其中load_data(data_dir)utils.py读取energy.csv把timestamp列解析为日期并设为索引再以freqH逐小时对最小到最大时间戳做reindex用于暴露缺失时间段返回以时间为索引、只含load/temp等特征列的数据框。mape(predictions, actuals)utils.py实现平均绝对百分比误差其定义为(|predictions - actuals| / actuals).mean()。后续所有精度表述均出自该函数。第 1 步加载并整体可视化数据示例使用课程数据 7-TimeSeries/data/energy.csv约 2.6 万行逐小时记录含timestamp, load, temp三列load为待预测的能源负荷energy load_data(../../data)[[load]]energy.plot(yload, subplotsTrue, figsize(15, 8), fontsize12) plt.xlabel(timestamp, fontsize12) plt.ylabel(load, fontsize12) plt.show()这一步对应作业要求中的可视化你的数据在新数据集上第一件事永远是画出完整序列观察趋势、季节性、异常点与缺失情况。第 2 步按时间先后划分训练集与测试集课程特别强调了一个易被忽略的原则测试集在时间上必须晚于训练集。否则模型相当于偷看了未来属于数据泄漏/过拟合。参考实现的划分如下train_start_dt 2014-11-01 00:00:00 test_start_dt 2014-12-30 00:00:00energy[(energy.index test_start_dt) (energy.index train_start_dt)][[load]].rename(columns{load:train}) \ .join(energy[test_start_dt:][[load]].rename(columns{load:test}), howouter) \ .plot(y[train, test], figsize(15, 8), fontsize12) plt.xlabel(timestamp, fontsize12) plt.ylabel(load, fontsize12) plt.show()随后按时间段过滤出各自的load列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)即训练集含约 59 天逐小时样本测试集含最后 48 个逐小时样本。第 3 步归一化到 (0,1) 区间SVR 对特征尺度敏感必须统一量纲。参考实现使用MinMaxScaler默认将数据映射到 [0,1]scaler MinMaxScaler() train[load] scaler.fit_transform(train)test[load] scaler.transform(test)关键细节fit_transform只在训练集上执行一次fit测试集只用transform。原因是归一化的统计量min/max来自训练集分布若把测试集也纳入fit等于测试信息提前泄漏进预处理环节——这与时间先后划分遵循的是同一原则。完成评估、做逆变换时二者共用同一个scaler才能还原出真实量纲的预测值。第 4 步用滑动时间窗构造[样本, 时间步]张量SVR 的输入是二维张量形式为[batch, timesteps]。为了让模型看到历史序列而不是单个点需把一维序列重排成滑动窗口样本。课程取timesteps 5语义是用前 4 个时刻的值预测第 5 个时刻的值。# Converting to numpy arrays train_data train.values test_data test.valuestimesteps 5用嵌套列表推导构造窗口train_data_timesteps np.array([[j for j in train_data[i:itimesteps]] for i in range(0, len(train_data)-timesteps1)])[:,:,0] train_data_timesteps.shape # 输出 (1412, 5)1416 - 5 1 1412 个窗口test_data_timesteps np.array([[j for j in test_data[i:itimesteps]] for i in range(0, len(test_data)-timesteps1)])[:,:,0] test_data_timesteps.shape # 输出 (44, 5)48 - 5 1 44 个窗口随后把每个窗口的前timesteps-1列作为特征X、最后一列作为标签yx_train, y_train train_data_timesteps[:, :timesteps-1], train_data_timesteps[:, [timesteps-1]] x_test, y_test test_data_timesteps[:, :timesteps-1], test_data_timesteps[:, [timesteps-1]] print(x_train.shape, y_train.shape) # (1412, 4) (1412, 1) print(x_test.shape, y_test.shape) # (44, 4) (44, 1)体会这个形状变化原始 1416 个点被切成 1412 个长度为 5 的窗口每个窗口又拆成 4 个输入 1 个输出。timesteps就是你让模型回看多长历史的超参数这正是作业要求你反复调整它的原因——窗口太短看不到周期性太长则浪费数据并加剧边缘截断。第 5 步实例化 SVR 并拟合课程采用 RBF径向基核设置gamma0.5, C10, epsilon0.05model SVR(kernelrbf, gamma0.5, C10, epsilon0.05)model.fit(x_train, y_train[:, 0])拟合后打印出的完整参数集为SVR(C10, cache_size200, coef00.0, degree3, epsilon0.05, gamma0.5, kernelrbf, max_iter-1, shrinkingTrue, tol0.001, verboseFalse)流程上遵循三步定义模型传超参数→fit()拟合训练数据 →predict()预测。第 6 步预测并反归一化y_train_pred model.predict(x_train).reshape(-1,1) y_test_pred model.predict(x_test).reshape(-1,1) print(y_train_pred.shape, y_test_pred.shape) # (1412, 1) (44, 1)评估前先把预测值和真实值从 [0,1] 还原回原始量纲# Scaling the predictions y_train_pred scaler.inverse_transform(y_train_pred) y_test_pred scaler.inverse_transform(y_test_pred) # Scaling the original values y_train scaler.inverse_transform(y_train) y_test scaler.inverse_transform(y_test)还原时间戳时注意第一个输出的时间对应窗口末尾因此取原始时间轴的第timesteps-1个索引之后的部分train_timestamps energy[(energy.index test_start_dt) (energy.index train_start_dt)].index[timesteps-1:] test_timestamps energy[test_start_dt:].index[timesteps-1:] print(len(train_timestamps), len(test_timestamps)) # 1412 44第 7 步可视化 MAPE 评估训练集上绘制实际 vs 预测曲线并计算 MAPEplt.figure(figsize(25,6)) plt.plot(train_timestamps, y_train, colorred, linewidth2.0, alpha0.6) plt.plot(train_timestamps, y_train_pred, colorblue, linewidth0.8) plt.legend([Actual,Predicted]) plt.xlabel(Timestamp) plt.title(Training data prediction) plt.show()print(MAPE for training data: , mape(y_train_pred, y_train)*100, %) # MAPE for training data: 1.7195710200875551 %测试集上同样操作plt.figure(figsize(10,3)) plt.plot(test_timestamps, y_test, colorred, linewidth2.0, alpha0.6) plt.plot(test_timestamps, y_test_pred, colorblue, linewidth0.8) plt.legend([Actual,Predicted]) plt.xlabel(Timestamp) plt.show()print(MAPE for testing data: , mape(y_test_pred, y_test)*100, %) # MAPE for testing data: 1.2623790187854018 %参考实现还额外用全量数据回测整体表现对整个序列构造窗口26300 个→ 预测 → 反归一化 → 绘图 → 打印 MAPE约 2.057%。基线实验的结论是训练集 MAPE ≈ 1.72%、测试集 MAPE ≈ 1.26%、全量回测 ≈ 2.06%说明该配置下 SVR 预测精度相当不错。注意 MAPE 计算发生在反归一化之后量纲一致才是有效百分比。在新数据集上独立完成任务可执行的行动清单拿到作业后按下面五步推进即可覆盖全部要求。1. 选数据单变量、连续、长度适中的时序assignment 建议试试新的数据集。选型时把握三个可自检的条件单变量可预测目标SVR 基线流程只对单一连续列如负荷、销量、温度、水位做回归多列数据需自行扩展特征不建议作为首次作业时间等间隔连续参考流程基于逐小时索引若新数据按天/月采样需相应调整重采样口径load_data中的freqH是 energy 专属设定新数据要按自身频率处理见 utils.py样本量充足时间窗会截掉头尾timesteps-1个点数据过短会导致窗口样本稀少评估不稳定。2. 写清数据说明 划分理由作业评分看重解释性。在 notebook 中至少写清三件事数据来源与含义、采样频率、时间跨度训练/测试的时间切点是什么、为什么测试段在时间上晚于训练段防止未来信息泄漏为什么要归一化、为什么只对训练集fit缩放器、为什么要反归一化再算 MAPE。3. 完成可视化 建模 评估三段式把上文第 17 步完整迁移到新数据原始序列图 → 训练/测试分割图 → 训练/测试预测对比图红线实际、蓝线预测并分别在训练集与测试集上打印mape(...)*100得到的百分比。只有当预测曲线与真实曲线在图上肉眼可对齐、且 MAPE 数值合理时模型有效这一结论才成立。4. 做超参数实验kernel / gamma / C / epsilon课程的 Challenge 与作业的tweak the hyperparameters直接对应。推荐用固定控制变量的方式逐组试验每组都记录测试集 MAPE超参数含义与影响标准 SVR 语义试参建议kernel核函数类型决定非线性映射方式可选linear/poly/rbf/sigmoid至少对比rbf与linear观察非线性核是否有收益gamma影响单个训练样本的作用半径对 RBF 核尤为关键越大拟合越紧、越易过拟合越小曲线越平缓在0.01 / 0.1 / 0.5 / 1 / 10量级间扫C误差惩罚系数越大越不容忍训练误差易过拟合越小越强调模型平滑在1 / 10 / 100 / 1000量级间扫epsilonε-不敏感管的宽度管内的点不计误差越大对噪声越宽容、预测越平滑在0.01 / 0.05 / 0.1 / 0.5间扫参考实现的起点gamma0.5, C10, epsilon0.05在 energy 上表现良好换数据后最优组合大概率不同需要重扫。注意 C 与 epsilon 对 SVR 的训练时间也有影响数据集较大时可用小规模子集先快速探查再全量训练。5. 做timesteps实验改变回看历史的长度把窗口长度从 5 换成其他值例如 3、7、12、24需要同步注意三点窗口样本数变化n_windows n_samples - timesteps 1timesteps越大可用窗口越少输入/输出维度变化每个窗口被拆为timesteps-1个输入 1 个输出x的列数随之改变时间戳对齐变化输出时间从原时间轴的timesteps-1处开始对齐代码见上文第 6 步。对日/周周期明显的数据通常把timesteps设为接近一个周期如 24 小时或 7 天能显著提升精度这正是作业希望你通过实验发现的经验规律。逐组比较时请把结果整理成表例如timesteps12 时测试集 MAPE 从 x% 降到 y%。如何自查对照评分标准验收作业自带一份 Rubric 表原文翻译如下是唯一的验收标准标准优秀Exemplary合格Adequate需改进Needs Improvement综合提交的 notebook 完成了 SVR 模型的构建、测试与解释并配有可视化且注明了精度提交的 notebook 没有解释或存在错误bug提交的 notebook 不完整据此自查清单构建了代码能从头跑到尾fit与predict无报错测试了在训练集、测试集建议再补全量回测上都算了 MAPE 并给出结论性语句解释了每个关键代码块上方有注释/文字说明为什么这么做尤其是时间划分与归一化理由可视化了数据曲线与实际 vs 预测对比曲线齐全注明精度了MAPE 结果以百分比形式明确写出而非只有晦涩的输出。一句话验收标准随便拉一个没上过这课的人打开你的 notebook也能只凭文字与图表复述出整个建模逻辑——能就是 Exemplary。小结本次作业真正的技术要点可浓缩为一条完整链路原始序列 → 时间上严格后置的测试集划分 → 只对训练集拟合的 Min-Max 归一化 → 按timesteps滑窗构造[batch, timesteps]→ SVR(kernel/gamma/C/epsilon) 拟合与预测 → 反归一化 → 对齐时间戳绘图 → 用mape()量化精度 → 以测试集 MAPE 为准则系统性调参。仓库为你提供了三份可直接对照的参照物课程正文含全部代码、working 手写练习版 notebook、solution 参考答案 notebook公共实现load_data与mape在 7-TimeSeries/common/utils.py示例数据在 7-TimeSeries/data/energy.csv。照此把同一套方法论迁移到你的新数据集上并用上面的自查清单验收即可高质量完成本作业——同时真正掌握SVR 时间窗 网格调参这一可复用到大量单变量预测场景的通用技能。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表