电力需求预测挑战赛笔记 Task2 Datawhale AI 夏令营

#AI夏令营 #Datawhale #夏令营

Task1文章链接: 

电力需求预测挑战赛笔记 Taks1 跑通baseline-CSDN博客文章浏览阅读577次,点赞5次,收藏9次。电力需求预测挑战赛;【训练时序预测模型助力电力需求预测】https://blog.csdn.net/qq_23311271/article/details/140356873

进阶lightgbm,开始特征工程

导入模块

!pip install lightgbm
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_squared_log_error, mean_absolute_error
import tqdm
import sys
import os
import gc
import argparse
import warnings
warnings.filterwarnings('ignore')

读取数据 

train = pd.read_csv('data/data283931/train.csv')
test = pd.read_csv('data/data283931/test.csv')

查看数据情况 

赛题数据由训练集和测试集组成,为了保证比赛的公平性,将每日日期进行脱敏,用 1-N 进行标识,即 1 为数据集最近一天,其中 1-10 为测试集数据。

数据集由字段 id(房屋 id)、 dt(日标识)、type(房屋类型)、target(实际电力消耗)组成。

特征字段字段描述
id房屋 id
dt日标识
type房屋类型
target实际电力消耗,预测目标

查看训练集数据

train

输出如下:

iddttypetarget
000037f39cf11244.050
100037f39cf12250.672
200037f39cf13239.042
300037f39cf14235.900
400037f39cf15253.888
...............
2877300fff81139a7502528.552
2877301fff81139a7503522.818
2877302fff81139a7504521.282
2877303fff81139a7505522.021
2877304fff81139a7506518.145

2877305 rows × 4 columns

分析不同id对于target的影响

import matplotlib.pyplot as plt
import pandas as pd# 使用groupby函数按'id'列对训练数据进行分组,并计算'target'列的平均值
# reset_index()函数将分组后的结果转换为DataFrame,方便后续绘图使用
type_target_df = train.groupby('id')['target'].mean().reset_index()# 设置图形的大小为8x4英寸
plt.figure(figsize=(8, 4))# 由于'id'列是类别型数据,不适合直接作为柱状图的x轴
# 实际上,如果'id'的数量很多,应该选择一个子集或者使用其他可视化方法
# 这里为了示例,我们假设只有两个'id':'blue_id'和'green_id'
# 对应的颜色分别为蓝色和绿色
ids = type_target_df['id'].head(10)  # 假设只选择前10个'id'
colors = ['blue', 'green']
plt.bar(ids, type_target_df[type_target_df['id'].isin(ids)]['target'], color=colors)# 设置x轴的标签为'id'
plt.xlabel('id')# 设置y轴的标签为'Average Target Value'
plt.ylabel('Average Target Value')# 设置图表的标题为'Bar Chart of Target by id'
plt.title('Bar Chart of Target by id')# 显示图表
plt.show()

 

import matplotlib.pyplot as plt
# 不同id类型对应target的柱状图
type_target_df = train.groupby('id')['target'].mean().reset_index()
plt.figure(figsize=(8, 4))
plt.bar(type_target_df['id'], type_target_df['target'], color=['blue', 'green'])
plt.xlabel('id')
plt.ylabel('Average Target Value')
plt.title('Bar Chart of Target by id')
plt.show()

根据id分组target值的平均值的分布

import matplotlib.pyplot as plt
import pandas as pd# 使用groupby函数按'id'列对训练数据进行分组,并计算'target'列的平均值
# reset_index()函数将分组后的结果转换为DataFrame,方便后续绘图使用
type_target_df = train.groupby('id')['target'].mean().reset_index()# 定义target值的区间
bins = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
labels = [f'{bins[i]}-{bins[i+1]}' for i in range(len(bins)-1)]# 将target值分配到对应的区间
type_target_df['target_range'] = pd.cut(type_target_df['target'], bins=bins, labels=labels, right=False)# 对区间进行分组,并计算每个区间的id数量
range_counts = type_target_df.groupby('target_range')['id'].count().reset_index()# 设置图形的大小为8x4英寸
plt.figure(figsize=(8, 4))# 绘制柱状图,'range_counts['target_range']'表示x轴的类别,'range_counts['id']'表示y轴的数值
# color参数设置柱状图的颜色,这里使用蓝色
plt.bar(range_counts['target_range'], range_counts['id'], color='blue')# 设置x轴的标签为'Target Range'
plt.xlabel('Target Range')# 设置y轴的标签为'Number of ids'
plt.ylabel('Number of ids')# 设置图表的标题为'Bar Chart of Number of ids by Target Range'
plt.title('Bar Chart of Number of ids by Target Range')# 显示图表
plt.show()

 

