Datawhale AI 夏令营——电力需求挑战赛——Task2学习笔记

一、实先准备

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')

 

二、测试集与数据集读取

# 使用 read_csv() 函数从文件中读取训练集数据,文件名为 'train.csv'
train = pd.read_csv('./data/data283931/train.csv')
# 使用 read_csv() 函数从文件中读取测试集数据,文件名为 'train.csv'
test = pd.read_csv('./data/data283931/test.csv')

 

三、特征工程

# 合并训练数据和测试数据,并进行排序
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']]
  1. 合并数据并排序
    1. 将测试数据和训练数据合并,并重置索引。
    2. 按照 iddt(日期)字段对数据进行降序排序。
  2. 历史平移
    1. 对于每个 id,创建历史目标值的滞后特征(last10_targetlast29_target),即每个 id 的目标值向前移动10到29个时间步长。
  3. 窗口统计
    1. 计算窗口统计特征 win3_mean_target,即 last10_targetlast11_targetlast12_target 的平均值。
  4. 数据切分
    1. 根据目标值是否为空,将数据切分为训练集和测试集。
  5. 确定输入特征
    1. train_cols 包含除了 idtarget 之外的所有列。

四、 定义模型

from lightgbm.callback import log_evaluation  # 导入lightgbm库中的log_evaluation回调函数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']  # 训练集特征和标签,使用日期大于等于31的数据val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']  # 验证集特征和标签,使用日期小于等于30的数据# 构建模型输入数据train_matrix = lgb.Dataset(trn_x, label=trn_y)  # 训练数据集valid_matrix = lgb.Dataset(val_x, label=val_y)  # 验证数据集# lightgbm参数设定lgb_params = {'boosting_type': 'gbdt',  # boosting类型为gbdt'objective': 'regression',  # 目标函数为回归'metric': 'mse',  # 评估指标为均方误差'min_child_weight': 5,  # 最小叶子节点样本权重和'num_leaves': 2 ** 5,  # 叶子节点数'lambda_l2': 10,  # L2正则化权重'feature_fraction': 0.8,  # 每次迭代使用的特征比例'bagging_fraction': 0.8,  # 每次迭代时用于训练的数据比例'bagging_freq': 4,  # bagging的频率'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)])  # 使用50000轮训练,每100轮打印一次评估信息# 验证集和测试集结果预测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_pred  # 返回验证集和测试集预测结果

lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)  # 调用time_model函数进行训练和预测# 保存结果文件到本地
test['target'] = lgb_test  # 将预测结果添加到测试集中
test[['id','dt','target']].to_csv('submit.csv', index=None)  # 将预测结果保存为submit.csv文件,包括id、日期和目标预测值

这段代码实现了使用LightGBM进行时间序列模型训练和预测的过程。

  1. 首先,根据日期将数据集划分为训练集和验证集。
  2. 使用LightGBM的Dataset类构建模型所需的数据结构。
  3. 设定LightGBM模型的参数,包括boosting类型、目标函数、评估指标等。
  4. 训练模型并通过log_evaluation回调函数定期打印训练过程中的评估信息。
  5. 使用训练好的模型对验证集和测试集进行预测。
  6. 计算验证集预测结果的均方误差作为模型的离线评估指标。
  7. 最后,将测试集预测结果保存为CSV文件,包括每个样本的id、日期和预测目标值。
 

五、 模型评估

1)模型迭代

这段代码会在以下情况下停止:

  1. 训练达到指定的迭代次数: 在 lgb.train 方法中,指定了 50000 作为最大迭代次数 (num_boost_rounds)。模型将会在达到这个迭代次数后停止训练。

  2. 早停机制: LightGBM 提供了早停机制,可以在验证集上的评估指标不再提升时停止训练。在这段代码中,通过 valid_sets=[train_matrix, valid_matrix] 将训练集和验证集传递给 lgb.train 方法,并且使用 callbacks=[log_evaluation(period=100)] 来定期记录评估结果。当验证集上的性能不再改善时,训练将会提前停止,而不会等到达到最大迭代次数。

因此,代码会在达到指定的迭代次数(50000次)或者早停机制触发时停止运行。

2)模型评分

 

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

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

相关文章

美团VS饿了么,到底谁更胜一筹?

