1. 气象数据基础:从哪儿来,长什么样
做气象深度学习,第一关就是数据。说实话,很多初学者一上来就调模型,结果数据都没搞明白,最后模型跑出来全是噪声。我刚开始做气象预测时也踩过这个坑——拿着卫星数据当站点数据用,结果可想而知。
今天咱们就把气象数据的底裤扒干净。你想想看,气象数据无非就三个问题:从哪来?有哪些变量?存成什么格式?搞明白这三件事,后面建模就顺了。
1.1 数据来源:三种观测手段
气象数据不是天上掉下来的。目前主流来源就三种,我一个个说。
气象站
这是最传统的。全国有数万个自动气象站,每个站每隔几分钟就上报一次数据。温度、气压、湿度这些基础变量,站点数据最准。
但有个问题——站点分布不均匀。东部密密麻麻,西部稀稀拉拉。我做项目时遇到过,用站点数据做空间插值,西部地区的预测误差能大好几倍。嗯,这里要注意,站点数据适合做时间序列预测,但做空间预测就得小心了。
卫星
卫星数据覆盖面广,能覆盖海洋、沙漠这些站点到不了的地方。但精度不如站点。说白了,卫星是"遥感",隔着几百公里看地球,肯定有误差。
我个人习惯,做区域预测时用卫星数据,做单点预测时用站点数据。两者结合效果最好。
雷达
雷达主要看降水。多普勒雷达能反演降雨强度,还能看风场。但雷达数据有个坑——容易受地形遮挡。我曾经在山区项目里用雷达数据,结果山背面全是盲区,模型直接崩了。
1.2 常见气象变量:五大金刚
气象变量很多,但深度学习里常用的就这几个。我按重要性排个序:
| 变量 | 单位 | 预测场景 | 我的经验 |
|---|---|---|---|
| 温度 | ℃ | 短期预报、农业 | 日变化规律明显,LSTM效果好 |
| 气压 | hPa | 天气系统判断 | 变化缓慢,适合做长期趋势 |
| 湿度 | % | 降水预测、雾霾 | 非线性强,需要归一化 |
| 风速 | m/s | 风能、灾害预警 | 突变多,用CNN提取空间特征更好 |
| 降水 | mm | 洪水、农业 | 零值多,需要特殊处理 |
为什么会这样排序?因为温度和气压相对"乖",变化有规律。风速和降水就"调皮"多了,尤其是降水,大部分时间是0,突然来一场暴雨。我曾经用MSE损失函数做降水预测,结果模型学出来全是0——因为大部分时间确实没下雨,模型偷懒了。后来改用分位数损失才解决问题。
1.3 数据格式:NetCDF、GRIB、CSV
搞气象的,天天跟这三种格式打交道。我刚开始接触时也懵,后来发现其实没那么复杂。
NetCDF
这是气象界的"通用语言"。NetCDF文件能存多维数据,比如时间×纬度×经度×变量。说白了,就是个四维数组。我用Python的xarray库处理NetCDF,一行代码就能读出来:
import xarray as xr
ds = xr.open_dataset('temperature.nc')
# ds 里就有时间、纬度、经度、温度四个维度
print(ds['temp'].values.shape) # (365, 181, 360) 一年数据
NetCDF的好处是自带元数据。比如温度的单位、缺失值标记,都写在文件里。我建议新手优先学NetCDF,因为生态好,工具多。
GRIB
GRIB是气象预报领域的"老大哥"。欧洲中期天气预报中心(ECMWF)的数据基本都是GRIB格式。GRIB比NetCDF压缩率高,但处理起来麻烦点。
我曾经用GRIB数据做全球风场预测,结果发现不同版本的GRIB编码方式不一样。嗯,这里要注意,GRIB版本1和版本2的读取方式不同,用pygrib库时要指定版本。
import pygrib
grbs = pygrib.open('wind.grib2')
grb = grbs.select(name='10 metre U wind component')[0]
data = grb.values # 拿到风速数据
CSV
CSV最简单,但最"笨"。一行一个时间点,一列一个变量。适合小规模数据,或者做快速验证。但CSV没有空间信息,做空间预测时别用。
1.4 知识体系总览
说了这么多,咱们用一张图把整个知识体系串起来。我画了个流程图,你看看:
这张图把咱们今天讲的内容串起来了。你看,数据来源、变量、格式,三者是相互关联的。比如卫星数据常用NetCDF格式,站点数据可能存成CSV。搞明白这些关系,后面选数据、做预处理就有方向了。
好了,气象数据基础就讲这么多。记住一句话:数据质量决定模型上限。你喂进去的是垃圾,吐出来的肯定是垃圾。下一章咱们聊聊数据预处理,那才是真正考验功力的地方。
公众号:蓝海资料掘金营,微信deep3321