怎么做电影网站吗,做外贸学网站,网页设计代码含js,家装品牌排行榜前十名【机器学习实战】电力需求预测挑战赛 Datawhale AI 夏令营 task2 一、赛题背景二、赛题任务三、评审规则四、具体实践4.1 实现的思路4.2 理论介绍GBDTLightGBM 4.3 代码的实现与运行4.3.1 导入模块4.3.2 探索性数据分析#xff08;EDA#xff09;4.3.3 特征工程4.3.4 模型训练… 【机器学习实战】电力需求预测挑战赛 Datawhale AI 夏令营 task2 一、赛题背景二、赛题任务三、评审规则四、具体实践4.1 实现的思路4.2 理论介绍GBDTLightGBM 4.3 代码的实现与运行4.3.1 导入模块4.3.2 探索性数据分析EDA4.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房屋iddt日标识type房屋类型target实际电力消耗预测目标
2.评审规则 预测结果以 mean square error 作为评判标准具体公式如下 1 n ∑ n 1 n ( y i − y ^ i ) 2 \frac{1}{n}\sum_{n1}^{n}(y_{i}-\hat y_{i})^{2} n1n1∑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
LightGBMLight 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为房屋iddt为日标识训练数据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], markero, 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时间信息给到d1时间这样就实现了平移一个单位的特征构建。 窗口统计特征窗口统计可以构建不同的窗口大小然后基于窗口范围进统计均值、最大值、最小值、中位数、方差的信息可以反映最近阶段数据的变化情况。如下图所示可以将d时刻之前的三个时间单位的信息进行统计构建特征给我d时刻。 实现的代码如下
# 合并训练数据和测试数据并进行排序
data pd.concat([test, train], axis0, ignore_indexTrue)
data data.sort_values([id,dt], ascendingFalse).reset_index(dropTrue)# 历史平移
for i in range(10,30):data[flast{i}_target] data.groupby([id])[target].shift(i)# 窗口统计
data[fwin3_mean_target] (data[last10_target] data[last11_target] data[last12_target]) / 3# 进行数据切分
train data[data.target.notnull()].reset_index(dropTrue)
test data[data.target.isnull()].reset_index(dropTrue)# 确定输入特征
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.dt31][cols], train_df[train_df.dt31][target]val_x, val_y train_df[train_df.dt30][cols], train_df[train_df.dt30][target]# 构建模型输入数据train_matrix lgb.Dataset(trn_x, labeltrn_y)valid_matrix lgb.Dataset(val_x, labelval_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_eval500, early_stopping_rounds500)# 验证集和测试集结果预测val_pred model.predict(val_x, num_iterationmodel.best_iteration)test_pred model.predict(test_df[cols], num_iterationmodel.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, indexNone)运行的结果如图所示 我们将生成的submit.csv文件在平台提交测试如图所示可以看到相比于之前提升了很多因为我们是分数越小说明与真实值的误差越小。