【机器学习实战】电力需求预测挑战赛 Datawhale AI 夏令营 task2
【机器学习实战】电力需求预测挑战赛 Datawhale AI 夏令营 task2
- 一、赛题背景
- 二、赛题任务
- 三、评审规则
- 四、具体实践
- 4.1 实现的思路
- 4.2 理论介绍
- GBDT
- LightGBM
- 4.3 代码的实现与运行
- 4.3.1 导入模块
- 4.3.2 探索性数据分析(EDA)
- 4.3.3 特征工程
- 4.3.4 模型训练与测试集预测
一、赛题背景
随着全球经济的快速发展和城市化进程的加速,电力系统面临着越来越大的挑战。电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。
然而,电力需求受到多种因素的影响,为了提高电力需求预测的准确性和可靠性,推动智能电网和可持续能源系统的发展,本场以“电力需求预测”为赛题的数据算法挑战赛。选手需要根据历史数据构建有效的模型,能够准确的预测未来电力需求。
二、赛题任务
给定多个房屋对应电力消耗历史N天的相关序列数据等信息,预测房屋对应电力的消耗。
三、评审规则
1.数据说明
赛题数据由训练集和测试集组成,为了保证比赛的公平性,将每日日期进行脱敏,用 1 − N 1-N 1−N进行标识,即 1 1 1为数据集最近一天,其中 1 − 10 1-10 1−10为测试集数据。数据集由字段id(房屋id)、 dt(日标识)、type(房屋类型)、target(实际电力消耗)组成。
| 特征字段 | 字段描述 |
|---|---|
| id | 房屋id |
| dt | 日标识 |
| type | 房屋类型 |
| target | 实际电力消耗,预测目标 |
2.评审规则
预测结果以 mean square error 作为评判标准,具体公式如下:
1 n ∑ n = 1 n ( y i − y ^ i ) 2 \frac{1}{n}\sum_{n=1}^{n}(y_{i}-\hat y_{i})^{2} n1n=1∑n(yi−y^i)2
其中, y i y_{i} yi是真实电力消耗, y ^ i \hat y_{i} y^i是预测电力消耗。
四、具体实践
在task1中,我们使用了历史前10天的平均值,作为未来10天的预测值,最终的结果的是373.89846分,可以看到误差是相对比较大的,这次任务呢,我们尝试使用一个经典的机器学习模型来预测未来十天的电力预测。
4.1 实现的思路
Task1 的baseline我们是基于经验模型(使用均值作为结果数据)来解决的问题
Task2 版本教程将使用机器学习模型解决本次问题,模型使用简单,数据不需要过多预处理;
使用机器学习方法一般主要需要从** 获取数据&增强**、特征提取和模型 三个方面下手
4.2 理论介绍
GBDT
GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。
GBDT不仅在工业界应用广泛,通常被用于多分类、点击率预测、搜索排序等任务;在各种数据挖掘竞赛中也是致命武器,据统计Kaggle上的比赛有一半以上的冠军方案都是基于GBDT。
LightGBM
LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。
LightGBM 框架中还包括随机森林和逻辑回归等模型。通常应用于二分类、多分类和排序等场景。
例如:在个性化商品推荐场景中,通常需要做点击预估模型。使用用户过往的行为(点击、曝光未点击、购买等)作为训练数据,来预测用户点击或购买的概率。根据用户行为和用户属性提取一些特征,包括:
- 类别特征(Categorical Feature):字符串类型,如性别(男/女)。
- 物品类型:服饰、玩具和电子等。
- 数值特征(Numrical Feature):整型或浮点型,如用户活跃度或商品价格等。
4.3 代码的实现与运行
4.3.1 导入模块
如下代码所示,是我们分析数据和导入模型使用的python模块,但是运行时,AI Studio并没有附带lightgbm的包,因此需要我们呢自己手动安装。
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_squared_log_error, mean_absolute_error, mean_squared_error
import tqdm
import sys
import os
import gc
import argparse
import warnings
warnings.filterwarnings('ignore')
因此,在运行上述代码块前,我们先使用pip 安装我们需要的lightgbm的包,如下图所示。
【注意】:这里有一个坑,就是教程给的代码没有使用lightgbm最新版本的包,因此,我选了最老的版本3.2.1,否则,后面我们在训练模型时,会报错,显示verbose_eval, early_stopping_rounds参数多余给出,这是因为最新版本的lightgbm在train这个函数内,并没有使用这两个参数。

