Datawhale-新能源时间序列赛事学习笔记(1)

1.赛题描述

        在电动汽车充电站运营管理中,准确预测充电站的电量需求对于提高充电站运营服务水平和优化区域电网供给能力非常关键。本次赛题旨在建立站点充电量预测模型,根据充电站的相关信息和历史电量数据,准确预测未来某段时间内充电站的充电量需求。赛题数据中提供了电动汽车充电站的场站编号、位置信息、历史电量等基本信息。参赛者需要基于这些数据,利用人工智能相关技术,建立预测模型来预测未来一段时间内的需求电量,帮助管理者提高充电站的运营效益和服务水平,促进电动汽车行业的整体发展。

2.赛题任务

        根据赛题提供的电动汽车充电站多维度脱敏数据,构造合理特征及算法模型,预估站点未来一周每日的充电量。(以天为单位)

3.赛题数据集

        本赛题提供的数据集包含三张数据表。其中,power_forecast_history.csv 为站点运营数据,power.csv为站点充电量数据,stub_info.csv为站点静态数据,训练集为历史一年的数据,测试集为未来一周的数据。

数据集清单与格式说明:

注:

(1)h3编码是一种用于分层地理编码的系统,可以将地球划分为不同的六边形网格。选手可以尝试使用 h3 编码来构造与地理位置相关的额外特征。

(2)脱敏字段,不提供字段业务描述,供选手自由探索。

4.评估指标-RMSE

y_{i}为第个数据的真实值,y^{*}_{i}为第个数据的预测值,n为样本总数。

5.Baseline

5.1 导入库

import numpy as np
import pandas as pd
import lightgbm as lgb
import xgboost as xgb
from catboost import CatBoostRegressor
from sklearn.model_selection import StratifiedKFold, KFold, GroupKFold
from sklearn.metrics import mean_squared_error, mean_absolute_error
import matplotlib.pyplot as plt
import tqdm
import sys
import os
import gc
import argparse
import warnings
warnings.filterwarnings('ignore')

5.2 数据准备与探索

# 读取数据
train_power_forecast_history = pd.read_csv(r'F:\Jupyter Files\比赛\新能源赛道初赛数据集\初赛1008\训练集\power_forecast_history.csv')
train_power = pd.read_csv(r'F:\Jupyter Files\比赛\新能源赛道初赛数据集\初赛1008\训练集\power.csv')
train_stub_info = pd.read_csv('F:\Jupyter Files\比赛\新能源赛道初赛数据集\初赛1008\训练集\stub_info.csv')test_power_forecast_history = pd.read_csv(r'F:\Jupyter Files\比赛\新能源赛道初赛数据集\初赛1008\测试集\power_forecast_history.csv')
test_stub_info = pd.read_csv(r'F:\Jupyter Files\比赛\新能源赛道初赛数据集\初赛1008\测试集\stub_info.csv')# 聚合数据(按日期+场站编码分组后取每一组第一条数据)
train_df = train_power_forecast_history.groupby(['id_encode','ds']).head(1)
del train_df['hour']
test_df = test_power_forecast_history.groupby(['id_encode','ds']).head(1)
del test_df['hour']tmp_df = train_power.groupby(['id_encode','ds'])['power'].sum()
tmp_df.columns = ['id_encode','ds','power']# 合并充电量数据
train_df = train_df.merge(tmp_df, on=['id_encode','ds'], how='left')### 合并数据
train_df = train_df.merge(train_stub_info, on='id_encode', how='left')
test_df = test_df.merge(test_stub_info, on='id_encode', how='left')
# 定义要绘制的列
cols = ['power']# 遍历id_encode的五个值
for ie in [0,1,2,3,4]:# 获取train_df中id_encode为当前值ie的所有行,并重置索引tmp_df = train_df[train_df['id_encode']==ie].reset_index(drop=True)# 再次重置索引,并为新索引添加一个名为'index'的列tmp_df = tmp_df.reset_index(drop=True).reset_index()# 遍历要绘制的列for num, col in enumerate(cols):# 设置图的大小plt.figure(figsize=(20,10))# 创建子图,总共有4行1列,当前为第num+1个子图plt.subplot(4,1,num+1)# 绘制图形:x轴为'index',y轴为当前列的值plt.plot(tmp_df['index'],tmp_df[col])# 为当前子图设置标题,标题为当前列的名称plt.title(col)# 显示图形
plt.show()# 创建一个新的图,大小为20x5
plt.figure(figsize=(20,5))

5.3 特征工程

