之前的文章介绍过数据敏感度]。
对数据的认识和解读是高质量的完成任务的关键,因为本篇通过实例讲述如何通过对数据的认识来提高模型的精度。
基本步骤:
作为一个到了被优化年纪才开始邯郸学步,从print(“Hello World”)开始学起的人自然深知其艰辛,所以尽量深入浅出的复述出来,是对自己的一个复盘,也很高兴看到如今的年轻人都如此厉害。
这里将从实际例子出发,以天池的AI earth气候预测为例,手把手、心连心的带你入门天池竞赛Top。很多比赛中优秀的Top选手都会分享其方案,但看过很多方案后,我们往往还是做不好一个比赛。因为很多关键信息并没有完全展示出来,就是方案中的优化为什么这么做?怎么想到的?
从众多实验中获得灵感,找出主要矛盾点。
做过这个比赛的都知道,最让人烦躁的莫过于线上、线下巨大的不确定性。我的baseline就是线下80分、线上22了。面对这种状况,一方面当然是不断优化验证方法,尽量做好线上线下同步;另一方面就是从数据中蕴含的道理出手,由数据给出优化方向不断尝试,而不是盲目的想着乱拳打死老师傅。
使用的baseline就是我之前文章的22分baseline,不过我后来好不容易用Tensorflow复现出来的只有20.8分了,就再次基础上进行各种尝试了。自己开源后,好几周都搞不过开源也是很尴尬。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HiaqsxxK-1674034087096)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4c6ce2a7-2a21-43ea-92cb-52d85aebed71/Untitled.png)]
主要的优化方向:
对于时间序列问题,最最重要的是保持一个学习的心态去尝试,否则体会了太多大起大落后可能心灰意懒。尤其这道题,数据量不大感觉非常需要运气。
首先,了解数据的基本类型和结构:
由于任务的目标还是预测真实观测值,所以首先探索一下真实观测数据(SODA)的趋势,数据时间粒度为月,共100年所以有1200个点,其整体趋势如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pmoNizr-1674034087097)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4d9d7f89-f9ac-4bf6-9829-fc77ae4534de/Untitled.png)]
可以看出,200之前相对平稳、只有一个大波动超过3。200之后保持一个震荡趋势,基本维持在-2到2。
(secret: 发现了不应该发现的东西,缺失的nino3.4是1973年以后的,也就是线上测试集)
时间序列要多研究其趋势性和周期性,按年和月的趋势分别如图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gfs4MUzK-1674034087097)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/51d8b1a5-3bbf-4258-99db-fa62223f9a07/Untitled.png)]
按年的规律显示,厄尔尼诺现象的周期确实不是按自然年的,而是不一定几年为一个周期,今年低可能明年也低、也可能明年一下就涨上去了。
乍一看,本题的出题就不是很合理啊,因为测试最多只能用1年的数据。针对年的趋势
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-66SSnJEr-1674034087097)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d5c2dfc1-0eed-4df2-b3de-708367ef8ae9/Untitled.png)]
按月竟然是有规律的,这种sine、cose类曲线往往代表了其周期性。不过仔细看数据的波动大致在-2到2之间,按月的波动只有0.004,因此规律虽然有,但影响其实不大。乍一看,有规律,盲生发现了华点的感觉;再仔细一看,没什么软用嘛,差距那么小;再再仔细一看,既然呈现了这种正弦曲线的感觉,总是有点东西的;再再再结合实际数据看一眼,就会发现每年这种周期随机性,但仍然是有规律的。
这一点很关键吧,半年一个周期也太短了,事实应该是更久的一个周期,周期也具有随机性,不同随机性叠加后产生了如图的效果。
想象一个这个所谓的厄尔尼诺异常指标,其实对应的是海水异常温度sea surface temperature anomaly。虽然是赤道附近的温度,带一些周期性也是可以理解。虽然这个好像夏天和冬天低、春天和秋天高。
得到了数据的认识(按月的周期性)后,就开始应用了。决定从两个角度进行尝试
经过一番代码编写工作后,
又是一番代码之后,
baseline中其实是用模拟值进行训练。这些模拟值可以想像成一堆微分方程,这些方程代表了海洋、大气的热和流体现象,系统模拟之后得到的结果。比如最出名的蝴蝶效应,就是发现了微小的初始值差异会导致结果完全不同。因此模拟值给了不同模式下的很多值,不理解原理的话像我一样,当成很多平行宇宙中的观测值就好了。
包含多个模式共4647年的cmip数据整体趋势如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uggr9CEx-1674034087098)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/487fa673-219f-4555-b7b6-ac613194ee50/Screen_Shot_2021-03-03_at_11.18.03_PM.png)]
首先可以注意到的是真实数据中基本在-2到2震荡,而且已知线上测试的都是真实观测。模拟数据中存在一些在-3到4震荡的月份,如果删除这些月份的数据结果会如何呢。这里就要区分工作和比赛的区别了,工作中这种问题其实是开放的,要根据线上真实场景的数据分布来灵活决定,比赛中已经明确了那一百多个例子就是用来决定成绩的。虽然早说过时间序列不能太在意成绩,但也不能太佛系了。
把soda的分布和cmip的分布画在一起的话,可以看到真实观测值更集中,也就是方差更小一些。同时整体分布更偏右一些,这预示着从cmip训练出的值加一个小的常数可能可以用来提分。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fl2cNwah-1674034087098)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5a53f19e-8cdb-4282-bc38-2a368cc87a4f/Screen_Shot_2021-02-27_at_9.48.40_PM.png)]
这里是二者之间label的关系。可以考虑进行的尝试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L5lxmNeu-1674034087098)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f1d2cd7f-4db4-4321-8612-e6d4a4a54545/Screen_Shot_2021-02-28_at_12.04.30_PM.png)]
分数降了也是
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtUNuVYO-1674034087099)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/501adc4c-7699-41af-b448-40f2c75e0e44/Screen_Shot_2021-02-28_at_3.06.12_PM.png)]
接着研究soda和cmip特征之间的关系。首先要注意到的现象是NA值。而且所有的真实观测值soda中不存在缺失值,但cmip中存在,据说是一些模拟无法得出陆地的情况,所以可以画出来看一看了解数据。
由于对机理知识不懂,所以作为外行人这里并不知道陆地上的这些参数是否会影响到nino现象。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ncTEb64o-1674034087099)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1a7234e3-d528-40b6-b185-e3bb3518fa0d/Screen_Shot_2021-02-27_at_11.04.40_PM.png)]
首先听说存在NA值、并且这些NA值是陆地是从群里听说的。自己画出来才有了更深的感受,首先就是sst、t300、ua、va几个观测值的中的缺失情况并不相同,再者就是cmip由多个模式组合在一起,看起来是有几个模式是存在缺失的,几个模式也并不相同,而且这几个模式都是cmip6里的。
说到任务特点就不得不提到时间和空间。可以沿着这条线路继续探讨时空关系。NINO3.4指标其实特指纬度-5 ~ 5,经度190 ~ 240的平均海水温度异常。但训练数据给出了更多经纬度的数据,而且用全量数据的效果还不错。猜想的原因是一些空间的规律会转化为时间的未来,也就是说现在比较远的地方的温度在未来会随着洋流漂到NINO3.4的区域里,从而根据空间关系来预测时间上的未来。
画图验证一下是否正确。
然后如何将规律应用到模型中呢?
baseline分数从20.8降为15.4。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BHVD9Qks-1674034087099)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/099befaa-294d-476c-a1e9-a870c1b986b2/Screen_Shot_2021-02-27_at_8.39.18_PM.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TA5II2TY-1674034087099)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e575c404-7c87-4efd-ba8b-0fa62b6f09a8/Screen_Shot_2021-02-28_at_10.42.44_PM.png)]
为了既利用好时间关系也利用好空间关系,不妨用dynamic decoding的方式预测出24个月。再试一试
另一个值得注意的现象是NA值。而且所有的实验值soda中不存在缺失值,但cmip中存在,据说是一些模拟无法得出陆地的情况,所以可以画出来看一看了解数据。
从训练集和测试集的分布。
不采用全量的数据集,而是随机取12个月的采样。4个模型的结果进行平均,成绩有一些提高。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IwqwC3Sv-1674034087099)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e2005eeb-e78f-4dbf-9ddb-b94d11ca8cb9/Screen_Shot_2021-02-28_at_11.15.37_PM.png)]
当无法确定有效的验证方式,机理上可以提高的指的一试;或者类型较相似的又提高了内部的可以一试。
fine tune
提高了0.5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O2LhKxBx-1674034087100)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/598de344-58ff-40cc-b7bd-a48fdb300722/Screen_Shot_2021-03-02_at_10.35.38_PM.png)]
把filter0-99去掉以后,直接从32降到20分,WTF。有可能是因为早停的影响,13个epoch下降到4个epoch
数据发现:
NINO指标离谱的大或者小的,ua和va的数值变化较大
数据上,一直一位计算指标metrics是不是写错了,既然官方觉得没问题,
恰好再做一次cross validation的时候,发现指标竟然是30多,也就是和排行榜上我的分数接近。当然我去提交了一下,一种暴雷的感觉
把本地验证的数据集记录下来后发现问题并不简单
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tp6xHiNK-1674034087100)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bc0eb713-cb9f-4167-98cf-6d536e3799e3/Screen_Shot_2021-03-10_at_3.57.59_PM.png)]
而且,月份的周期性更强一些
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKGFU7rr-1674034087100)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0e5b0a9b-94e0-4d22-84aa-418ead3b6a46/Screen_Shot_2021-03-10_at_3.55.53_PM.png)]
以上似乎是弯路
研究月份之间的关系的时候,发现相邻月份的diff也没啥规律。除了1月,一月很容易发生什么吗
更改数据范围后,分数越来越低。证明线上测试集确实和之前的soda不大一样,
例如同样一个参数,怎样调整才是提分那个呢?
我原本的dropout是0.2,我一开始想调成0.15,线下验证也提高了。但是转头一想,前几次线下提高的线上都掉分了;不妨反方向思考一下,就调整成0.22了,线下掉分。提高后就出去走了一会,感觉意外的往上shake反而让自己有了压力。回来后,果然有点效果,从41.97升到了42.18。
那继续试一下dropout到0.25 \0.26试试,线下。这种逆向思维实在是很功利和无奈啊。