4.3.2 探索性数据分析(EDA)
在数据准备阶段,主要读取训练数据和测试数据,并进行基本的数据展示。这一部分为导入我们需要的数据
train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')
这里给的代码有些问题,因为我们在AI Studio里,数据在data文件夹下多了一个子文件夹,如图所示,我们打开左侧的data文件。

可以看到这里还有一个子文件夹,因此,我们直接运行教程给的代码,会报错,显示找不到数据,因此,我们需要更改读取数据的路径。

如下代码块所示,这里注意,不同的用户,可能这里的data子文件后面的数字不同,读者在体验代码实战时,需要根据自己平台的文件名字修改。
train = pd.read_csv('./data/data283931/train.csv')
test = pd.read_csv('./data/data283931/test.csv')
这里我们并没有显示如图所示的文件细节,事实上,该图显示的是train数据的打印,我们可以在代码后写一行train,就可以默认输出train训练集了。

运行的结果,如图所示,下面的2877305表示数据的行数,4代表列数。

但是可以看到中间省略了很多的数据,第6行(行号为5)的数据被省略了,因为我们的训练集行数太多了,但是如果我们想要看到前10行的数据怎么办呢?可以使用head属性,修改代码为train.head(10), 这里的10就代表显示前10行。修改后的如图所示。

数据简单介绍:
- 其中id为房屋id,
- dt为日标识,训练数据dt最小为11,不同id对应序列长度不同;
- type为房屋类型,通常而言不同类型的房屋整体消耗存在比较大的差异;
- target为实际电力消耗,也是我们的本次比赛的预测目标。
下面进行简单的可视化分析,帮助我们对数据有个简单的了解。
- 不同type类型对应target的柱状图
这里可以看到,代码将不同类型的数据使用groupby聚合起来求平均值,然后使用房屋类型作为横坐标,计算的均值所谓纵坐标,绘制了相应的柱状图。
import matplotlib.pyplot as plt
# 不同type类型对应target的柱状图
type_target_df = train.groupby('type')['target'].mean().reset_index()
plt.figure(figsize=(8, 4))
plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])
plt.xlabel('Type')
plt.ylabel('Average Target Value')
plt.title('Bar Chart of Target by Type')
plt.show()
运行的结果如图所示:

- id为00037f39cf的按dt为序列关于target的折线图
这里将第一个房子的历史用电量作了一个折线图,id为00037f39cf是第一个房子的编号。可以看到数据的波动是比较大的,但是波动整体有一定的周期规律。
specific_id_df = train[train['id'] == '00037f39cf']
plt.figure(figsize=(10, 5))
plt.plot(specific_id_df['dt'], specific_id_df['target'], marker='o', linestyle='-')
plt.xlabel('DateTime')
plt.ylabel('Target Value')
plt.title("Line Chart of Target for ID '00037f39cf'")
plt.show()

4.3.3 特征工程
这里主要构建了 历史平移特征 和 窗口统计特征;每种特征都是有理可据的,具体说明如下:
- 历史平移特征:通过历史平移获取上个阶段的信息;如下图所示,可以将d-1时间的信息给到d时间,d时间信息给到d+1时间,这样就实现了平移一个单位的特征构建。

- 窗口统计特征:窗口统计可以构建不同的窗口大小,然后基于窗口范围进统计均值、最大值、最小值、中位数、方差的信息,可以反映最近阶段数据的变化情况。如下图所示,可以将d时刻之前的三个时间单位的信息进行统计构建特征给我d时刻。