分析不同type对于target的影响

首先对训练数据按type列进行分组,并计算每个组target列的平均值。然后,使用matplotlib库绘制了一个柱状图,展示了不同type对应的target平均值

import matplotlib.pyplot as plt# 使用groupby函数按'type'列对训练数据进行分组,并计算'target'列的平均值 CSDN@优雅的造轮狮
# reset_index()函数将分组后的结果转换为DataFrame,方便后续绘图使用
type_target_df = train.groupby('type')['target'].mean().reset_index()# 设置图形的大小为8x4英寸
plt.figure(figsize=(8, 4))# 绘制柱状图,'type_target_df['type']'表示x轴的类别,'type_target_df['target']'表示y轴的数值
# color参数设置柱状图的颜色,这里分别为蓝色和绿色
plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])# 设置x轴的标签为'Type'
plt.xlabel('Type')# 设置y轴的标签为'Average Target Value'
plt.ylabel('Average Target Value')# 设置图表的标题为'Bar Chart of Target by Type'
plt.title('Bar Chart of Target by Type')# 显示图表
plt.show()

 输出结果:

# 从训练数据中筛选出'id'等于'fff81139a7'的行
specific_id_df = train[train['id'] == 'fff81139a7']
#specific_id_df = train[train['id'] == '00037f39cf']
# 设置图形的大小为10x5英寸
plt.figure(figsize=(10, 5))# 绘制线图,'specific_id_df['dt']'表示x轴的时间戳,'specific_id_df['target']'表示y轴的目标值
# marker参数设置数据点的标记样式为圆形,linestyle参数设置线条样式为实线 CSDN@优雅的造轮狮
plt.plot(specific_id_df['dt'], specific_id_df['target'], marker='o', linestyle='-')# 设置x轴的标签为'DateTime'
plt.xlabel('DateTime')# 设置y轴的标签为'Target Value'
plt.ylabel('Target Value')# 设置图表的标题为"Line Chart of Target for ID 'fff81139a7'"
plt.title("Line Chart of Target for ID 'fff81139a7'")# 显示图表
plt.show()

 

 target值的分布情况

import matplotlib.pyplot as plt
import pandas as pd# 使用value_counts函数统计'target'列的每个唯一值的数量
target_counts = train['target'].value_counts().reset_index()
target_counts.columns = ['Target Value', 'Count']# 设置图形的大小为8x4英寸
plt.figure(figsize=(8, 4))# 绘制柱状图,'target_counts['Target Value']'表示x轴的类别,'target_counts['Count']'表示y轴的数值
# color参数设置柱状图的颜色,这里使用蓝色
plt.bar(target_counts['Target Value'], target_counts['Count'], color='blue')# 设置x轴的标签为'Target Value'
plt.xlabel('Target Value')# 设置y轴的标签为'Count'
plt.ylabel('Count')# 设置图表的标题为'Bar Chart of Target Value Counts'
plt.title('Bar Chart of Target Value Counts')# 显示图表
plt.show()

 

特征工程

进行历史平移特征和窗口统计特征(即最后三个历史平移目标的平均值)

import pandas as pd# 将测试数据和训练数据合并
# 并沿着行的方向(axis=0)合并
# 忽略原有的索引(ignore_index=True)
# 这样可以创建一个包含测试数据和训练数据的单一DataFrame
data = pd.concat([test, train], axis=0, ignore_index=True)# 按照'id'和'dt'列进行降序排序,并重置索引(reset_index(drop=True))
# 这样可以确保数据按照特定的顺序排列,方便后续处理 CSDN@优雅的造轮狮
data = data.sort_values(['id', 'dt'], ascending=False).reset_index(drop=True)# 创建历史平移特征
# 对于每个i值从10到29,创建一个新的列,该列包含每个'id'组中'target'值的i步滞后
for i in range(10, 30):data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)# 创建窗口统计特征
# 计算最后三个历史平移目标的平均值,并存储在新的列'win3_mean_target'中
data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3# 切分数据为训练集和测试集
# 选择'target'列非空的数据作为训练集,并重置索引
train = data[data.target.notnull()].reset_index(drop=True)
# 选择'target'列空的数据作为测试集,并重置索引
test = data[data.target.isnull()].reset_index(drop=True)# 确定输入特征
# 选择除了'id'和'target'之外的所有列作为训练特征
train_cols = [f for f in data.columns if f not in ['id', 'target']]

