这是Datawhale2024暑期夏令营的第三期,该期夏令营同样依托于AI竞赛,DW选择了由上海科学智能研究院、复旦大学联合阿里云在上智院·天池平台发布的“第二届世界科学智能大赛”。(竞赛官网网站为:上海科学智能研究院 (sais.com.cn))
一共分了五个赛道,分别是:
- 地球科学赛道:AI极端降水预报
- 物质科学赛道:催化反应产率预测
- 社会科学赛道:市场博弈和价格预测
- 逻辑推理赛道:复杂推理能力评估
- 生命科学赛道:siRNA药物药效预测
关于赛题的介绍和分析这里就不过多介入,感兴趣的同学可以自行去上文中的竞赛官网查看相关内容。
task3的内容主要是关于上分方向的探讨,分成了三个部分:时间序列挖掘、ABM和强化学习三个方向。由于方法难易程度和时间的局限(更主要的是本人水平有限),我在这里只对时间序列改进方法进行一些探讨,只是本人的一些浅薄之见,抛砖引玉,姑妄听之。
一、代码思路分析
由于代码较长,在这里不再贴出完整的代码,也不再对代码进行逐步分析,对baseline感兴趣的朋友可以前往Datawhale查看(网站如下:Datawhale),我将以思维导图的形式对代码进行整体上的归纳和总结。
在特征工程的部分,对于时间戳特征采取了独热编码。在进行独热编码时,如果一个分类变量有k个不同的类别,通常会生成k-1个虚拟变量,以避免所谓的“虚拟变量陷阱”(Dummy Variable Trap),即独热编码后的变量间出现完全多重共线性。这是因为k个虚拟变量中最后一个类别可以通过剩余k-1个变量的状态推断出来。因此,在许多情况下,为了避免多重共线性,通常会忽略其中一个类别,仅保留k-1个虚拟变量。
二、一些上分思路
PS:这里的上分思路只针对时间序列的方法。
1. 加入更多的节假日特征
在baseline中,只加入了春节和劳动节,后续我又加入了国庆节、清明节等所有节假日(还好我们国家放假少,一共就那么几天,找假期特别好找。。。。)。经测试,有小几百分的提高。
2. 加入气象数据特征
经过分析和网络查找资料,我们可以发现,很多气象数据都会对出清价格产生影响,比如:
-
温度:温度是影响电力需求的主要因素之一。高温天气会增加空调和制冷设备的使用,导致电力需求上升;低温天气则会增加供暖设备的使用,同样导致电力需求上升
-
风速:风速直接影响风力发电的发电量。风速较高时,风力发电量增加,可能导致电力供给增加,从而压低市场价格;风速较低时,风力发电量减少,可能导致电力供给减少,从而推高市场价格。
-
太阳辐射:太阳辐射量影响光伏发电的发电量。晴天和高辐射量的天气条件下,光伏发电量增加,电力供给增加,从而可能压低市场价格;反之,阴天和低辐射量的天气条件下,光伏发电量减少,电力供给减少,从而可能推高市场价格。
-
降水量:降水量影响水库的水位和径流量,从而影响水力发电的发电量。降水量充足时,水力发电量增加,电力供给增加,从而可能压低市场价格;降水量不足时,水力发电量减少,电力供给减少,从而可能推高市场价格。
-
湿度:湿度与温度共同作用影响电力需求,特别是空调和制冷设备的使用。高温高湿的天气条件会显著增加制冷需求,从而增加电力需求
-
气象灾害:如暴风雨、台风、冰冻天气等极端气象事件会对电力系统造成破坏,导致电力供给中断或受限,从而推高市场价格。同时,这些事件也可能导致电力需求的剧烈波动。
赛题数据并没有说明是哪个城市的电力数据,只说可以按照华北地区的数据查找,但是,华北地区城市众多,不同城市的气象数据相差其实不小,我选取了北京市的气象数据。由于数据比较难找,(温度好找数据,其他的辐射、降水量等因素很难找到每天的数据),我最终只找到了历史月均数据,网站如下,供大家参考:
https://zh.weatherspark.com/y/131055/%E4%B8%AD%E5%9B%BD%E3%80%81%E5%8C%97%E4%BA%AC%E5%B8%82%E7%9A%84%E5%85%A8%E5%B9%B4%E5%B9%B3%E5%9D%87%E5%A4%A9%E6%B0%94#Figures-Temperature https://www.weather-atlas.com/zh/china/beijing-climate https://www.data.ac.cn/table/tbc24
但是,当我把这些数据作为特征列加入训练集后,进行了多次尝试,发现线上验证结果更差了。结合DW大佬的意见(感谢zwj大佬),我认为可能有如下原因:
(1)赛题数据和北京市的气象数据并不匹配,华北地区的不同城市之间气象相差很大。
(2)赛题数据是按照一刻钟计算的,但是我用的历史月均数据,单位相差过大,可能加入了太多噪音,难以作为有效特征。(每天的甚至每小时的数据太过难找,而且这种详细数据大多费用不菲。。。)
(3)直接加入数据作为特征欠妥,对数据进行进一步处理,提取变化趋势作为特征,可能会更好。
3. 特征列做标准化处理
这里我推荐大家对特征列进行一下标准化处理,经过我的测试,经过标准化处理,成绩会有一些上升(但只有十几或者几十)。
4. 考虑更换模型
我尝试了很多模型,最终发现,线性模型预测是最好的,在此赛题中,可能因为需求对价格的线性程度高,树模型不如线性模型更准确,可以尝试再用L1和L2模型试试,其他模型,不做推荐。
5. 模型融合方式
不推荐使用stacking融合,最终线上验证结果还不如加权平均。。。。
这里原因应该是因为大量的-80电价无法准确预测,一旦stacking融合对极值电价预测失误,会造成很大的MSE误差。加权平均反而使得数据更加平滑了,不容易出现极值(负电价预测失误还不如不预测?)
6. 预测结果做平滑化处理
经过我的尝试,对预测结果做平滑化处理,对成绩有提升。
三、存在的问题
在baseline的基础上,我加入了交叉验证,但是线下验证的结果和线上验证的结果却是相差巨大。(我加入了控制拟合,应该没有过拟合),在之后,我又做了许多尝试,始终没能解决线上验证和线下验证有较大差距的问题。每次提交结果都像开盲盒。
我推测原因可能是因为训练集和测试集数据范围相差较大,我进行了一些浅显的分析,从下图可以看出,测试集的demand出现了一些异常高和异常低的部分,这一部分的出清价格可能是模型足够泛化也难以预测的?