美团大战饿了么,到底谁会更胜一筹最近啊,收到一个粉丝的投稿,我发现他在美团和饿了么都去面试过。 这俩企业大家应该都经常用吧,咱点外卖的时候,我有时候就琢磨,到底他俩谁更厉害点。 今天咱们就瞅瞅,在面试这块儿谁更难一些。 (目前都只有一面的情况,要是想要后续的,…

系统状态方程的离散化

A=[0 1 0; 0 0 1; -6 -11 -6]; B=[1 0; 2 -1; 0 2]; C=[1 -1 0; 2 1 -1]; D=[0 0; 0 0]; sysG=ss(A,B,C,D); %获取系统的模拟传递函数 step(sysG) %模拟系统的阶跃响应,如图1 T=0.1; sysGd=c2d(sysG,T); %获取系统的数字传递…

插片式远程 IO模块:双通道PNP和NPN高速计数模块案例说明

插片式远程 IO模块:​XD5002为双通道PNP高速计数模块,XD5003为双通道NPN高速计数模块,用于对工业现场的设备(如手轮、编码器等)进行计数。注意:区别在于XD5002为高电平,XD5003为低电平。插片式远程 IO模块:XD5002为双通道PNP高速计数模块,XD5003为双通道NPN高速计数模…

linux 中根据文件的大小进行文件的查找

001、find ./ -type f -name "*fasta" -size +100M -size -200M ## 查找文件类型未文件; 名称未最后几个字符fasta, 文件的大小大于100M, 小于200M 。

Mac常用操作及快捷键

以前并不喜欢用快捷键,因为觉得记忆起来很麻烦。所以常常是在触控板上点点点。但是渐渐地,会发现频繁点按的弊端:累。 效率低。选中再移动光标寻找比选中再直接操作效率低很多一切需要让手离开键盘的操作,都应该想办法去除。 如果你发现某个操作每天都会用到,并且用时超过…

Python包管理入门

包管理器,是现代项目管理的重要组成部分,许多现代编程语言也会推出统一的包管理器以提升开发者体验,如rust 的cargo,nodejs 的npm,arkts 的ohpm等等。 Python 作为一门很“新”的语言,自然也提供包管理功能。Python包管理的前世今生 如果要提到Python的包管理,那么必定绕…

[转载]SVN系列之—-SVN版本回滚的办法

推荐看原文:SVN系列之—-SVN版本回滚的办法-博客园 雨 燕 三、SVN版本回滚 背景:不想要某个版本改动比如25,将24版本导出后提交 1.【推荐】直接export 优点:不丢失新建的文件,同时获得最新的SVN版本控制。 操作步骤: TortoiseSVN→Show log→选中需要回滚的版本→右键→E…

Profibus协议转profinet协议网关模块连接电磁阀通讯案例

工业通讯中常见的协议有:Modbus协议,ModbusTCP协议,Profinet协议,Profibus协议,Profibus DP协议,EtherCAT协议,EtherNET协议等。然而,有许多现场需要将Profibus DP协议设备与Profinet协议设备连接并通讯。针对这一问题,很多企业选择使用Profibus协议转Profinet协议网关…

c语言代码代码风格配置

1、设置tabsize缩进为4修改点两个位置,然后搜索"detectindentation"将前面的勾选取消 二、配置c语言格式化代码 1、打开设置,选择用户配置,找到文本编辑器 "Default Formatter"(如果找不到可以直接在上方搜索) 安装了C/C++插件后可以选择:C/C++ms-vs…

代码随想录二刷复习(二分法)

二分法模板: 1:左闭右闭区间写法 第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)。 区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点: while (left <= right) 要…

36岁,大龄剩男,聊聊2024的上半年......

不知道我在等什么,也不知道这样等了多久,相信看到这句话的你,可能也是一头雾水吧! 还是以往的风格写到哪算哪,写东西真的是看感觉和心情都具备,写出来的东西才更有灵性,或者说更容易引起共鸣吧! 我在逃避? 可以这么说,但也不完全是,在一部分事情开始收尾的时候,情绪…

Modbus转Ethernet/IP网关模块与汇川PLC通讯案例

Modbus转Ethernet/IP网关模块(XD-MDEP100)是一种用于将Modbus协议转换为Ethernet/IP协议的设备。在汇川PLC通讯中,使用Modbus转Ethernet/IP网关模块可以方便地实现与其他设备的数据传输和通信。Modbus转Ethernet/IP网关模块(XD-MDEP100)是一种用于将Modbus协议转换为Ether…