train_df['flag'] = train_df['flag'].map({'A':0,'B':1})
test_df['flag'] = test_df['flag'].map({'A':0,'B':1})def get_time_feature(df, col):df_copy = df.copy()prefix = col + "_"df_copy['new_'+col] = df_copy[col].astype(str)col = 'new_'+coldf_copy[col] = pd.to_datetime(df_copy[col], format='%Y%m%d')df_copy[prefix + 'year'] = df_copy[col].dt.yeardf_copy[prefix + 'month'] = df_copy[col].dt.monthdf_copy[prefix + 'day'] = df_copy[col].dt.day# df_copy[prefix + 'weekofyear'] = df_copy[col].dt.weekofyeardf_copy[prefix + 'dayofweek'] = df_copy[col].dt.dayofweekdf_copy[prefix + 'is_wknd'] = df_copy[col].dt.dayofweek // 6df_copy[prefix + 'quarter'] = df_copy[col].dt.quarterdf_copy[prefix + 'is_month_start'] = df_copy[col].dt.is_month_start.astype(int)df_copy[prefix + 'is_month_end'] = df_copy[col].dt.is_month_end.astype(int)del df_copy[col]return df_copy   train_df = get_time_feature(train_df, 'ds')
test_df = get_time_feature(test_df, 'ds')cols = [f for f in test_df.columns if f not in ['ds','power','h3']]

5.4 模型训练与验证

def cv_model(clf, train_x, train_y, test_x, clf_name, seed = 2023):'''clf:调用模型train_x:训练数据train_y:训练数据对应标签test_x:测试数据clf_name:选择使用模型名seed:随机种子'''folds = 5kf = KFold(n_splits=folds, shuffle=True, random_state=seed)oof = np.zeros(train_x.shape[0])test_predict = np.zeros(test_x.shape[0])cv_scores = []for i, (train_index, valid_index) in enumerate(kf.split(train_x, train_y)):print('************************************ {} ************************************'.format(str(i+1)))trn_x, trn_y, val_x, val_y = train_x.iloc[train_index], train_y[train_index], train_x.iloc[valid_index], train_y[valid_index]if clf_name == "lgb":train_matrix = clf.Dataset(trn_x, label=trn_y)valid_matrix = clf.Dataset(val_x, label=val_y)params = {'boosting_type': 'gbdt','objective': 'regression','metric': 'mae','min_child_weight': 6,'num_leaves': 2 ** 6,'lambda_l2': 10,'feature_fraction': 0.8,'bagging_fraction': 0.8,'bagging_freq': 4,'learning_rate': 0.1,'seed': 2023,'nthread' : 16,'verbose' : -1,}model = clf.train(params, train_matrix, 2000, valid_sets=[train_matrix, valid_matrix],categorical_feature=[], verbose_eval=200, early_stopping_rounds=100)val_pred = model.predict(val_x, num_iteration=model.best_iteration)test_pred = model.predict(test_x, num_iteration=model.best_iteration)if clf_name == "xgb":xgb_params = {'booster': 'gbtree', 'objective': 'reg:squarederror','eval_metric': 'mae','max_depth': 5,'lambda': 10,'subsample': 0.7,'colsample_bytree': 0.7,'colsample_bylevel': 0.7,'eta': 0.1,'tree_method': 'hist','seed': 520,'nthread': 16}train_matrix = clf.DMatrix(trn_x , label=trn_y)valid_matrix = clf.DMatrix(val_x , label=val_y)test_matrix = clf.DMatrix(test_x)watchlist = [(train_matrix, 'train'),(valid_matrix, 'eval')]model = clf.train(xgb_params, train_matrix, num_boost_round=2000, evals=watchlist, verbose_eval=200, early_stopping_rounds=100)val_pred  = model.predict(valid_matrix)test_pred = model.predict(test_matrix)if clf_name == "cat":params = {'learning_rate': 0.1, 'depth': 5, 'bootstrap_type':'Bernoulli','random_seed':2023,'od_type': 'Iter', 'od_wait': 100, 'random_seed': 11, 'allow_writing_files': False}model = clf(iterations=2000, **params)model.fit(trn_x, trn_y, eval_set=(val_x, val_y),metric_period=200,use_best_model=True, cat_features=[],verbose=1)val_pred  = model.predict(val_x)test_pred = model.predict(test_x)oof[valid_index] = val_predtest_predict += test_pred / kf.n_splitsscore = mean_absolute_error(val_y, val_pred)cv_scores.append(score)print(cv_scores)return oof, test_predict

◒LightGBM