实现的代码如下:
# 合并训练数据和测试数据,并进行排序
data = pd.concat([test, train], axis=0, ignore_index=True)
data = data.sort_values(['id','dt'], ascending=False).reset_index(drop=True)# 历史平移
for i in range(10,30):data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)# 窗口统计
data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3# 进行数据切分
train = data[data.target.notnull()].reset_index(drop=True)
test = data[data.target.isnull()].reset_index(drop=True)# 确定输入特征
train_cols = [f for f in data.columns if f not in ['id','target']]
4.3.4 模型训练与测试集预测
这里选择使用Lightgbm模型,也是通常作为数据挖掘比赛的基线模型,在不需要过程调参的情况的也能得到比较稳定的分数。
另外需要注意的训练集和验证集的构建:因为数据存在时序关系,所以需要严格按照时序进行切分,
- 这里选择原始给出训练数据集中dt为30之后的数据作为训练数据,之前的数据作为验证数据,
- 这样保证了数据不存在穿越问题(不使用未来数据预测历史数据)。
def time_model(lgb, train_df, test_df, cols):# 训练集和验证集切分trn_x, trn_y = train_df[train_df.dt>=31][cols], train_df[train_df.dt>=31]['target']val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']# 构建模型输入数据train_matrix = lgb.Dataset(trn_x, label=trn_y)valid_matrix = lgb.Dataset(val_x, label=val_y)# lightgbm参数lgb_params = {'boosting_type': 'gbdt','objective': 'regression','metric': 'mse','min_child_weight': 5,'num_leaves': 2 ** 5,'lambda_l2': 10,'feature_fraction': 0.8,'bagging_fraction': 0.8,'bagging_freq': 4,'learning_rate': 0.05,'seed': 2024,'nthread' : 16,'verbose' : -1,}# 训练模型model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)# 验证集和测试集结果预测val_pred = model.predict(val_x, num_iteration=model.best_iteration)test_pred = model.predict(test_df[cols], num_iteration=model.best_iteration)# 离线分数评估score = mean_squared_error(val_pred, val_y)print(score)return val_pred, test_predlgb_oof, lgb_test = time_model(lgb, train, test, train_cols)# 保存结果文件到本地
test['target'] = lgb_test
test[['id','dt','target']].to_csv('submit.csv', index=None)
运行的结果如图所示,

我们将生成的submit.csv文件在平台提交测试,如图所示,可以看到相比于之前,提升了很多,因为我们是分数越小说明,与真实值的误差越小。

