简介这份资源是面向电气电子类竞赛参赛者与毕业设计学生的电力AI项目源码包围绕“大航杯·智造扬中”电力AI大赛主题聚焦电力系统智能化场景下的算法设计与工程实现。包内共18个文件以Python脚本为核心涵盖数据切分、特征提取、模型构建与可视化等模块另含CSV数据表、XML配置、Shell运行脚本、PNG特征重要性图及README说明压缩包约835KB结构紧凑、便于按流程复现。目前已有44人学习下载适合具备一定Python与机器学习基础、希望参考完整赛题方案与代码组织方式的读者。通过阅读源码可了解电力预测任务中数据处理、特征工程与模型训练的具体落地思路并借鉴其目录划分与脚本编排方式为自身竞赛作品或毕业设计提供可复用的实现参考。1. 电力AI大赛里的负荷预测从赛题数据到可交付模型电力AI大赛的赛题十有八九绕不开负荷预测和异常用电识别这两类。大航杯“智造扬中”这类赛事给的往往是某区域台区或专变的历史用电数据要求你预测未来一段时间的负荷曲线或者把窃电、计量故障这类异常样本挑出来。很多队伍拿到数据第一反应是上模型结果在特征工程和评估口径上翻车。这篇笔记按我打电赛的实际路径走一遍先搞清楚赛题数据长什么样再搭一个能跑通的基线然后逐项调参最后把踩过的坑摊开讲。适合正在准备电赛控制类或电源题之外、想切入电力AI方向的本科生和研电赛选手。2. 赛题数据到手先做三件事读表、对齐、画图2.1 电力负荷数据的典型结构与读取方式电力AI大赛给的数据常见格式是 CSV 或 Excel字段一般包括用户编号、采集时间、有功功率、无功功率、电压、电流有的还会给台区编号和电表倍率。时间粒度从 15 分钟到 1 小时不等。第一步不是建模是把数据读进来确认三件事时间列是不是标准 datetime、有没有重复采集点、缺失值占比多少。import pandas as pd import numpy as np # 读取赛题数据注意编码电力数据常见 gbk 或 utf-8-sig df pd.read_csv(load_data.csv, encodinggbk, parse_dates[采集时间]) # 确认时间列、排序、去重 df df.sort_values([用户编号, 采集时间]).drop_duplicates( subset[用户编号, 采集时间], keepfirst ) # 查看缺失情况 missing_ratio df.isnull().mean().sort_values(ascendingFalse) print(missing_ratio[missing_ratio 0]) # 统一时间粒度重采样到 1 小时 df df.set_index(采集时间).groupby(用户编号).resample(1H)[有功功率].mean().reset_index()这段代码做了四件事按用户和时间排序、去掉重复采集点、统计缺失比例、把不规则时间粒度统一到 1 小时。参数上encoding要根据实际文件调整读错了会直接报 UnicodeDecodeErrorresample(1H)里的 H 表示小时如果赛题是 15 分钟粒度就改成15T。缺失值先别急着填画完图再决定用前向填充还是插值。2.2 负荷曲线的可视化与异常点初筛电力数据有个特点正常负荷曲线有很强的日周期和周周期异常点往往表现为毛刺、长时间恒定值或负值。画图是最快的初筛手段。我一般按用户抽 5 到 10 个样本画一周的曲线叠在一起看。import matplotlib.pyplot as plt # 抽一个用户看一周曲线 sample_user df[df[用户编号] df[用户编号].iloc[0]] week_data sample_user[ (sample_user[采集时间] 2023-06-01) (sample_user[采集时间] 2023-06-08) ] plt.figure(figsize(14, 4)) plt.plot(week_data[采集时间], week_data[有功功率], linewidth0.8) plt.title(一周负荷曲线) plt.xlabel(时间) plt.ylabel(有功功率(kW)) plt.grid(alpha0.3) plt.tight_layout() plt.show() # 统计负值和恒定值 neg_count (sample_user[有功功率] 0).sum() constant_ratio (sample_user[有功功率].diff() 0).mean() print(f负值点数: {neg_count}, 连续恒定比例: {constant_ratio:.2%})逻辑说明先按时间窗口切片画出原始曲线再统计负值点数和连续恒定值比例。负值在负荷数据里通常意味着计量方向接反或数据回传错误连续恒定超过 6 个点大概率是采集终端死机。参数上时间窗口按赛题覆盖范围调整diff() 0判断的是相邻点是否相等。这一步做完你心里对数据质量就有底了后面填缺失和剔异常才有依据。3. 从零搭一个负荷预测基线特征、模型、评估3.1 时间特征与滞后特征的构造方法负荷预测的精度七成靠特征。电力负荷的核心特征是时间特征和滞后特征。时间特征包括小时、星期、是否节假日滞后特征包括前 1 小时、前 24 小时、前 168 小时的负荷值。构造时要注意滞后特征不能引入未来信息否则评估会虚高。def build_features(data, target_col有功功率): data data.copy() data[hour] data[采集时间].dt.hour data[dayofweek] data[采集时间].dt.dayofweek data[is_weekend] (data[dayofweek] 5).astype(int) # 滞后特征shift 保证只用历史信息 data[lag_1h] data[target_col].shift(1) data[lag_24h] data[target_col].shift(24) data[lag_168h] data[target_col].shift(168) # 滑动统计特征 data[rolling_mean_24h] data[target_col].shift(1).rolling(24).mean() data[rolling_std_24h] data[target_col].shift(1).rolling(24).std() return data.dropna() featured df.groupby(用户编号, group_keysFalse).apply(build_features) print(featured.columns.tolist())逻辑说明shift(1)表示取前一个时间点的值shift(24)取前一天同一时刻shift(168)取上周同一时刻。滑动统计先 shift 再 rolling避免把当前时刻的真实值算进特征。参数上24 对应小时粒度的一天如果赛题是 15 分钟粒度一天就是 96 个点所有滞后步长要乘以 4。这一步是负荷预测里最容易出错的地方血泪经验忘了 shift 直接 rolling线下评估能到 0.99线上直接崩。3.2 用 LightGBM 跑通第一版预测并看评估指标基线模型我一般选 LightGBM原因是训练快、对缺失和异常值不敏感、特征重要性可解释。电力AI大赛的评分口径常见是 MAPE 或 RMSE赛题会明确。先按时间切分训练集和验证集不要随机切分否则时间序列的泄漏会让评估失真。import lightgbm as lgb from sklearn.metrics import mean_absolute_percentage_error, mean_squared_error # 按时间切分前 80% 训练后 20% 验证 split_idx int(len(featured) * 0.8) train featured.iloc[:split_idx] valid featured.iloc[split_idx:] feature_cols [hour, dayofweek, is_weekend, lag_1h, lag_24h, lag_168h, rolling_mean_24h, rolling_std_24h] model lgb.LGBMRegressor( n_estimators500, learning_rate0.05, num_leaves31, min_child_samples20, subsample0.8, colsample_bytree0.8, random_state42 ) model.fit(train[feature_cols], train[有功功率]) pred model.predict(valid[feature_cols]) mape mean_absolute_percentage_error(valid[有功功率], pred) rmse mean_squared_error(valid[有功功率], pred, squaredFalse) print(fMAPE: {mape:.4f}, RMSE: {rmse:.2f})逻辑说明按时间顺序切分前 80% 做训练后 20% 做验证这是时间序列任务的基本纪律。LightGBM 参数里n_estimators是树的数量learning_rate控制每棵树的贡献num_leaves决定单棵树复杂度。电力负荷数据量通常不大num_leaves别超过 63否则容易过拟合。评估时 MAPE 对低负荷时段敏感如果赛题评分是 MAPE低负荷时段的预测要格外小心分母小误差会被放大。3.3 特征重要性排序与二次调参方向第一版跑完先看特征重要性再决定往哪个方向调。LightGBM 自带feature_importances_也可以画图看。import pandas as pd importance pd.DataFrame({ feature: feature_cols, importance: model.feature_importances_ }).sort_values(importance, ascendingFalse) print(importance) # 如果 lag_24h 和 lag_168h 排前二说明日周期和周周期是主导 # 下一步可以加节假日特征、温度特征如果赛题给了气象数据逻辑说明特征重要性告诉你模型在依赖什么。如果lag_24h和lag_168h排前二说明日周期和周周期是主导因素下一步可以加节假日标记、温度特征。如果rolling_std_24h重要性高说明负荷波动性对预测有贡献可以考虑加更多窗口的统计量。调参顺序建议先加特征再调num_leaves和min_child_samples最后微调learning_rate和n_estimators。别一上来就网格搜索电力数据量小容易过拟合验证集。4. 避坑与排查电力AI大赛里最容易翻车的五个点4.1 时间泄漏线下 0.99线上 0.6现象本地验证 MAPE 极低提交后分数差一大截。原因构造特征时用了未来信息比如 rolling 没 shift或者随机切分导致验证集和训练集时间重叠。解决所有滞后和滑动特征先 shift 再计算切分严格按时间顺序验证集必须在训练集之后。4.2 缺失值填充方式选错现象模型在缺失率高的用户上预测全偏。原因直接用了全局均值填充忽略了不同用户的负荷量级差异。解决按用户分组填充优先用前向填充加线性插值实在缺得多的用户考虑单独建模或剔除。4.3 MAPE 在低负荷时段爆炸现象整体 MAPE 看着还行但夜间时段误差极大。原因MAPE 分母是真实值夜间负荷接近零时分母极小微小绝对误差被放大。解决如果赛题评分是 MAPE对低负荷时段做平滑处理或者改用 SMAPE如果评分是 RMSE就不用管这个。4.4 异常值没处理直接进模型现象训练 loss 震荡预测曲线出现不合理的尖峰。原因计量故障导致的负值、极大值直接进了训练集。解决按 3σ 或 IQR 做异常检测把超出合理范围的负荷值替换为 NaN 再插值或者用树模型对异常值的鲁棒性硬扛但特征统计量要排除异常点。4.5 多用户建模时忘了分组现象把所有用户数据混在一起训练预测精度上不去。原因不同用户的负荷量级和模式差异大混在一起模型学不到个体特征。解决按用户编号分组构造特征或者把用户编号做 target encoding再或者对每个用户单独训一个轻量模型。5. 进阶技巧用残差修正和分组策略把 MAPE 再压两个点基线跑通之后想再往上提分我一般从两个方向入手残差修正和分组策略。残差修正的思路是先用 LightGBM 预测一版把预测值和真实值的差作为新目标再训一个模型去拟合残差最后把两个模型的输出相加。这个方法在电力负荷预测里很实用因为主模型已经抓住了日周期和周周期残差模型可以专注修正节假日和突变天气带来的偏差。# 残差修正用第一版模型的残差训练第二个模型 train[residual] train[有功功率] - model.predict(train[feature_cols]) valid[residual] valid[有功功率] - model.predict(valid[feature_cols]) residual_model lgb.LGBMRegressor( n_estimators200, learning_rate0.03, num_leaves15, min_child_samples30, random_state42 ) residual_model.fit(train[feature_cols], train[residual]) final_pred model.predict(valid[feature_cols]) residual_model.predict(valid[feature_cols]) final_mape mean_absolute_percentage_error(valid[有功功率], final_pred) print(f修正后 MAPE: {final_mape:.4f})逻辑说明残差模型的学习率要设小树的数量也别太多否则会把噪声也拟合进去。num_leaves控制在 15 左右min_child_samples设大一点防止残差模型过拟合。参数上如果第一版 MAPE 已经很低残差修正的提升空间有限别硬上。分组策略是另一个提分点。如果赛题覆盖多个台区或用户类型按负荷模式聚类后再分组建模往往比全局一个模型效果好。我一般用 KMeans 对每个用户的日负荷曲线做聚类分成 3 到 5 组每组单独训一个模型。聚类特征可以用一天 24 个点的归一化负荷值聚类数用肘部法确定。from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler # 构造每个用户的日负荷曲线矩阵 user_profiles df.pivot_table( index用户编号, columnsdf[采集时间].dt.hour, values有功功率, aggfuncmean ).dropna() scaler StandardScaler() profiles_scaled scaler.fit_transform(user_profiles) kmeans KMeans(n_clusters4, random_state42, n_init10) user_profiles[cluster] kmeans.fit_predict(profiles_scaled) print(user_profiles[cluster].value_counts())逻辑说明pivot_table把每个用户的小时平均负荷拉成一行 24 列StandardScaler做归一化消除量级差异KMeans 聚成 4 类。聚类数不是越多越好4 到 5 类在电力用户里通常够用太多会导致每类样本不足。分完组后把 cluster 标签作为特征加回主模型或者按 cluster 分别建模看验证集效果决定。最后说一个我自己的习惯每次提交前把验证集按小时、按星期几拆开看误差分布别只看一个总分。电力AI大赛的评分往往对某些时段更敏感找到误差最大的时段针对性补特征比盲目调参有效得多。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
PCB定向耦合器设计避坑指南:从波导原理到HFSS实操 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:01:40
FPGA上构建支持IPv6的MicroBlaze+lwIP HTTP服务器 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:01:40
动态扭矩传感器选型与实操避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:01:40
从0到1搭建个性化推荐系统:架构、召回、精排与冷启动全解析 1. 从一个猜想的验证说起我第一次认真琢磨个性化推荐系统,是因为一个特别朴素的问题:我盯着购物App首页那排"猜你喜欢"看了十分钟,发现它推的东西居然真的是我最近想买但还没搜过的。那一刻我意识到,推荐系统不是简单的… · 2026/9/25 4:11:56
Apereo CAS 基于 LDAP 的代理认证(Surrogate Authentication)存储配置指南 后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 导读
代理认证(Surrogate Authentication,又… · 2026/9/25 4:11:56
RocketRide local_text_output 节点详解:把管道文本可靠写入本地文件系统的设计与实现 【免费下载链接】rocketride-server High-performance AI pipeline engine with a C core and 50 Python-extensible nodes. Build, debug, and scale LLM workflows with 13 model providers, 8 vector databases, and agent orchestration, all from your IDE. Includes VS C… · 2026/9/25 4:11:56
开源AI开放学堂:30天打造免费AI学习与工具聚合平台 这个世界太魔幻了。我见过太多人囤了一堆AI课程,结果发现内容还不如官方文档写得清楚;也见过不少团队靠卖“AI赚钱秘籍”月入百万,但学员连Prompt都不会写。所以当我自己花了30天,和三个朋友一起爆肝开源了一个网站,把… · 2026/9/25 4:11:56
highlight.io 全栈可观测性搜索查询语法完全指南:表达式、键值、通配符、正则与逻辑组合 可观测性后端 【免费下载链接】highlight highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more. 项目地址: https://gitcode.com/gh_mirrors/hi/highlight 点击查看 免费下… · 2026/9/25 4:11:56
日志信息== 从完整堆栈可以看出,问题出在 Desugar(脱糖)过程中:
核心问题:DesugaringGraphs.forVariant() 在处理 Java 8 特性降级时,需要 ASM7 支持
触发位置:DexArchiveBuilderTask 执行 DEX 构建时&… · 2026/9/25 4:11:50
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37