lgb_oof, lgb_test = cv_model(lgb, train_df[cols], train_df['power'], test_df[cols])----------------------------------------------------------------------------------
#交叉验证分数
[266.7260370569527, 269.9232639345857, 265.154677843001, 265.21192193943574, 266.49163591068003]
test_df['power'] = lgb_test
test_df['power'] = test_df['power'].apply(lambda x: 0 if x<0 else x)
test_df[['id_encode','ds','power']].to_csv(r'F:\Jupyter Files\比赛\新能源赛道初赛数据集\初赛1008\result.csv', index=False)

线上分数:240.51261765759443

◒XGBoost

xgb_oof, xgb_test = cv_model(xgb, train_df[cols], train_df['power'], test_df[cols], 'xgb')------------------------------------------------------------------------------------
#交叉验证分数
[188.14222230685203, 189.79883333942658, 189.98780480651146, 188.90711501159402, 189.63885769696023]
test_df['power'] = xgb_test
test_df['power'] = test_df['power'].apply(lambda x: 0 if x<0 else x)
test_df[['id_encode','ds','power']].to_csv(r'F:\Jupyter Files\比赛\新能源赛道初赛数据集\初赛1008\xgb_result.csv', index=False)

线上分数:269.1201702406025

◒CatBoost

cat_oof, cat_test = cv_model(CatBoostRegressor, train_df[cols], train_df['power'], test_df[cols], 'cat')
---------------------------------------------------------------------------------
#交叉验证分数
[217.60469992799398, 221.48162281844884, 221.30109254841568, 220.89774625184162, 219.70713010328046]
test_df['power'] = cat_test
test_df['power'] = test_df['power'].apply(lambda x: 0 if x<0 else x)
test_df[['id_encode','ds','power']].to_csv(r'F:\Jupyter Files\比赛\新能源赛道初赛数据集\初赛1008\cat_result.csv', index=False)

线上分数:302.69904271933

6.总结

从线下结果来看,XGBoost>CatBoost>LightGBM,即XGBoost的效果最优;而从线上结果来看,LightGBM>XGBoost>CatBoost,即LightGBM的效果最优。因为不同模型结果相差较大,所以没有考虑对这三模型进行融合。接下来会更侧重对LightGBM和XGBoost进行调参,并做特征工程,争取有更好的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础20问(6-10)

6.Java接口和抽象类的区别&#xff1f; 不同点 1.接口在Java8之前不能写方法实现逻辑&#xff0c;Java8及以后的版本&#xff0c;可以用default关键字写方法的实现。 2.接口中方法都是public的&#xff0c;public可以省略&#xff0c;而抽象类没有这个限制。 3.接口用inter…

【MATLAB第79期】基于MATLAB的数据抽样合集(sobol、LHS、Halton、正交、随机函数)更新中

【MATLAB第79期】基于MATLAB的数据抽样合集&#xff08;sobol、LHS、Halton、正交、随机函数&#xff09;更新中 一、随机函数 1.指定区间随机生成数据&#xff08;小数&#xff09; [a b]区间随机数生成: Aa(b-a)rand(m,n) m&#xff1a;待生成矩阵A的行数 n: 待生成矩阵A…

【c++】跟webrtc学std array 2:TaskExecutorMap单例用法

D:\XTRANS\m98_rtc\ndrtc-webrtc\src\base\task\task_executor.ccstd array实现的map:TaskExecutorMap // Maps TaskTraits extension IDs to registered TaskExecutors. Index |n| // corresponds to id |n - 1|. using TaskExecutorMap =std::array<TaskExecutor*, Task…

物联网AI MicroPython传感器学习 之 AS608指纹识别模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 AS608指纹识别模块是一款高性能的光学指纹识别模块。它采用的是指纹识别芯片公司杭州晟元芯片技术有限公司生产的AS608指纹识别芯片。该芯片内置DSP运算单元&#xff0c;集成了指纹识别算法&am…

CENTOS 7基于ISO文件进行安装新软件

众所周知&#xff0c;YUM是CENTOS7的安装程序。 普通情况下&#xff0c;连网之后 &#xff0c;用yum install 就可以安装。 但当网络环境经常出现连接失败的情况&#xff0c;默认情况下的行为就走不通了。 为解决这个问题&#xff0c;可以考虑如下三个方案 方案一&#xff1a;Y…

23.项目开发之量化交易抓取数据QuantTradeData(二)

后端业务&#xff1a;定时更新“A股日线行情”数据 需求说明 为了获取前一天的最新数据&#xff0c;我们需要每天晚上10点定时刷新daily股票列表基础信息&#xff0c;并将最新数据插入或更新到数据库中。 如果该内容是在当天交易日信息未更新前查询&#xff08;15~16点之前&a…

【Python】Python 中的Docutils模块详解

