最终成绩:线上第六,无决赛。
比赛地址:https://www.dcjingsai.com/common/cmpt/%E5%9B%BD%E8%83%BD%E6%97%A5%E6%96%B0%E7%AC%AC%E4%BA%8C%E5%B1%8A%E5%85%89%E4%BC%8F%E5%8A%9F%E7%8E%87%E9%A2%84%E6%B5%8B%E8%B5%9B_%E7%AB%9E%E8%B5%9B%E4%BF%A1%E6%81%AF.html

赛题背景

光伏发电具有波动性和间歇性,大规模光伏电站的并网运行对电力系统的安全性和稳定造成较大的影响。对光伏电站输出功率的高精度预测,有助于调度部门统筹安排常规能源和光伏发电的协调配合,及时调整调度计划,合理安排电网运行方式。因此,本题旨在通过利用气象信息、历史数据,通过机器学习、人工智能方法,预测未来电站的发电功率,进一步为光伏发电功率提供准确的预测结果。

本场比赛不分A/B榜。

任务

通过学习历史一段时间内的数值天气预测数据和对应的光伏发电功率训练模型,结合未来某时间点的数值天气预测数据,预测该时间点的光伏发电功率。

数据介绍

原始数据集字段比较少,为每15分钟预测的气象数据,包括时间,辐照度,风速,风向,温度,压强,湿度,直辐射,散辐射,总辐射,实际辐照度,实际功率。除了实际辐照度为真实值,实际功率为任务需要预测外,其余都是预测的气象数据,这本身就是一个奇特的地方,实际功率的预测误差有一部分是由气象数据的预测误差引起的。主办方的奖励方案分为三挡,较高奖励需要指标达到0.11和0.1,然而即使比赛延期,最高分也只有0.13345。

数据包含10个电站的数据,每个电站的发电功率不一样,在计算指标 MAE 的时候,只考虑实际功率的值大于等于装机容量*3%的测量样本。

解决方案

各个电站的分布差异性较大,模型在有些电站上拟合较好,有些较差,最好的电站 MAE 只有0.5左右,而差劲的电站能达到0.15。基于上述情况,采取各个站分开建模的方式,相较于统一建模效果提升显著。

数据预处理

原始属性并没有缺失值,但异常值较多,除了官方提示的“电站9 2016/01/01 9:00 ~ 2017/03/21 23:45之间的实测数据可以删除;电站7 2018/03/01 00:00 ~ 2018/04/04 23:45之间的实测数据可以删除”,我们还额外进行了异常数据的删除。在训练集中,计算出每个站每天的平均功率,分别绘制散点图,会发现大量的离群点,我们根据离群点的范围加上手动调整,确定每日平均辐照度的合理范围,从而筛选出合理的训练数据。

查阅资料我们可以知道,对实际功率影响最大的气象因素为辐照度。在原始数据中,辐照度和实际功率的组合有很多重复值,大量的此类重复数据对模型的学习没有意义,使得模型学习偏向辐照度的影响,从而影响对其他特征的学习,所以我们删去了此类重复数据。但在特征工程中,有大量时序相关特征,为了保证时间上的连续性,我们在构造完特征后才删除重复数据。

1
2
3
df_train = df_feature[df_feature['实际功率'].notnull()]
df_test = df_feature[df_feature['实际功率'].isnull()]
df_train.drop_duplicates(['辐照度', '实际功率'], inplace=True)

晚上没有太阳电站是不发电的,所以夜间数据也是无效的。所以我们将晚上7点之后,早上6点之前的数据进行了删除。

此外,原始气象数据成偏态分布,我们采用 np.log1p 将其正态化。

特征工程

特征工程部分主要分为常规(统计为主)特征和业务特征。某个时间点的发电量不是孤立点,往往与前后的气象数据有关,因此在本方案中首先对气象数据进行平移,得到前15分钟,后15分钟,后30分钟,后45分钟的气象数据。除此以外还计算了一些窗口特征,如以当前时刻向前一个半小时时间段内风速, 辐照度, 温度, 压强, 湿度的 mean,std,sum,kurt 和 peak。窗口特征反映了站点局部气象变化情况,我们还可以放大时间跨度,以天,月,小时为单位有选择地统计气象数据,统计方法主要包括 median,max,min,std。气象数据都是数值型特征,我们可以利用分箱将其离散化,从而提高模型的稳定性和鲁棒性。之前我们说过辐照度对实际功率的影响最大,我们尝试刻画二者之前的关系,但假如直接用辐照度连续值来刻画,会受到异常值的影响,误差敏感。所以我们将辐照度进行等距分箱,采用五折统计框架统计每个分箱下对应的平均发电功率,用平均值降低异常值的影响。

气象数据对发电功率有很大影响,所以我们可以衡量气象数据趋势,比如风速,温度,湿度的趋势。在本方案中采用 LR 拟合一天的数据,用回归系数表示气象趋势。在基础气象数据的基础上,衍生构造出更多气象特征,比如:温差,湿度差,日温差。查阅资料可知:温度上升1℃,晶体硅太阳电池最大输出功率下降0.04%,开路电压下降0.04%(-2mv/℃),短路电流上升0.04%。为了避免温度对发电量的影响,应该保持组件良好的通风条件。温度对太阳能板的发电功率影响很大,但在原始气象特征中,温度指示的是环境温度。但对于太阳能板,影响其发电功率的应该是板温,板温不仅和环境温度有关,也有风速有关,风越大,散热效果也就越好。进一步查阅资料发现板温与辐照度也有较大相关性,因此我们对辐照度,风速和环境温度进行综合计算得到板温。太阳入射角度和发电板倾斜角影响着太阳辐射到达太阳能板的实际辐照度,倾斜角度无法从已有数据获取,但太阳入射角(也叫天顶角)可以利用处于一年中的第几天,当地时间和经纬度位置计算得到,其中经纬度直接采用中国中部的大概位置。根据2018年DF光伏发电的冠军方案,距离周期内峰值的距离(dis2peak)也比较重要, 其反应一个测量点在一天,也就是一个周期中的位置,原因是每天中差不多的时间,太阳,温度等状态都差不多,发电量也就相似。

实际中,光伏发电量还与许多其他业务特征有关,比如和发电板电压,转换效率,但本次比赛只给了环境信息,无法构造。其他气象特征可能由于赛题本身提供的预测气象数据不准确,导致效果也不行。此外我们猜想天气会影响太阳能发电,比如下雪天积雪导致发电效能下降,所以尝试对气象数据进行 K-means 聚类,但效果也不好。

模型

光伏发电往往随着时间周期变化,往小了有一天当中以小时为单位的周期变化,再往上一个月内以天为单位的周期变化。所以在五折交叉验证中,采用 StratifiedKFold 对 day+hour 划分,保证每折模型能学习各阶段数据特性,不会出现有偏学习,换句话说每个模型的训练数据是同分布的。模型方面我们使用了 lgb + xgb,最后使用 stacking 的方式融合。

参考资料

Data Fountain光伏发电量预测 Top1 开源分享
XGBoost+LightGBM+LSTM:一次机器学习比赛中的高分模型方案
浅谈影响光伏发电量减少的主要因素
气象要素对太阳能电池板温度的影响