训练模型 

使用lgbm训练模型

from lightgbm.callback import log_evaluationdef 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],callbacks=[log_evaluation(period=100)])# model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], #   categorical_feature=[])# callbacks=[early_stopping.early_stopping(500), log_evaluation.log_evaluation(period=50)]# 验证集和测试集结果预测 CSDN@优雅的造轮狮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)

经过数据进行历史平移特征和窗口统计特征(即最后三个历史平移目标的平均值)后分数有了明显提升

TIPS:

MSE是均方误差(Mean Squared Error)的缩写,是用于衡量模型预测值与真实值之间差异的指标。它计算了预测值与真实值之间差异的平方,并对所有样本求平均。 MSE越小,表示模型的预测结果与真实值之间的差异越小。它常用于回归问题中,一般情况下取值范围为0到正无穷。

1返回分数261.34182024-07-16_20-42-09.csv1gszwJaV2024-07-16 20:44:13

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3248995.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】二叉树———Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

如何走出低能量状态?

晚上好。 每个人都难免会有状态不佳的时候。可能是遭受压力&#xff0c;可能是事情不顺&#xff0c;也可能无缘无故、突然就陷入情绪的低谷之中。 这时&#xff0c;我们很容易感到精力不济&#xff0c;无精打采&#xff0c;明明有许多事情要做和想做&#xff0c;但总是提不起精…

JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)

3.3 入门程序解析 关于web开发的基础知识&#xff0c;我们可以告一段落了。下面呢&#xff0c;我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例&#xff0c;是基于Spring官方提供的骨架实现的。 Sprin…

DevExpress WPF中文教程 - 为项目添加GridControl并将其绑定到数据

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

springboot+vue+mybatis销售评价系统+PPT+论文+讲解+售后

随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;销售评价系统当然也不能排除在外。销售评价系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采用Java…

Three.js 实战【2】—— 船模型海上场景渲染

停止了好久没有更新three这方面的文章了&#xff0c;从上两年还是vue2&#xff0c;一下子都换到vue3了&#xff0c;下面这些three都是基于vue3来进行开发的哈&#xff0c;先看一下这篇文章实现的效果哈。其中关于模型什么的资源都放在Git上了 初始化场景 安装three就直接通过n…

GuLi商城-商品服务-API-品牌管理-品牌分类关联与级联更新

先配置mybatis分页&#xff1a; 品牌管理增加模糊查询&#xff1a; 品牌管理关联分类&#xff1a; 一个品牌可以有多个分类 一个分类也可以有多个品牌 多对多的关系&#xff0c;用中间表 涉及的类&#xff1a; 方法都比较简单&#xff0c;就不贴代码了

000007 - HDFS DataNode

HDFS DataNode 1. DataNode工作机制2. DataNode的数据完整性3. 掉线时限参数设置 1. DataNode工作机制 &#xff08;1&#xff09;一个数据块在 DataNode 上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度…

【C++】类与对象的学习(中)

目录 一、默认成员函数&#xff1a; 二、构造函数&#xff1a; 1、定义&#xff1a; 2、理解&#xff1a; 三、析构函数&#xff1a; 1、定义&#xff1a; 2、理解&#xff1a; 四、拷贝构造&#xff1a; 1、定义&#xff1a; 2、理解&#xff1a; 五、运算符的重载&…

夏令营入门组day5

目录 一. 城市距离 二. 史莱姆 一. 城市距离 &#xff08;1&#xff09;思路 每次询问&#xff0c;对于每一个点都判断与下一个点是否为临近点会超时&#xff0c;因此预处理&#xff0c;预先判断每一个点的临近点&#xff0c;然后将花费存入前缀和数组&#xff0c;这样在每次询…

对redis进行深入学习