Python 中的Docutils模块详解 1. 什么是Docutils Docutils项目的主要是为了创造一套将纯文本转换为一些常用格式的工具&#xff0c;这些常用格式包括&#xff1a;HTML、XML和LaTeX。请事先了解 reStructuredText 的基础知识。 已经支持的包括&#xff1a; 独立的文本文件 P…

利用 NLP 超能力:一步步介绍Hugging Face微调教程

导入必要的库 导入必要的库类似于为特定编程和数据分析活动构建工具包。这些库通常是预先编写的代码集合,提供广泛的功能和工具,有助于加快开发速度。开发人员和数据科学家可以通过导入适当的库来访问新功能、提高生产力并使用现有解决方案。 import pandas as pd import n…

《数据结构、算法与应用C++语言描述》使用C++语言实现数组循环队列

《数据结构、算法与应用C语言描述》使用C语言实现数组循环队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一…

vue 鼠标划入划出多传一个参数

// item可以传递弹窗显示数据&#xff0c; $event相关参数可以用来做弹窗定位用 mouseover"handleMouseOver($event, item)" mouseleave"handleMouseLeave($event, item)"举个栗子&#xff1a; 做一个hover提示弹窗组件(用的vue3框架 less插件) 可以将组件…

rabbitmq发送json格式 utf8编码数据

参考文章&#xff1a;Spring-Cloud RabbitMQ 用法 - 发送json对象 - 简书 生产者&#xff1a; 消费者&#xff1a;

哪家堡垒机支持国密算法?有哪些功能?

国密算法即国家密码局认定的国产密码算法&#xff0c;即商用密码。最近看到有不少小伙伴在问&#xff0c;哪家堡垒机支持国密算法&#xff1f;有哪些功能&#xff1f; 哪家堡垒机支持国密算法&#xff1f; 行云堡垒支持SM2、SM3、SM4等国产密码算法&#xff0c;同时支持国密…

2023年下半年NPDP考试今天开始报名!

2023年第二次NPDP考试将于2023年12月2日&#xff08;周六&#xff09;举行&#xff0c;考试报名相关事项安排如下&#xff1a; 一、考试时间&#xff1a; 12月2日09:00-12:30。 二、报名时间&#xff1a; 10月18日08:00-11月10日23:59。 三、缴费及退考截止时间&#xff1…

C++使用openssl对AES-256-ECB PKCS7 加解密

/** AES-256-ECB PKCS7 加密 函数* input:经过PKCS7填充后的明文数据* outhex:加密后的命名数据16进制数,可以使用base64_encode转换为base64格式字符串密文* key:密钥* len:经过PKCS7填充后的明文数据长度*/ void AesEcb256Pkcs7Encrypt(u8 *input, u8 *outhex, u8 *key, int …

基于Java的旅游网站系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

2023年中国GPS导航设备产量、销量及市场规模分析[图]

GPS导航设备行业是指生产和销售用于导航、定位和监控目的的GPS设备的行业&#xff0c;可以用于汽车、船只、飞机、人员和其他物体的定位和导航&#xff0c;以及用于地理信息系统&#xff08;GIS&#xff09;、测绘、海洋抢险、森林监测、地质勘探、气象预报、交通管理、物流跟踪…

Java项目-网页聊天程序

目录 项目介绍 项目功能简介 项目创建 用户管理模块 1.数据库设计及代码实现 2.前后端交互接口的设计 3.服务器代码开发 好友管理模块 数据库设计 好友表设计的两个重要问题 设计前后端交互接口 服务器代码 会话管理模块 会话的数据库设计 获取会话信息 约定前后…

Linux杀掉僵尸进程方法

说明&#xff1a; 一般在使用pytorch训练网络模型时&#xff0c;可能会不正确的终端训练&#xff0c;导致进程僵尸&#xff0c;GPU依然被占用的情况。 解决办法&#xff1a; 查看进程的ID及其父进程ID指令&#xff1a; ps -ef | grep defunct | more假设输出如下&#xff1a…

滴滴弹性云基于 K8S 的调度实践

上篇文章详细介绍了弹性云混部的落地历程&#xff0c;弹性云是滴滴内部提供给网约车等核心服务的容器平台&#xff0c;其基于 k8s 实现了对海量 node 的管理和 pod 的调度。本文重点介绍弹性云的调度能力&#xff0c;分为以下部分&#xff1a; 调度链路图&#xff1a;介绍当前弹…

服务器数据恢复-RAID信息破坏导致服务器操作系统无法启动的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器&#xff0c;8块硬盘组建了一组raid5磁盘阵列&#xff0c;服务器安装的是windows server操作系统&#xff0c;上层部署ORACLE数据库。 服务器故障&#xff1a; 在服务器运行过程中&#xff0c;2块硬盘报警&#xff0c;服务器操作系统…