Skip to content

Bl1nding/power_forecasting_project

Repository files navigation

Household Power Forecasting Project

本项目对应 2026年专硕机器学习课程项目:用过去 90 天的多变量时间序列预测未来总有功功率 global_active_power,分别完成未来 90 天短期预测和未来 365 天长期预测。短期和长期模型会分别训练,满足作业要求。

作业要求整理

  • 数据任务:分钟级家庭用电数据需要先按天汇总。
  • 预测目标:预测未来每天的 global_active_power 曲线。
  • 输入窗口:过去 90 天。
  • 输出窗口:未来 90 天和未来 365 天两种任务,模型参数不能共用。
  • 模型方法:
    • LSTM
    • Transformer
    • 自提出改进模型,本项目实现 CNNTransformer:一维卷积提取局部用电模式,再接 Transformer 编码长期依赖。
  • 评估指标:MSE 和 MAE。
  • 实验次数:每个任务、每个模型至少 5 轮实验,并报告平均值与标准差。
  • 报告内容:问题介绍、模型、结果与分析、讨论;需要预测曲线和 Ground Truth 曲线对比图。

数据集和参考资料链接

目录结构

power_forecasting_project/
  data/
    raw/                 # 放 UCI 用电数据和可选气候数据
  outputs/               # 训练结果、图像和日志输出
  src/power_forecasting/
    data.py              # 读取、清洗、按天聚合、窗口构造
    models.py            # LSTM、Transformer、CNNTransformer
    training.py          # 训练、评估、反归一化、作图
    run_experiments.py   # 主入口:五轮实验和结果汇总
  scripts/
    setup_env.sh         # 使用 conda 创建环境并安装依赖
    smoke_test.sh        # 快速检查训练流程
    train_eval.sh        # 服务器训练评测脚本
  environment.yml        # conda 环境配置
  pyproject.toml
  requirements.txt
  README.md

数据准备

本项目默认使用你下载的 UCI 原始数据 household_power_consumption.txt,然后按时间顺序自动切分训练集和测试集。程序也兼容老师若额外提供的 train.csvtest.csv

推荐放置方式:

power_forecasting_project/data/raw/household_power_consumption.txt
power_forecasting_project/data/raw/MENSQ_92_previous-1950-2024.csv.gz

程序支持 UCI 原始列名,也支持已经合并了天气字段的 CSV。天气字段会按作业要求处理:

  • global_active_powerglobal_reactive_powersub_metering_1sub_metering_2sub_metering_3:按天求和
  • voltageglobal_intensity:按天求平均
  • RRNBJRR1NBJRR5NBJRR10NBJBROU:取当天第一个有效值
  • sub_metering_remainder:按分钟公式计算后再按天求和

气候数据怎么用

PDF 中的气候数据是外部输入特征,不是预测目标。UCI 用电数据来自法国 Sceaux 附近,所以项目默认推荐使用 Hauts-de-Seine 省编号 92 的月度气候文件:

MENSQ_92_previous-1950-2024.csv.gz

气候文件是月度粒度,程序会按年月把气候统计量合并到每天的用电数据。例如 2009 年 3 月的降水和温度统计值,会作为 2009-03-01 到 2009-03-31 每一天的额外输入变量。默认经纬度为 Sceaux 附近,程序会自动选择该日期范围内有有效数据的最近气象站;当前数据会选到 92032001 FONTENAY - CEN

当前会自动使用这些可用气候字段:

weather_rr, weather_nbjrr1, weather_nbjrr5, weather_nbjrr10,
weather_tx, weather_tn, weather_tm, weather_etp

部分字段如 NBJBROU 在所选站点或日期范围内可能为空,程序会自动丢弃全空天气特征。

安装依赖

推荐环境:Conda + Python 3.11 + PyTorch 2.x。

推荐直接使用脚本创建 conda 环境并安装当前项目:

cd /Users/smk/Desktop/期末/机器学习/power_forecasting_project
bash scripts/setup_env.sh
conda activate power-forecasting

也可以用 environment.yml 手动创建或更新环境:

conda env create -f environment.yml
conda activate power-forecasting

若环境已经存在:

conda env update -f environment.yml --prune
conda activate power-forecasting

如果安装 PyTorch 较慢或 CUDA 版本需要定制,可以根据自己的系统到 PyTorch 官网 选择对应 conda 命令。

如需重新下载 UCI 数据:

PYTHONPATH=src python -m power_forecasting.download_dataset

这个命令会同时下载 UCI 用电数据和 92 号气候数据;如果只想下载用电数据,添加 --skip-weather

