数据挖掘:提升数据敏感度

前言

之前的文章介绍过数据敏感度]。

对数据的认识和解读是高质量的完成任务的关键,因为本篇通过实例讲述如何通过对数据的认识来提高模型的精度。

基本步骤:

  • 了解数据
  • 猜想原因
  • 根据原因确定模型优化方向

作为一个到了被优化年纪才开始邯郸学步,从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)]

主要的优化方向:

  • 数据(如何选取训练数据、验证数据)
  • 特征(如何做好特征抽取、转化、筛选)
  • 模型(模型结构、优化方法、损失函数等)
  • 验证
  • 后处理(包括模型融合、TTA等)

对于时间序列问题,最最重要的是保持一个学习的心态去尝试,否则体会了太多大起大落后可能心灰意懒。尤其这道题,数据量不大感觉非常需要运气。

首先,了解数据的基本类型和结构:

  • 基本的时空数据,包含时间和空间关系
  • 特征变量有4个(sst t300 ua va)、目标变量NINO3.4
  • 根据12个月的历史观测值预测未来24个月
  • 包含102年的soda、和更多的模拟值cmip

由于任务的目标还是预测真实观测值,所以首先探索一下真实观测数据(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的关系。可以考虑进行的尝试

  • 尝试一:只截取soda中常见范围的cmip进行训练,[-1.5652~ 2.0985]二者分别为其1%~99%百分位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]

分数降了也是

  • 尝试二:将cmip训练的模型,预测时都加上0.04。0.04是二者中位数的差

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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里的。

  • 尝试一:把含NA的都去掉
  • 尝试二:把ua和va去掉
  • 尝试三:填充缺失值,baseline中的方法是填充为0
  • 尝试四:把所有数据的陆地数值都mask掉

说到任务特点就不得不提到时间和空间。可以沿着这条线路继续探讨时空关系。NINO3.4指标其实特指纬度-5 ~ 5,经度190 ~ 240的平均海水温度异常。但训练数据给出了更多经纬度的数据,而且用全量数据的效果还不错。猜想的原因是一些空间的规律会转化为时间的未来,也就是说现在比较远的地方的温度在未来会随着洋流漂到NINO3.4的区域里,从而根据空间关系来预测时间上的未来。

画图验证一下是否正确。

然后如何将规律应用到模型中呢?

  • 尝试一: 模型输入只采用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)]

  • 尝试二:将目标区域的序列输出与整体区域的序列输出concat到一起。
  • 尝试三:进一步推想,预测第一个月的时候关注的空间可能就是NINO3.4很近的区域里,而预测第24个月的时候除了时间周期外,也需要关注的是现在离nino3.4较远的趋势。所以需要不同目标月的模型提取空间特征的时候要灵活。现在的模型对1-24目标月采用了同样参数的CNN进行空间特征提取,这里是有优化空间的。
  • 尝试三.1: 最容易想到的其实是针对1-24个月训练24个独立模型。针对这种方式不妨一个月一个月的建模,为了看有没有效果。不过效果较差,直接降为-18分,其实训练的时候多少能看出来点眉目,就是不同模型之间的损失函数几乎都在完全不同的程度,证明各自几乎都在独立区间里,由于前后时间肯定是有关联的,一个loss在0.4一个完全在1.8就丢掉了这种关系。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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试试,线下。这种逆向思维实在是很功利和无奈啊。

你可能感兴趣的:(数据挖掘,人工智能)