当前位置:   article > 正文

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

电力需求预测挑战赛

背景

随着全球经济的快速发展和城市化进程的加速,电力系统面临着越来越大的挑战。电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。然而,电力需求受到多种因素的影响。因此,为了提高电力需求预测的准确性和可靠性,推动智能电网和可持续能源系统的发展,设计了本场“电力需求预测”数据算法挑战赛。

任务描述

选手需要根据多个房屋对应的电力消耗历史数据,构建有效的模型,能够准确地预测未来的电力消耗。

数据说明

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

数据集由以下字段组成:

  • id: 房屋id
  • dt: 日标识
  • type: 房屋类型
  • target: 实际电力消耗,预测目标

标准代码解读

以下是任务解决的标准代码及其解读:

1. 导入需要用到的相关库

  1. import pandas as pd # 用于数据处理和分析
  2. import numpy as np # 用于科学计算和多维数组操作

2. 读取训练集和测试集

  1. train = pd.read_csv('train.csv') # 读取训练集数据
  2. test = pd.read_csv('test.csv') # 读取测试集数据

3. 计算训练数据最近时间内对应id的目标均值

target_mean = train[train['dt']<=20].groupby(['id'])['target'].mean().reset_index()

4. 将target_mean作为测试集结果进行合并

test = test.merge(target_mean, on=['id'], how='left')

核心代码分析

target_mean = train[train['dt'] <= 20].groupby(['id'])['target'].mean().reset_index()
1. train[train['dt'] <= 20]

这一部分代码用于过滤训练集中的数据,只保留dt(日标识)小于等于20的数据。即我们只关注最近20天的数据。

2. .groupby(['id'])

过滤后的数据按房屋ID(id)进行分组。groupby方法用于将数据集中的数据根据指定的列(此处为id)进行分组,以便后续计算每个分组内的统计信息。

3. ['target'].mean()

对每个分组(即每个房屋)的target列(实际电力消耗)计算均值。通过mean()方法,计算每个房屋在最近20天内的电力消耗平均值。

4. .reset_index()

将分组后的结果重新设置索引。groupby操作后会产生一个带有分组键(此处为id)作为索引的DataFrame。reset_index()方法将分组键恢复为DataFrame的一列,并生成新的默认索引。

grouby方法介绍

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=<object>, observed=False, dropna=True)

说明一下参数如下:

  • by: 指定用于分组的列名或列名列表。例如,by='column_name'by=['column1', 'column2']
  • axis: 指定分组的轴,默认为0(行)。
  • level: 用于分组的索引级别,仅当索引是多级索引时使用。
  • as_index: 默认为True。表示分组键会成为结果DataFrame的索引。如果设置为False,分组键将作为普通列出现在结果中。
  • sort: 默认为True。表示分组键会被排序。
  • group_keys: 默认为True。如果为True,返回的结果将包括分组键。
  • observed: 仅当分组键是分类变量时使用。默认为False。如果为True,仅返回实际出现的分类组合。
  • dropna: 默认为True。表示分组时会排除所有包含NaN的分组键。

本次学习的总结

这段代码的目的是使用简单的平均值方法预测测试集中的电力消耗情况。具体来说,它计算每个房屋在训练数据中最近20天的平均电力消耗,并将这个平均值作为预测值用于测试集。代码本身比较简单,也很通俗易懂,但是对于入门机器学习而言非常适合,令我收益良多。

完整代码记录

  1. # 1. 导入需要用到的相关库
  2. # 导入 pandas 库,用于数据处理和分析
  3. import pandas as pd
  4. # 导入 numpy 库,用于科学计算和多维数组操作
  5. import numpy as np
  6. # 2. 读取训练集和测试集
  7. # 使用 read_csv() 函数从文件中读取训练集数据,文件名为 'train.csv'
  8. train = pd.read_csv('train.csv')
  9. # 使用 read_csv() 函数从文件中读取测试集数据,文件名为 'test.csv'
  10. test = pd.read_csv('test.csv')
  11. # 3. 计算训练数据最近11-20单位时间内对应id的目标均值
  12. target_mean = train[train['dt']<=20].groupby(['id'])['target'].mean().reset_index()
  13. # 4. 将target_mean作为测试集结果进行合并
  14. test = test.merge(target_mean, on=['id'], how='left')
  15. # 5. 保存结果文件到本地
  16. test[['id','dt','target']].to_csv('submit.csv', index=None)

一个可能的改进思路

代码本质是一个简单的均值计算,我认为可以使用基于机器学习的回归模型来进行预测,比如我可以使用线性回归模型。参考代码如下,具体思路可以参看网上的吴恩达机器学习视频中对回归模型的介绍,这里给出笔记的链接:

机器学习笔记(2)- 线性回归模型、代价函数_标准线性回归代价函数展开-CSDN博客

  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.linear_model import LinearRegression
  4. from sklearn.model_selection import train_test_split
  5. # 1. 读取训练集和测试集
  6. train = pd.read_csv('train.csv')
  7. test = pd.read_csv('test.csv')
  8. # 2. 特征工程
  9. # 提取时间特征
  10. train['day'] = train['dt'] % 7
  11. train['week'] = train['dt'] // 7
  12. test['day'] = test['dt'] % 7
  13. test['week'] = test['dt'] // 7
  14. # 计算历史电力消耗的统计特征(使用不包含测试集时间段的历史数据)
  15. def calculate_statistics(data, dt_threshold):
  16. historical_data = data[data['dt'] > dt_threshold]
  17. target_mean = historical_data.groupby('id')['target'].mean().reset_index().rename(columns={'target': 'target_mean'})
  18. target_std = historical_data.groupby('id')['target'].std().reset_index().rename(columns={'target': 'target_std'})
  19. target_max = historical_data.groupby('id')['target'].max().reset_index().rename(columns={'target': 'target_max'})
  20. target_min = historical_data.groupby('id')['target'].min().reset_index().rename(columns={'target': 'target_min'})
  21. statistics = target_mean.merge(target_std, on='id').merge(target_max, on='id').merge(target_min, on='id')
  22. return statistics
  23. # 只使用训练集中的部分时间段进行统计特征的计算
  24. dt_threshold = 10
  25. statistics = calculate_statistics(train, dt_threshold)
  26. # 合并统计特征到训练集和测试集
  27. train = train.merge(statistics, on='id', how='left')
  28. test = test.merge(statistics, on='id', how='left')
  29. # 填充缺失值
  30. train.fillna(0, inplace=True)
  31. test.fillna(0, inplace=True)
  32. # 将房屋类型进行编码
  33. train = pd.get_dummies(train, columns=['type'])
  34. test = pd.get_dummies(test, columns=['type'])
  35. # 3. 选择特征和目标
  36. features = ['day', 'week', 'target_mean', 'target_std', 'target_max', 'target_min'] + [col for col in train.columns if col.startswith('type_')]
  37. X_train = train[features]
  38. y_train = train['target']
  39. X_test = test[features]
  40. # 4. 模型训练
  41. model = LinearRegression()
  42. model.fit(X_train, y_train)
  43. # 5. 模型预测
  44. test['target'] = model.predict(X_test)
  45. # 6. 保存结果
  46. test[['id', 'dt', 'target']].to_csv('submit.csv', index=None)

补充说明一点:

参照网上标准,我这里使用了特征工程,将日标识(dt)转换为天(day)和周(week)特征(之后将计算得到的统计特征合并到训练集和测试集)。

同时对房屋类型进行了编码,将其转换为数值特征方便处理。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/1019041
推荐阅读
相关标签
  

闽ICP备14008679号