服务器运行脚本

创建环境并安装依赖:

bash scripts/setup_env.sh
conda activate power-forecasting

快速检查流程:

bash scripts/smoke_test.sh cpu
bash scripts/smoke_test.sh 0

正式训练评测,参数可以是 GPU 编号、cuda:0cuda:1cpu

bash scripts/train_eval.sh 0
bash scripts/train_eval.sh cuda:1
bash scripts/train_eval.sh cpu

常用覆盖参数:

EPOCHS=100 RUNS=5 BATCH_SIZE=64 bash scripts/train_eval.sh 0
MODELS="lstm transformer" HORIZONS="90" bash scripts/train_eval.sh cuda:1
OUTPUT_DIR=outputs/exp_weather_gpu0 bash scripts/train_eval.sh 0
VAL_RATIO=0.15 PATIENCE=12 bash scripts/train_eval.sh 0
LSTM_HIDDEN_DIM=128 LSTM_LAYERS=2 DROPOUT=0.2 bash scripts/train_eval.sh 0
D_MODEL=128 NHEAD=4 TRANSFORMER_LAYERS=2 DIM_FEEDFORWARD=256 bash scripts/train_eval.sh 0
CNN_KERNEL_SIZE=7 D_MODEL=128 NHEAD=8 TRANSFORMER_LAYERS=3 bash scripts/train_eval.sh 0

脚本默认读取:

data/raw/household_power_consumption.txt
data/raw/MENSQ_92_previous-1950-2024.csv.gz

如需指定其他数据文件:

DATA_CSV=/path/to/household_power_consumption.txt \
WEATHER_CSV=/path/to/MENSQ_92_previous-1950-2024.csv.gz \
bash scripts/train_eval.sh 0

模型结构调优

这个数据集日级样本不多,训练窗口约数百个,因此模型不宜盲目加深。推荐先调 90 天任务,用较少轮数筛选结构,再对候选结构跑 90 天和 365 天的 5 轮正式实验。

一键调参:

bash scripts/tune_models.sh 0

默认会尝试 9 组结构,结果汇总在:

outputs/tuning_cuda_0/tuning_summary.csv

常用调参命令:

RUNS=2 EPOCHS=60 HORIZONS="90" bash scripts/tune_models.sh 0
RUNS=3 EPOCHS=80 HORIZONS="90 365" BASE_OUTPUT=outputs/tuning_final bash scripts/tune_models.sh 0

建议搜索范围:

  • LSTM:hidden_dim64/128/192,层数试 1/2,dropout 试 0.1/0.2
  • Transformer:d_model64/96/128,层数试 1/2/3,head 需整除 d_model,例如 d_model=128,nhead=4/8
  • CNNTransformer:优先试 kernel_size=3/5/7d_model=96/128,层数 2/3
  • 如果模型仍不优于 baseline,优先降低复杂度或增加 dropout,而不是继续加层。

快速检查代码

没有真实 CSV 时,可以用合成数据快速跑通完整流程:

PYTHONPATH=src python -m power_forecasting.run_experiments --demo --epochs 2 --runs 1 --horizons 90

正式运行实验

默认会自动读取 data/raw/household_power_consumption.txt,按时间顺序切分,并对 LSTM、Transformer、CNNTransformer 分别跑 90 天和 365 天任务,每个组合 5 轮:

PYTHONPATH=src python -m power_forecasting.run_experiments --epochs 80 --runs 5 --horizons 90 365

加入气候外部特征的正式实验命令:

PYTHONPATH=src python -m power_forecasting.run_experiments \
  --weather-csv data/raw/MENSQ_92_previous-1950-2024.csv.gz \
  --device cuda:0 \
  --epochs 80 \
  --runs 5 \
  --val-ratio 0.15 \
  --patience 12 \
  --horizons 90 365

如果你想指定单文件,也可以显式传入:

PYTHONPATH=src python -m power_forecasting.run_experiments \
  --data-csv data/raw/household_power_consumption.txt \
  --weather-csv data/raw/MENSQ_92_previous-1950-2024.csv.gz \
  --epochs 5 \
  --runs 1 \
  --horizons 90 365

输出结果

结果保存在 outputs/

  • metrics_runs.csv:每一轮实验的 MSE、MAE
  • metrics_summary.csv:每个模型、每个预测长度的均值和标准差
  • metrics_baselines.csv:朴素基线结果,包括 persistence 和 train_mean
  • plots/*.png:预测曲线与 Ground Truth 对比图,可直接放入报告截图
  • configs.json:本次实验主要参数

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors