本项目对应 2026年专硕机器学习课程项目:用过去 90 天的多变量时间序列预测未来总有功功率 global_active_power,分别完成未来 90 天短期预测和未来 365 天长期预测。短期和长期模型会分别训练,满足作业要求。
- 数据任务:分钟级家庭用电数据需要先按天汇总。
- 预测目标:预测未来每天的
global_active_power曲线。 - 输入窗口:过去 90 天。
- 输出窗口:未来 90 天和未来 365 天两种任务,模型参数不能共用。
- 模型方法:
- LSTM
- Transformer
- 自提出改进模型,本项目实现
CNNTransformer:一维卷积提取局部用电模式,再接 Transformer 编码长期依赖。
- 评估指标:MSE 和 MAE。
- 实验次数:每个任务、每个模型至少 5 轮实验,并报告平均值与标准差。
- 报告内容:问题介绍、模型、结果与分析、讨论;需要预测曲线和 Ground Truth 曲线对比图。
- UCI 家庭用电数据集: Individual household electric power consumption
- 法国月度基础气候数据: Donnees climatologiques de base mensuelles
- 窗口、步长、样本构造参考: 参考 1 参考 2 参考 3
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.csv 和 test.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_power、global_reactive_power、sub_metering_1、sub_metering_2、sub_metering_3:按天求和voltage、global_intensity:按天求平均RR、NBJRR1、NBJRR5、NBJRR10、NBJBROU:取当天第一个有效值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:0、cuda:1 或 cpu:
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_dim试64/128/192,层数试1/2,dropout 试0.1/0.2。 - Transformer:
d_model试64/96/128,层数试1/2/3,head 需整除d_model,例如d_model=128,nhead=4/8。 - CNNTransformer:优先试
kernel_size=3/5/7,d_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、MAEmetrics_summary.csv:每个模型、每个预测长度的均值和标准差metrics_baselines.csv:朴素基线结果,包括 persistence 和 train_meanplots/*.png:预测曲线与 Ground Truth 对比图,可直接放入报告截图configs.json:本次实验主要参数