Kaggle赛题总结:预测客户太阳能电量
Kaggle赛题总结:预测客户太阳能电量
Kaggle竞赛平台上的Enefit - Predict Energy Behavior of Prosumers比赛,旨在预测能源产消者的行为并减少不平衡成本。本文详细介绍了比赛背景、任务要求、数据集结构以及评估指标,并总结了部分优胜方案的核心策略。
比赛背景
竞赛旨在解决能源不平衡的问题,即预计使用的能源与实际使用或产生的能源不符。自发自用者是既消耗又产生能源的个体,他们在造成能源不平衡方面起到了重要作用。尽管他们只占所有能源消费者的一小部分,但他们不可预测的能源使用行为给能源公司带来了物流和财务问题。
如果不加以解决,可能会导致运营成本增加、电网不稳定以及能源资源的低效利用。如果这个问题得到有效解决,将显著降低不平衡成本,提高电网的可靠性,并使自发自用者更高效和可持续地融入能源系统中。
任务要求
在这个竞赛中,参赛者需要开发一个预测模型,以估计在爱沙尼亚安装了太阳能电池板的能源客户所产生和消耗的电量。为了完成这个任务,参赛者将获得多种数据来源,包括天气数据、能源价格数据以及已安装的光伏容量信息。
数据集描述
数据文件包括了有关能源消费者、天气、能源价格以及历史天气的信息,供参赛者用于构建预测模型。通过分析这些数据,参赛者可以努力提高对爱沙尼亚能源客户太阳能电力产生和消耗的准确性。
train.csv
county
:县的ID代码。is_business
:表示能源客户是否是商业客户的布尔值。product_type
:契约类型的ID代码,包括{0: "Combined", 1: "Fixed", 2: "General service", 3: "Spot"}的映射。target
:相关时段的电力消耗或产生量。时段由county
、is_business
和product_type
定义。is_consumption
:表示该行数据的目标是电力消耗还是产生的布尔值。datetime
:爱沙尼亚时间(EET / EEST)。data_block_id
:具有相同data_block_id
的所有行将在同一时间进行预测。这取决于实际制定预测时可用的信息。row_id
:行的唯一标识符。prediction_unit_id
:county
、is_business
和product_type
组合的唯一标识符。测试集中可能会出现或消失新的预测单位。
gas_prices.csv
origin_date
:前一天的天然气价格数据的日期。forecast_date
:预测价格应该生效的日期。lowest_price_per_mwh
:天然气在前一天的日前市场的最低价格,以欧元每兆瓦时计。highest_price_per_mwh
:天然气在前一天的日前市场的最高价格,以欧元每兆瓦时计。data_block_id
client.csv
product_type
:契约类型。county
:县的ID代码。eic_count
:能源消耗点(EICs - European Identifier Code)的汇总数量。installed_capacity
:安装的光伏太阳能电池板容量,以千瓦为单位。is_business
:表示能源客户是否是商业客户的布尔值。date
data_block_id
electricity_prices.csv
origin_date
:电力价格数据的日期。forecast_date
:预测价格应该生效的日期。euros_per_mwh
:前一天日前市场上电力的价格,以欧元每兆瓦时计。data_block_id
forecast_weather.csv
[latitude/longitude]
:天气预报的坐标。origin_datetime
:天气预报生成的时间戳。hours_ahead
:天气预报生成时间与预测天气之间的小时数。每个预测涵盖总共48小时。temperature
:地面上2米高处的空气温度(摄氏度)。dewpoint
:地面上2米高处的露点温度(摄氏度)。cloudcover_[low/mid/high/total]
:不同高度区域(0-2公里、2-6公里、6+公里以及总体)的云层覆盖百分比。10_metre_[u/v]_wind_component
:测量地表上方10米的风速的东向/北向分量,以米每秒计。data_block_id
forecast_datetime
:预测天气的时间戳,由origin_datetime
和hours_ahead
生成。direct_solar_radiation
:每小时沿着与太阳方向垂直的平面上达到地表的直接太阳辐射,以瓦特时每平方米计。surface_solar_radiation_downwards
:达到地球表面的水平面上的太阳辐射,包括直接辐射和散射辐射,以瓦特时每平方米计。snowfall
:过去一小时内的降雪量,以水当量米计。total_precipitation
:过去一小时内在地球表面降落的液态降水(包括雨和雪)的累积量,以米为单位。
historical_weather.csv
datetime
:日期时间。temperature
:温度。dewpoint
:露点温度。rain
:与预测约定不同。前一小时的大尺度天气系统降雨量(毫米)。snowfall
:与预测约定不同。前一小时的降雪量(厘米)。surface_pressure
:地表处的大气压力(百帕)。cloudcover_[low/mid/high/total]
:与预测约定不同。云层覆盖在不同高度区域(0-3公里、3-8公里、8+公里以及总体)的百分比。windspeed_10m
:与预测约定不同。地面上方10米处的风速(米每秒)。winddirection_10m
:与预测约定不同。地面上方10米处的风向(度)。shortwave_radiation
:与预测约定不同。全球水平辐射(瓦特时每平方米)。direct_solar_radiation
:直接太阳辐射。diffuse_radiation
:与预测约定不同。漫射太阳辐射(瓦特时每平方米)。[latitude/longitude]
:天气站的坐标。data_block_id
其他辅助文件
public_timeseries_testing_util.py
:用于运行自定义离线API测试的可选文件。查看脚本的文档字符串以获取详细信息。在使用之前,您需要编辑此文件。example_test_files/
:用于说明API功能的数据,包括API提供的相同文件和列。前三个data_block_ids
是训练集中最后三个data_block_ids
的重复。example_test_files/sample_submission.csv
:一个有效的样本提交文件,由API提供。可以参考这个笔记本获取如何使用样本提交的简单示例。example_test_files/revealed_targets.csv
:实际的目标数值,提供了一天的延迟。enefit/
:包含API所需文件的文件夹。预期API能够在不到15分钟内提供所有行,并且将保留不到0.5 GB的内存。您需要对这些日期进行预测以推进API,但这些预测不会得分。最初会提供大约三个月的数据,预测期结束时可能提供多达十个月的数据。
评估指标
根据预测回报与观测目标之间的平均绝对误差 (MAE) 评估提交内容。公式由下式给出:
其中:
n
是数据点的总数。y_pred_i
是数据点 i 的预测值。y_true_i
是数据点 i 的观测值。
必须使用提供的 python 时间序列 API 提交本次竞赛,这可确保模型不会及时向前窥视。
赛程安排
- 2023 年 11 月 1 日 - 开始日期。
- 2024 年 1 月 24 日 - 报名截止日期。
- 2024 年 1 月 24 日 - 合并截止日期。
- 2024 年 1 月 31 日 - 提交截止日期。
优胜方案分析
第1名
解决方案使用了4个XGBoost模型(分别用于两个目标和两个is_consumption
)和2个GRU模型(用于两个目标)。所有模型共享相同的600个特征。通过平均最佳模型结果进行集成;使用了简单的验证策略,将前500天作为训练集,其余天数作为验证集。仅关注最终整体分数,而不打印单个模型的分数。特征工程主要基于合并了除了gas_df
之外的所有表格,并创建了许多滞后特征。使用了两种目标计算公式:(target-target_shift2)/installed_capacity
和target/installed_capacity
。没有使用目标的其他变体,因为它们对最终整体分数没有益处。最终模型如下:
- XGBoost模型并没有进行太多的调参,只是简单地训练和预测。
- GRU模型的输入是一个张量,形状为
(batch_size, 24小时, 600 dense_feature_dim + 6*16 cat_feature_dim)
。 - 通过NN模型使最终分数提升了0.9。
第6名
解决方案的核心思想是使用LightGBM模型来预测能源消耗和产生,并采用了一系列特征工程和模型融合技术。
- 特征工程:主要特征来自于公共笔记本,但为了适应目标,进行了一些微小的转换。与其他参赛者的主要区别在于,作者还创建了简单的基线模型,用于每天重新训练消耗和产生模型。
- 模型:作者训练了两组LightGBM模型,分别针对产生和消耗,每组模型针对4个不同的目标进行训练,总共有8个模型。目标包括:
target - target_lag48
target/(target_lag48_avg + 1) - baseline_pred
target/(target_lag48_avg + 1) - target_lag48
target/(target_lag48_avg + 1)
其中,target_lag48_avg
是目标的两天滞后值的每日平均值。虽然作者没有考虑到按安装容量进行缩放,但其他前几名的解决方案中有提及,这似乎是一个不错的目标。
- 重新训练:作者实际上没有对LightGBM模型进行重新训练,只是在基线模型中进行了重新训练。
- 混合多个模型:最终模型是对具有不同目标、10个种子和两个超参数设置的模型进行加权组合。总共有160个模型。作者提到,他可能应该花时间重新训练LightGBM模型,而不是创建这么大的混合模型,或者经常重新训练简单的基线模型。
第7名
成功的部分:
- 特征工程:使用了广泛的特征集合,包括基本特征(如时间相关特征、天气数据)、衍生特征(如历史与预测天气的差异)以及目标相关特征(如生产除以安装容量、消耗除以EIC计数)等。
- 模型选择和调参:使用了一系列梯度提升树模型(如LGBM、XGBoost、CatBoost、HistGradientBoostingRegressor),并通过Optuna进行参数优化,提高了模型的泛化能力。
- 集成学习:通过平均多个模型的预测结果来提高性能,同时通过不同的随机种子重复训练模型,以增加模型的多样性。
未成功的尝试:
- 天气特征差异:尝试使用历史和预测天气之间的差异作为特征,但没有提高性能。
- 更多的滞后特征和聚合特征:尝试使用更多的滞后特征和其他特征的各种统计聚合,但未见明显改善。
- 基于物理公式的特征:尝试使用基于天气数据的物理公式,但未取得成功。
第10名
作者训练了两个单独的模型:
- 只使用天气预报特征的模型,以
target/installed_capacity
作为目标 - 只使用天气历史特征的模型,以
target/installed_capacity
作为目标
作者还生成了基于每单位容量的预估产量特征及其交互项,用于最终的模型。
- 将数据分成4部分,并针对每个(
is_business
,is_consumption
)对训练模型 - 创建基线预测,即
max(target_lag2, target_lag4, target_lag7)
- 新的目标变为
(target + 1)/(baseline_pred + 1)
- 对于每个数据分区,使用不同的种子和不同的样本权重(相等、
log1p(baseline_pred)
和sqrt(baseline_pred)
)训练3个模型
共76个特征。没有特别的特征工程。对于每个prediction_unit_id
,计算了滞后2、3、4天的误差,并取它们的平均值。将0.2*avg_error
添加到预测中作为修正项。这样,可以提高对于持续低估或高估的情况的性能。每8天,在GPU上重新训练XGBoost模型。这在有新的prediction_unit_ids
或eics
增加时特别有用。
将最后9个月分为3个验证折。同时将公共LB作为第4个折。尽管3折交叉验证为35.73,但公共LB为61.32。尽管得分相对较差,但与公开最佳内核进行80/20集成后,作者的得分为59.97。他认为这是因为他的模型具有多样性,而这个问题从多样性集成中获益良多。顺便说一句,通过与公开最佳内核进行集成,他在交叉验证得分上也有所提高,但提高幅度明显较低。
第13名
作者使用了LightGBM开发了独立的产生和消耗模型。对于产生,他们使用了两天前的值的差异除以安装容量。对于消耗,他们使用了两天前的值的差异除以能源消耗点数。在推断期间,他们对模型进行了三次重新训练。
- 验证:作者采用了从2023年1月到2023年5月的单折验证。在提交时,他们使用两个种子重新训练了所有数据,分别针对产生和消耗模型。
- 目标
- 产生:
(target - target_lag2) / installed_capacity
- 消耗:
(target - target_lag2) / eic_count
- 产生模型的特征:
- 与日期相关的特征(例如假日、月份、工作日)
eic_count
、installed_capacity
- 目标(产生)/安装容量的滞后和差异,包括统计量
- 目标(产生)/eic_count的滞后和差异,包括统计量
- 目标(消耗)/安装容量的滞后和差异,包括统计量
- 目标(消耗)/eic_count的滞后和差异,包括统计量
- 天气预报
- 天气预报与历史天气的差异
- 天气预报前2小时、前1小时、后1小时的差异以及前后1小时的平均值
- 工作日和周末的目标(产生)/安装容量的滞后平均值
- 消耗模型的特征:
- 与日期相关的特征(例如假日、月份、工作日)
- 目标(产生)/安装容量的滞后和差异,包括统计量
- 目标(消耗)/安装容量的滞后和差异,包括统计量
- 目标(消耗)/eic_count的滞后和差异,包括统计量
- 天气预报
- 历史天气的滞后
- 工作日和周末的目标(消耗)/eic_count的滞后平均值
为了提高计算效率,作者仅使用了在LightGBM中确定的前300个最重要的特征用于产生模型,以及前400个最重要的特征用于消耗模型。作者进行了三次重新训练:在2024年1月底、2024年2月和2024年3月。在每个时间点,都使用了两个种子重新训练了产生和消耗模型。