相关文章:
【机器学习实战】电力需求预测挑战赛 Datawhale AI 夏令营 task2
【机器学习实战】电力需求预测挑战赛 Datawhale AI 夏令营 task2 一、赛题背景二、赛题任务三、评审规则四、具体实践4.1 实现的思路4.2 理论介绍GBDTLightGBM 4.3 代码的实现与运行4.3.1 导入模块4.3.2 探索性数据分析(EDA)4.3.3 特征工程4.3.4 模型训练…...
【设计模式】【创建型模式】【02工厂模式】
系列文章 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 系…...
FPGA设计中的流水线 -分割大的计算电路可以更快的处理数据。
FPGA(现场可编程门阵列)设计中的流水线优化是一种提高设计性能的技术,它通过将设计分解为多个阶段或步骤来实现。每个阶段可以并行执行,从而提高整体的吞吐量和效率。以下是流水线优化的一些关键概念和作用: 意思&…...
GNU/Linux - U-BOOT的GPIO command
在嵌入式Linux开发中,先运行的是u-boot,然后再加载Linux内核。 启动时如果设置了u-boot等待时间,在等待时间内,按任意键就会进入u-boot命令行环境。 在u-boot命令行环境下,可以使用gpio命令来操作GPIO。 Synopsis gpi…...
35.UART(通用异步收发传输器)-RS232(2)
(1)RS232接收模块visio框图: (2)接收模块Verilog代码编写: /* 常见波特率: 4800、9600、14400、115200 在系统时钟为50MHz时,对应计数为: (1/4800) * 10^9 /20 -1 10416 …...
OpenLayers学习笔记-点位聚合
需求 用户点击行政区划等操作后,从后台获取区域内的点位数据,在地图上聚合显示。用户手动取消聚合,点位直接渲染在地图上。 实现过程 使用后台返回的点位数据,通过new ol.source.Vector({features})创建矢量数据源。使用new ol.source.Cluster({source})创建聚合标注数据…...
flutter实现语言的国际化
目录 前言 一、GetX实现国际化(推荐) 1.安装Getx 2.创建国际化的文件 3.使用国际化字符串 4.配置GetMaterialApp 5.更改语言 6.系统语言 编辑 7.原生工程配置 1.iOS工程配 1.打开iOS工程,在Project的info里面添加语言 2.创建String File文件 2.andr…...
服务端正常启动了,但是客户端请求不到
服务端正常启动了,但是客户端请求不到有哪些原因?如何排查? 如果客户端请求的接口没有响应,排查的方式: 检查接口IP地址是否正确,ping一下接口地址。 检查被测接口端口号是否正确,可以在本机Telnet接口的IP和端口号…...
鸿蒙开发 -本地数据库操作
// 1导入模块 import relationalStore from @ohos.data.relationalStore;export class AthUserDbManager{//2.获取RdbStore实例,要注意的是,此处的getContext(this)用于获取应用上下文:getcreatDbtable(dbname:string){//配置数据库信息:const STORE_CONFIG :relationalStor…...
主机安全-进程、命令攻击与检测
目录 概述反弹shell原理nc/dev/xxx反弹shell下载不落地反弹Shell各种语言反弹shell linux提权sudosuid提权mysql提权 Dnslog参考 概述 本文更新通过在主机(不含容器)上直接执行命令或启动进程来攻击的场景。检测方面以字节跳动的开源HIDS elkeid举例。每…...
FPGA FIR fdatool filter designer MATLAB
位数问题 fdatool 先确定输入信号的位宽,比如17位在fdatool中,选set quantization parameters 选input/output 设置input word length 为17bit(not confirmed) fir compiler implementation 注意: 当设置输入位宽为16位时,ip核…...
水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)
水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集) 目录 水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 (1&#x…...
Windows 点云生成二维栅格图 [附C++完整代码实现]
点云压缩-2D栅格图 一、点云压缩(二维栅格图)二、算法流程三、代码实现四、结果可视化一、点云压缩(二维栅格图) 点云压缩:点云是海量点的集合,其数据量通常非常庞大。直接存储这些未经压缩的点云数据会消耗大量的存储空间,特别是在处理大规模的点云数据时,这个问题变得…...
SpringBoot结合ip2region实现博客评论显示IP属地
你好呀,我是小邹。 在现代的Web应用中,特别是博客和论坛类网站,为用户提供地理定位服务(如显示用户所在地理位置)可以极大地增强用户体验。本文将详细探讨如何使用Java和相关技术栈来实现在博客评论中显示用户的地址信…...
设计模式使用场景实现示例及优缺点(行为型模式——策略模式)
在遥远的王国里,有三个重要的角色:国王策略模式、他的皇家顾问算法家族,以及年轻的骑士接口。国王策略模式统治着整个王国,他的职责是确保每一个编程问题都能找到最合适的解决方案。 有一天,王国遇到了一场危机。编程王…...
ReactRouter v6升级的步骤
React Router v6 引入了一个 Routes 组件,它有点像 Switch ,但功能要强大得多。与 Switch 相比, Routes 的主要优势在于: <Routes> 中的所有 <Route> 和 <Link> 都是相对的。这导致在 <Route path> 和 &…...
【JVM实战篇】内存调优:内存问题诊断+案例实战
文章目录 诊断内存快照在内存溢出时生成内存快照MAT分析内存快照MAT内存泄漏检测的原理支配树介绍如何在不内存溢出情况下生成堆内存快照?MAT查看支配树MAT如何根据支配树发现内存泄漏 运行程序的内存快照导出和分析快照**大文件的处理** 案例实战案例1:…...
专业条码二维码扫描设备和手机二维码扫描软件的区别?
条码二维码技术已广泛应用于我们的日常生活中,从超市结账到公交出行,再到各类活动的入场验证,条码二维码的便捷性不言而喻,而在条码二维码的扫描识别读取过程中,专业扫描读取设备和手机二维码扫描软件成为了两大主要工…...
基于嵌入式Linux的高性能车载娱乐系统设计与实现 —— 融合Qt、FFmpeg和CAN总线技术
随着汽车智能化的发展,车载娱乐系统已成为现代汽车的标配。本文介绍了一个基于Linux的车载娱乐系统的设计与实现过程。该系统集成了音视频娱乐、导航、车辆信息显示等功能,旨在提供安全、便捷、丰富的驾驶体验。 1. 项目概述 随着汽车智能化的发展&…...
探索IP形象设计:快速掌握设计要点
随着市场竞争的加剧,越来越多的企业开始关注品牌形象的塑造和推广。在品牌形象中,知识产权形象设计是非常重要的方面。在智能和互联网的趋势下,未来的知识产权形象设计可能会更加关注数字和社交网络。通过数字技术和社交媒体平台,…...
ssm+java2026年毕设蔬果批发网络平台【源码+论文】
本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于农产品电商交易模式的研究,现有研究主要以综合电商平台(如淘宝、京东)的农产品销售模式…...
别再为UI动画发愁了!用Spine+Unity 2021制作丝滑2D动画的保姆级流程
SpineUnity 2021:打造专业级2D UI动画的完整实战指南 在独立游戏开发领域,UI动画的质量往往决定着玩家的第一印象。那些流畅的按钮反馈、生动的界面过渡,不仅提升了产品质感,更直接影响着用户的留存率。然而对于资源有限的中小团队…...
Qt实战:用QCustomPlot+QThread搞定工业级实时数据大屏(附缓存池模板)
Qt工业级实时数据大屏开发实战:QCustomPlot与QThread的高效协同 在工业自动化领域,数据可视化大屏已成为监控产线状态的核心工具。面对每秒数十万数据点的实时刷新需求,传统Qt绘图方案往往力不从心。本文将分享如何基于QCustomPlot和QThread构…...
告别手动点鼠标!用Python脚本批量跑Simulink仿真,效率提升10倍
告别手动点鼠标!用Python脚本批量跑Simulink仿真,效率提升10倍 在工程仿真领域,Simulink无疑是建模与分析的利器。但当面对参数扫描、蒙特卡洛分析或设计迭代等需要大量重复仿真的场景时,手动操作不仅效率低下,还容易…...
从零开始理解JVM内存模型:如何避免OOM错误的7个实用技巧
从零开始理解JVM内存模型:如何避免OOM错误的7个实用技巧 第一次在线上环境遇到OOM错误时,我盯着控制台那行刺眼的java.lang.OutOfMemoryError整整愣了三分钟。那是一个看似普通的周二下午,我们的订单处理系统突然开始拒绝服务,而监…...
终极B站界面美化指南:如何用BewlyBewly插件快速打造个性化体验
终极B站界面美化指南:如何用BewlyBewly插件快速打造个性化体验 【免费下载链接】BewlyBewly Just make a few small changes to your Bilibili homepage. (English | 简体中文 | 正體中文 | 廣東話) 项目地址: https://gitcode.com/gh_mirrors/be/BewlyBewly …...
博德之门3 Mod管理器:解决Mod加载顺序被重置的终极指南 [特殊字符]
博德之门3 Mod管理器:解决Mod加载顺序被重置的终极指南 🎮 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 如果你在使用BG3ModManager(博德之门3模组…...
Git子模块更新报错?手把手教你解决‘Unable to find origin/master revision‘问题
Git子模块更新报错深度解析:从原理到实战解决方案 1. 问题现象与核心原因分析 当你执行git submodule update --remote命令时,突然遇到fatal: Unable to find current origin/master revision in submodule path错误提示,这种场景在团队协作…...
pybind11进阶指南:如何高效封装C++类供Python调用(附常见问题解决方案)
pybind11进阶指南:如何高效封装C类供Python调用(附常见问题解决方案) 在当今高性能计算和科学计算领域,C与Python的结合已成为开发者工具箱中不可或缺的组合。C提供底层性能优势,而Python则以其简洁语法和丰富生态著称…...
Magma智能剪辑系统:视频自动生成实战
Magma智能剪辑系统:视频自动生成实战 1. 引言 想象一下这样的场景:你有一个精彩的视频创意,写好了详细的脚本,但面对一堆零散的素材片段却无从下手。传统的视频剪辑需要逐帧挑选、拼接、添加转场,一个几分钟的视频可…...
