资讯动态

电力消耗多步时间序列预测:递归法与直接法实战

发布时间:2026/10/28 13:25:16 来源:尧图企业网站定制
1. 电力消耗多步时间序列预测实战指南在智能电表和太阳能发电技术日益普及的今天电力消耗数据的获取变得前所未有的便捷。这些数据构成了一个多变量时间序列蕴含着预测未来电力消耗的关键信息。然而传统的机器学习算法通常只能预测单个值无法直接用于多步预测。本文将深入探讨两种有效的多步预测策略递归法和直接法并提供一个完整的实战框架。2. 项目概述与数据准备2.1 数据集介绍我们使用的家庭电力消耗数据集记录了2006年12月至2010年11月间单个家庭每分钟的用电情况。这个多变量时间序列包含七个关键指标总有功功率千瓦总无功功率千瓦平均电压伏特平均电流强度安培厨房用电量瓦时洗衣房用电量瓦时气候控制系统用电量瓦时重要提示原始数据中存在缺失值用?标记我们需要先进行数据清洗和预处理才能用于建模。2.2 数据清洗与转换数据清洗是时间序列分析的关键第一步。以下是完整的处理流程# 加载和清洗数据 from numpy import nan, isnan from pandas import read_csv def fill_missing(values): 用前一天同一时间的值填充缺失值 one_day 60 * 24 # 一天的分钟数 for row in range(values.shape[0]): for col in range(values.shape[1]): if isnan(values[row, col]): values[row, col] values[row - one_day, col] # 加载原始数据 dataset read_csv(household_power_consumption.txt, sep;, header0, low_memoryFalse, infer_datetime_formatTrue, parse_dates{datetime:[0,1]}, index_col[datetime]) # 处理缺失值 dataset.replace(?, nan, inplaceTrue) dataset dataset.astype(float32) fill_missing(dataset.values) # 计算剩余用电量 values dataset.values dataset[sub_metering_4] (values[:,0] * 1000 / 60) - (values[:,4] values[:,5] values[:,6]) # 保存清洗后的数据 dataset.to_csv(household_power_consumption.csv)2.3 数据重采样由于我们的目标是预测未来一周的每日总用电量我们需要将分钟级数据重采样为日级数据from pandas import read_csv # 加载清洗后的数据 dataset read_csv(household_power_consumption.csv, header0, infer_datetime_formatTrue, parse_dates[datetime], index_col[datetime]) # 按日重采样并求和 daily_data dataset.resample(D).sum() daily_data.to_csv(household_power_consumption_days.csv)3. 模型评估框架3.1 问题定义我们的核心预测任务是基于近期用电量数据预测未来一周的每日总用电量。这属于多变量多步时间序列预测问题。3.2 评估指标我们使用均方根误差(RMSE)作为评估指标原因如下与原始数据单位一致千瓦对较大误差更敏感能更好反映实际预测偏差行业标准指标便于结果比较评估函数实现from numpy import sqrt from sklearn.metrics import mean_squared_error def evaluate_forecasts(actual, predicted): 评估多步预测结果 scores [] # 计算每天的RMSE for i in range(actual.shape[1]): mse mean_squared_error(actual[:, i], predicted[:, i]) rmse sqrt(mse) scores.append(rmse) # 计算总体RMSE s sum((actual[row,col] - predicted[row,col])**2 for row in range(actual.shape[0]) for col in range(actual.shape[1])) overall_rmse sqrt(s / (actual.shape[0] * actual.shape[1])) return overall_rmse, scores3.3 数据划分我们将数据划分为训练集前三年和测试集最后一年并按标准周周日到周六组织from numpy import split, array def split_dataset(data): 划分训练集和测试集 # 前三年训练最后一年测试 train, test data[1:-328], data[-328:-6] # 重组为每周数据 train array(split(train, len(train)/7)) test array(split(test, len(test)/7)) return train, test3.4 前向验证策略我们采用前向验证walk-forward validation来评估模型性能这种方法更贴近实际应用场景允许模型利用最新可用数据提供更可靠的性能估计验证过程示意图[Week1] → 预测Week2 [Week1 Week2] → 预测Week3 [Week1Week2Week3] → 预测Week4 ...4. 递归多步预测方法4.1 递归预测原理递归方法通过将上一步的预测结果作为下一步的输入实现多步预测。其核心思想是用初始输入预测第一步将预测值加入输入序列用新序列预测下一步重复直到完成所有预测4.2 数据转换我们需要将周数据转换为适合监督学习的格式def to_series(data): 将多周数据转换为单变量序列 series [week[:, 0] for week in data] # 提取总有功功率 return array(series).flatten() def to_supervised(history, n_input): 将历史数据转换为监督学习格式 data to_series(history) X, y [], [] for i in range(len(data) - n_input): X.append(data[i:in_input]) y.append(data[in_input]) return array(X), array(y)4.3 预测流程实现完整的递归预测实现包括数据预处理管道模型训练递归预测from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler, MinMaxScaler def make_pipeline(model): 创建预处理和建模管道 steps [ (standardize, StandardScaler()), (normalize, MinMaxScaler()), (model, model) ] return Pipeline(stepssteps) def forecast(model, input_x, n_input): 递归多步预测 yhat_sequence [] input_data [x for x in input_x] for _ in range(7): # 预测未来7天 X array(input_data[-n_input:]).reshape(1, n_input) yhat model.predict(X)[0] yhat_sequence.append(yhat) input_data.append(yhat) return yhat_sequence def sklearn_predict(model, history, n_input): 训练模型并进行预测 train_x, train_y to_supervised(history, n_input) pipeline make_pipeline(model) pipeline.fit(train_x, train_y) return forecast(pipeline, train_x[-1, :], n_input)5. 直接多步预测方法5.1 直接预测原理与递归方法不同直接方法为每个预测时间步训练独立的模型为第t1天训练模型1为第t2天训练模型2...为第t7天训练模型7优势避免递归误差传播每个模型可以专门优化劣势需要训练更多模型计算成本更高5.2 数据准备直接方法需要不同的数据准备方式def to_supervised_direct(history, n_input, n_output7): 为直接方法准备数据 data to_series(history) X, y [], [] for i in range(len(data) - n_input - n_output 1): X.append(data[i:in_input]) y.append(data[in_input:in_inputn_output]) return array(X), array(y)5.3 模型训练与预测实现直接预测策略from sklearn.multioutput import MultiOutputRegressor def direct_predict(model, history, n_input): 直接多步预测 train_x, train_y to_supervised_direct(history, n_input) pipeline make_pipeline(MultiOutputRegressor(model)) pipeline.fit(train_x, train_y) # 使用最后n_input个观测值进行预测 last_obs train_x[-1, :].reshape(1, -1) return pipeline.predict(last_obs)[0]6. 模型评估与比较6.1 评估框架实现def evaluate_model(model, train, test, n_input, methodrecursive): 评估单一模型 history [x for x in train] predictions [] for i in range(len(test)): if method recursive: yhat sklearn_predict(model, history, n_input) else: yhat direct_predict(model, history, n_input) predictions.append(yhat) history.append(test[i, :]) predictions array(predictions) return evaluate_forecasts(test[:, :, 0], predictions) def summarize_scores(name, score, scores): 汇总评估结果 s_scores , .join([%.1f % s for s in scores]) print(%s: [%.3f] %s % (name, score, s_scores))6.2 模型选择与比较我们可以测试多种机器学习算法from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.svm import SVR # 测试不同模型 models { Linear Regression: LinearRegression(), Random Forest: RandomForestRegressor(n_estimators100), Support Vector: SVR() } n_input 14 # 使用两周数据作为输入 # 加载数据 dataset read_csv(household_power_consumption_days.csv, header0, infer_datetime_formatTrue, parse_dates[datetime], index_col[datetime]) train, test split_dataset(dataset.values) # 评估递归方法 print(Recursive Approach:) for name, model in models.items(): score, scores evaluate_model(model, train, test, n_input, recursive) summarize_scores(name, score, scores) # 评估直接方法 print(\nDirect Approach:) for name, model in models.items(): score, scores evaluate_model(model, train, test, n_input, direct) summarize_scores(name, score, scores)7. 实战经验与优化建议7.1 关键经验总结输入窗口大小选择太短缺乏足够历史信息太长引入噪声和冗余建议从2周开始通过实验确定最佳值特征工程技巧添加移动统计量均值、标准差包含周期性特征星期几、是否周末考虑天气等外部变量如有模型选择指南线性模型计算高效适合初步基准树模型自动特征选择非线性关系SVM小数据集表现好但计算成本高7.2 常见问题排查预测值偏离实际检查数据标准化是否正确验证输入窗口是否包含足够信息尝试添加更多历史数据预测结果过于平滑可能是模型过于简单尝试更复杂模型或添加特征检查是否过度平滑了输入数据评估指标不理想确保使用walk-forward验证检查数据是否有异常值尝试不同的误差指标对比7.3 性能优化方向超参数调优使用网格搜索或随机搜索重点关注输入窗口大小、模型复杂度集成方法结合递归和直接方法的优势使用模型堆叠stacking提升性能深度学习扩展LSTM网络处理序列依赖CNN提取局部时间模式注意力机制关注关键时间点8. 项目扩展与进阶应用8.1 多变量预测当前方案仅使用总有功功率。扩展方案可包括将其他变量作为额外输入特征预测多个变量多输出模型考虑变量间的相互影响8.2 实时预测系统将模型部署为实时服务定期用新数据重新训练实现自动化预测流水线开发可视化监控界面8.3 异常检测应用基于预测结果实现实时用电异常警报设备故障早期预警能效优化建议实际应用中发现将递归和直接方法结合使用如取平均值往往能获得比单一方法更好的预测效果。这种集成策略值得在实际项目中尝试。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