目录 1. 什么是redis&#xff1f;1.1 为什么使用redis作为缓存&#xff1f;1.1.0 数据库&#xff08;MySQL&#xff09;与 redis1. 存储介质不同&#xff08;408选手应该都懂hh&#xff09;2. 数据结构优化3. I/O模型差异4. CPU缓存友好性5. 单线程与多线程差异6. 持久化与缓存…

哈尔滨网站建设注意哪些问题

在进行哈尔滨网站建设时&#xff0c;需要注意以下几个问题&#xff1a; 首先&#xff0c;要明确网站的定位和目标。网站建设的首要任务是明确网站的定位和目标&#xff0c;确定网站所要传达的信息和服务内容&#xff0c;以及面向的目标用户群体。哈尔滨作为一个具有浓厚地域特色…

Linux脚本:如何编写bash脚本统计多个相关进程的CPU占用率,以此统计系统中指定多进程的总的CPU使用率

目录 一、需求 二、分析 三、脚本示例 1、创建脚本 2、编写脚本 3、脚本编写注意事项 &#xff08;1&#xff09;CPU占用率列 &#xff08;2&#xff09;多进程实例 &#xff08;3&#xff09;权限 四、运行脚本 1、给予脚本可执行权限 2、运行脚本 五、优化脚本 …

linux live555编译以及rtsp服务器搭建

一、live555源码 下载&#xff1a;点击跳转 二、编译 1、往文件 config.linux里的 COMPILE_OPTS 添加以下两个参数 -DNO_STD_LIB 和 -DNO_OPENSSL1 &#xff0c;修改后如下&#xff1a; COMPILE_OPTS $(INCLUDES) -I/usr/local/include -I. -O2 -DNO_STD_LIB -DNO_OPENSS…

大数减法c++

这里写目录标题 key key 检查减数和被减数的大小&#xff0c;大的放前&#xff0c;小的放后确定结果是正数&#xff0c;还是负数&#xff0c;即符号位从低位开始减如果a[i]<b[i]&#xff0c;则向高位借1当10&#xff0c;a[i1]–;a[i]10 #include <iostream> #include…

【python】OpenCV—Coordinates Sorted Clockwise

文章目录 1、需求介绍2、算法实现3、完整代码 1、需求介绍 调用 opencv 库&#xff0c;绘制轮廓的矩形边框&#xff0c;坐标顺序为右下→左下→左上→右上&#xff0c;我们实现一下转化为熟悉的 左上→右上→右下→左下 形式 按照这样的顺序组织边界框坐标是执行透视转换或匹…

采用反相正基准电压电路的反相运算放大器(运放)

采用反相正基准电压电路的反相运算放大器(运放) 采用反相正基准电压电路的同相运算放大器&#xff08;运放&#xff09; 设计目标 输入ViMin输入ViMax输出VoMin输出VoMax电源电压Vcc电源电压Vee电源电压Vref-5V-1V0.05V3.3V5V0V5V 设计说明1 此设计使用具有反相正基准的反…

gite+picgo+typora打造个人免费笔记软件

文章目录 1️⃣个人笔记软件2️⃣ 配置教程2.1 使用软件2.2 node 环境配置2.3 软件安装2.4 gite仓库设置2.5 配置picgo2.6 测试检验2.7 github教程 &#x1f3a1; 完结撒花 1️⃣个人笔记软件 最近换了环境&#xff0c;没有之前的生产环境舒适&#xff0c;写笔记也没有劲头&…

盒须图boxplot 展示第6条线

正常情况下,盒须图是有5条线的,但是实际产品场景是需要6条线,看了下echarts官网,没看到可配置的地方,只能自己骚操作了,效果图如下: 重点:用两条x轴,第6条线挂在第二条x轴上,且第二条x轴不展示。 option = {...,xAxis: [{type: category,data: [Class1, Class2, Cl…

Web前端网页设计与制作(想起来哪里写哪里版)

本文技术栈基于HtmlCssJavaScript制作web页面以及功能实现的部分设计与展示&#xff0c;实际的网站开发会涉及更多的细节&#xff0c;包括但不限于用户认证、数据库存储、前端框架的使用、响应式设计、安全性措施等。 废话不说&#xff0c;直接看源码 1.index 首页&#xff1a…