赞
踩
随着全球经济的快速发展和城市化进程的加速,电力系统面临着越来越大的挑战。电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。然而,电力需求受到多种因素的影响。因此,为了提高电力需求预测的准确性和可靠性,推动智能电网和可持续能源系统的发展,设计了本场“电力需求预测”数据算法挑战赛。
选手需要根据多个房屋对应的电力消耗历史数据,构建有效的模型,能够准确地预测未来的电力消耗。
数据集分为训练集和测试集。为了保证比赛的公平性,每日日期进行了脱敏处理,用1-N进行标识,即1为数据集最近一天,其中1-10为测试集数据。
数据集由以下字段组成:
id
: 房屋iddt
: 日标识type
: 房屋类型target
: 实际电力消耗,预测目标以下是任务解决的标准代码及其解读:
1. 导入需要用到的相关库
- import pandas as pd # 用于数据处理和分析
- import numpy as np # 用于科学计算和多维数组操作
2. 读取训练集和测试集
- train = pd.read_csv('train.csv') # 读取训练集数据
- 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()
train[train['dt'] <= 20]
这一部分代码用于过滤训练集中的数据,只保留dt
(日标识)小于等于20的数据。即我们只关注最近20天的数据。
.groupby(['id'])
过滤后的数据按房屋ID(id
)进行分组。groupby
方法用于将数据集中的数据根据指定的列(此处为id
)进行分组,以便后续计算每个分组内的统计信息。
['target'].mean()
对每个分组(即每个房屋)的target
列(实际电力消耗)计算均值。通过mean()
方法,计算每个房屋在最近20天内的电力消耗平均值。
.reset_index()
将分组后的结果重新设置索引。groupby
操作后会产生一个带有分组键(此处为id
)作为索引的DataFrame。reset_index()
方法将分组键恢复为DataFrame的一列,并生成新的默认索引。
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. 导入需要用到的相关库
- # 导入 pandas 库,用于数据处理和分析
- import pandas as pd
- # 导入 numpy 库,用于科学计算和多维数组操作
- import numpy as np
-
- # 2. 读取训练集和测试集
- # 使用 read_csv() 函数从文件中读取训练集数据,文件名为 'train.csv'
- train = pd.read_csv('train.csv')
- # 使用 read_csv() 函数从文件中读取测试集数据,文件名为 'test.csv'
- test = pd.read_csv('test.csv')
-
- # 3. 计算训练数据最近11-20单位时间内对应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')
-
- # 5. 保存结果文件到本地
- test[['id','dt','target']].to_csv('submit.csv', index=None)
代码本质是一个简单的均值计算,我认为可以使用基于机器学习的回归模型来进行预测,比如我可以使用线性回归模型。参考代码如下,具体思路可以参看网上的吴恩达机器学习视频中对回归模型的介绍,这里给出笔记的链接:
机器学习笔记(2)- 线性回归模型、代价函数_标准线性回归代价函数展开-CSDN博客
- import pandas as pd
- import numpy as np
- from sklearn.linear_model import LinearRegression
- from sklearn.model_selection import train_test_split
-
- # 1. 读取训练集和测试集
- train = pd.read_csv('train.csv')
- test = pd.read_csv('test.csv')
-
- # 2. 特征工程
- # 提取时间特征
- train['day'] = train['dt'] % 7
- train['week'] = train['dt'] // 7
- test['day'] = test['dt'] % 7
- test['week'] = test['dt'] // 7
-
- # 计算历史电力消耗的统计特征(使用不包含测试集时间段的历史数据)
- def calculate_statistics(data, dt_threshold):
- historical_data = data[data['dt'] > dt_threshold]
- target_mean = historical_data.groupby('id')['target'].mean().reset_index().rename(columns={'target': 'target_mean'})
- target_std = historical_data.groupby('id')['target'].std().reset_index().rename(columns={'target': 'target_std'})
- target_max = historical_data.groupby('id')['target'].max().reset_index().rename(columns={'target': 'target_max'})
- target_min = historical_data.groupby('id')['target'].min().reset_index().rename(columns={'target': 'target_min'})
-
- statistics = target_mean.merge(target_std, on='id').merge(target_max, on='id').merge(target_min, on='id')
- return statistics
-
- # 只使用训练集中的部分时间段进行统计特征的计算
- dt_threshold = 10
- statistics = calculate_statistics(train, dt_threshold)
-
- # 合并统计特征到训练集和测试集
- train = train.merge(statistics, on='id', how='left')
- test = test.merge(statistics, on='id', how='left')
-
- # 填充缺失值
- train.fillna(0, inplace=True)
- test.fillna(0, inplace=True)
-
- # 将房屋类型进行编码
- train = pd.get_dummies(train, columns=['type'])
- test = pd.get_dummies(test, columns=['type'])
-
- # 3. 选择特征和目标
- features = ['day', 'week', 'target_mean', 'target_std', 'target_max', 'target_min'] + [col for col in train.columns if col.startswith('type_')]
- X_train = train[features]
- y_train = train['target']
- X_test = test[features]
-
- # 4. 模型训练
- model = LinearRegression()
- model.fit(X_train, y_train)
-
- # 5. 模型预测
- test['target'] = model.predict(X_test)
-
- # 6. 保存结果
- test[['id', 'dt', 'target']].to_csv('submit.csv', index=None)
补充说明一点:
参照网上标准,我这里使用了特征工程,将日标识(dt
)转换为天(day
)和周(week
)特征(之后将计算得到的统计特征合并到训练集和测试集)。
同时对房屋类型进行了编码,将其转换为数值特征方便处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。