ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

葵花8 AHI 16波段+机器学习:地面太阳辐射反演全流程实践

葵花8 AHI 16波段+机器学习:地面太阳辐射反演全流程实践 简介面向遥感与机器学习初学者的完整示例包演示利用葵花8号AHI传感器多光谱数据反演地面太阳辐射将卫星影像处理与监督学习流程串联覆盖从数据读取、特征构建到模型预测的典型环节适用于气候研究、环境监测及能源管理方向的算法验证与课题复现。包体共3个文件约2.58MB核心包括Python脚本、训练好的模型文件和示例CSV数据脚本完成数据准备与推理调用模型文件保存已训练权重可直接加载预测CSV样例数据便于快速跑通流程。目前已有251人学习。借助这套小规模工程包读者可快速看到从AHI数据到辐射估算结果的最小闭环既能理解遥感反演与机器学习结合的落地思路也能在自备数据上替换输入、微调参数或扩展特征进一步开展对比实验。1. 把AHI的16个波段装进机器学习模型地面太阳辐射反演这件老事的新做法一座偏远的光伏电站想评估年发电量最难拿到的不是天气数据而是“这片山头一年到底晒到多少太阳”。地面辐射站太稀疏一个省往往只有十几个点而太阳辐射在空间上的变化又极其剧烈——一朵云过去辐照度能掉一半。葵花8卫星的AHI传感器每10分钟扫一遍东亚—西太平洋区域16个波段同时记录可见光反射率和红外亮温云、气溶胶、水汽的痕迹都在里面。传统反演是拿这些观测值去跑辐射传输模型等几分钟算一个像元还要额外输入大气廓线和气溶胶光学厚度用机器学习做地面太阳辐射反演则是直接让模型学“AHI看到了什么地面实际收到了多少”训练好之后一张全圆盘的辐照度图几秒钟就能推完。这篇文章把这个zip背后的完整流程拆开讲数据怎么拉、特征怎么造、模型怎么训、坑在哪里。适合做光伏资源评估、农业气象、遥感反演的工程人员照着复现。2. 跳过辐射传输模型为什么ML反演能又快又稳地输出地面辐照度2.1 AHI的16个波段里真正参与反演的主力和辅助AHIAdvanced Himawari Imager是葵花8的核心载荷16个波段覆盖0.47μm到13.3μm。其中可见光和近红外有6个波段B01–B06空间分辨率0.5~1km红外有10个波段B07–B16分辨率1~2km。10分钟一次全圆盘扫描这个时间分辨率是极地轨道卫星给不了的——太阳辐射反演最怕的就是云的变化10分钟已经能把大部分云团运动捕捉进来。做反演特征时16个波段不是等权重的。B030.64μm是可见光主通道云的反射率比地表高一截越厚的云反射越强对应到地面的辐射越低这条负相关是整个模型的骨架。B040.86μm对植被和水体的响应和B03不一样可以用来区分“植被上的薄云”和“裸地上的厚云”。B051.6μm和B062.3μm则是最关键的辅助通道——雪在这两个波段的反射率会掉到很低而云依然很亮。如果模型只喂了可见光通道雪天就会把积雪当成云把晴天反演成阴天这个坑我在后面专门讲。红外通道里B1310.4μm到B1512.4μm这一组负责云顶温度和云厚度。B14和B15的亮温差是经典的分裂窗云检测判据差值越大说明云越薄或者有半透明卷云。B086.2μm和B096.9μm是水汽通道它们对高层水汽敏感在中纬度夏季的对流天气里很有用但统计上容易和B13–B15产生共线性加不加要看特征重要性的排序结果。2.2 物理模型与ML模型的取舍什么场景下换机器学习路线更划算传统反演的路子是把AHI的表观反射率送进辐射传输模型比如DISORT或者LibRadtran反推地表短波辐照度。这个路线的优势是物理过程清楚模型在训练数据覆盖不到的地区也有物理约束。但实操里有三个硬伤。第一辐射传输模型需要输入大气温度廓线、湿度廓线、臭氧总量、气溶胶光学厚度。这些参数本身往往来自再分析资料或者别的卫星反演产品每一层都带误差误差叠到最后可能比你省掉的那部分物理过程还要大。第二慢。全圆盘一个时次有上亿个有效像元逐像元跑辐射传输再快的机器也得算半天。常见的折中方案是提前算好查找表LUT但LUT的维度一多存储和检索又成了问题。第三云参数化是辐射传输里最不确定的一环三维云场的辐射效应本身还是一个开放问题。机器学习路线干脆绕开这些。AHI观测到的反射率和亮温已经包含了大气和云的累积效应地表辐照度是这些观测值的某种函数。模型要做的只是逼近这个函数。训练集覆盖到的天气类型里ML反演的精度可以做到和物理模型相当甚至更好典型晴天的RMSE在30~50 W/m²云的误差会大一些。推理时延几乎为零这是光伏功率预测这类业务最看重的一点。选型建议很直接如果目的是区域资源评估、光伏电站选址、短临功率预测ML方案划算得多如果要做气候尺度的物理一致性分析可以用ML做快速预判再挑关键日期用物理模型复核。至于“机器学习反演是不是黑匣子”我的看法是——它确实是黑匣子但你可以用残差分析打开它这点放到最后一章说。3. 拉数据先对齐时间再对齐坐标AHI L1与BSRN站点的匹配细节3.1 下载AHI的常见渠道和NetCDF文件的基本组织方式葵花8的L1级网格数据常见做法是从JAXA的P-Tree系统拉取注册账号后按时间范围选择区域和波段。文件命名类似HS_H08_YYYYMMDD_hhmm_B03_FLDK_R10_JP03.nc中间那段是观测时刻UTCB03是波段号FLDK代表全圆盘。全圆盘文件体积不小按小时下载后要及时整理别让磁盘吃紧。NetCDF文件里每个波段是单独一个文件所以要把多个波段拼到一个数据集里。数据的组织方式通常是y和x两个维度配套的lat和lon是二维数组。这里有一个很关键的细节L1可见光通道存的是反射率通常按量化的整数存储比如实际反射率乘以10000后存成int16红外通道存的是亮温单位开尔文也要注意scale_factor。很多第一次做的人忘了除以scale_factor特征量纲直接错掉模型跑出来的结果跟噪声一样。打开文件之后先打印一下变量的属性看清楚单位、scale_factor和valid_range再动手。另一个节省时间的技巧是做站点级别的反演时根本不用处理整个全圆盘。先根据站点坐标把文件裁成一个几度的窗口后面所有计算都在这块小区域上进行。这个裁剪看起来简单但对IO和时间都是数量级的优化。3.2 地面站点实测辐照度BSRN数据清洗和三类必须抓的坏值葵花8反演的地面“真值”一般用BSRN国际基准辐射网络的站点数据东亚地区可用的有日本Tateno等站点提供1分钟或3分钟的GHI全球水平辐照度、DNI和DIF。BSRN的数据质量好但也不是拿来就能用。第一类要抓的是负值。夜间或者仪器零点漂移会导致很小的负辐照度直接置零即可。第二类是物理极限值。当太阳天顶角小于85°时GHI不可能超过太阳常数1361 W/m²乘以天顶角余弦再乘一个日地距离修正系数超出这个上界的数据直接删掉。第三类是时间戳对齐问题。卫星观测是一个瞬间时刻而站点给出的是某一分钟的平均值直接取站点在卫星过境时刻前后2分钟的均值最稳妥。另外BSRN的时间戳是UTCAHI的时间戳也是UTC这一步不会有时区坑但如果你混用了地方时整个标签就全错了。3.3 最近邻还是3×3均值站点与卫星像元的匹配代码匹配这一步是整个流程里最容易翻车的地方。AHI全圆盘的lat/lon是二维数组不能简单用一维差值取最近索引。下面这段代码先用粗过滤裁出站点附近的窗口再在窗口里找距离最近的像元最后取3×3邻域均值作为特征。import xarray as xr import numpy as np # 站点坐标示例日本TatenoBSRN站点 site_lat, site_lon 36.05, 140.13 # 读取葵花8 L1 NetCDF单波段示例 ds xr.open_dataset(HS_H08_20220101_0000_B03_FLDK_R10.nc) lat2d ds[lat].values lon2d ds[lon].values data ds[reflectance].values # 注意先检查 scale_factor # 1) 粗过滤只保留站点周边 2 度窗口避免对全圆盘算距离 mask (np.abs(lat2d - site_lat) 2.0) (np.abs(lon2d - site_lon) 2.0) ys, xs np.where(mask) ymin, ymax ys.min(), ys.max() xmin, xmax xs.min(), xs.max() lat_crop lat2d[ymin:ymax1, xmin:xmax1] lon_crop lon2d[ymin:ymax1, xmin:xmax1] data_crop data[ymin:ymax1, xmin:xmax1] # 2) 在窗口内找最近邻像元 dist (lat_crop - site_lat)**2 (lon_crop - site_lon)**2 iy, ix np.unravel_index(np.argmin(dist), dist.shape) # 3) 取 3x3 邻域均值抵消配准误差 iy0, ix0 max(iy-1, 0), max(ix-1, 0) patch data_crop[iy0:iy2, ix0:ix2] feature float(np.mean(patch))代码的逻辑分成三步粗过滤减少距离计算的规模最近邻定位到站点所在像元3×3均值把邻域信息揉成一个值。为什么不用单像元卫星和地面站之间有一个像元左右的视线配准误差对可见光通道来说单像元的反射率可能在云边界上跳变3×3均值能平滑掉这种跳变。代价是损失一点空间细节但对反演辐照度这种空间平滑量来说完全值。这里要特别提一句如果做的是区域辐照度图而不是站点单点就不要做3×3裁剪了保留完整的空间分辨率把整块区域的特征张量直接喂给模型最后输出的每一像元都是一条反演结果。4. 特征工程与XGBoost基线一条能跑出RMSE的反演流水线4.1 先造太阳几何特征再加通道组合特征模型输入不能只有16个通道的观测值太阳几何必须进去因为地表辐照度首先服从太阳高度角的变化。最常用的三个特征是太阳天顶角的余弦、太阳方位角的正弦和余弦。方位角本身是循环量直接用角度值会让模型误以为0°和359°差很远拆成正弦余弦两个特征就没了这个问题。日地距离修正系数也可以作为特征加进去虽然它的变化只有±3%但在长时序训练里能减少季节性的伪相关。通道特征里B01到B06的反射率通道建议保持原始数值不做归一化也能跑GBDT但如果有量纲不一致的通道先都缩放到0~1之间更好调参。红外通道的亮温单位是开尔文数值在200~330之间和反射率不在一个量级GBDT对特征尺度不敏感但如果你后面对照着做神经网络就需要把特征都标准化。衍生特征里我一般固定加三组。第一组是B03除以B06雪和云的判据主要靠它雪在1.6μm反射率骤降比值会异常偏大第二组是B13减B15厚云和薄云的分野第三组是B03和B13的差值用来粗略区分低云和高云低云顶部温度高和高云的亮温差在数值上差别明显。这三组特征对云的刻画能力比单纯加通道强很多而且在特征重要性排序里常年排在前列。时间特征要不要加小心一点。直接把小时和儒略日扔给模型模型可能会记住“某个站点某个钟头的历史平均”而不是学习辐射物理。如果一定要加把儒略日拆成正弦余弦两个连续特征这样至少不会在跨年边界产生突变。4.2 训练集绝不能随机打乱按连续时间块划分划分训练集和验证集是反演任务里最容易被忽略的步骤。随手train_test_split(random_state42)一下十有八九会得到令人惊喜的验证RMSE但一上真实预报全露馅。原因很简单相邻10分钟的样本高度相关随机打乱会导致验证集里混着大量训练集样本的“隔壁时刻”模型等于偷看了答案。正确做法是按连续时间块划分。比如2019到2021年每个月抽7天生成训练样本2022年全年做验证。这样验证集里的每一条样本在时间上和训练集至少隔开了一段距离考验的是模型真正的泛化能力。样本量如果太大还可以按日期分桶做K折但千万不要按样本行做K折。4.3 最小训练脚本从特征表到RMSE的完整代码下面这个脚本可以直接跑。特征表是我用前面几步生成的DataFrame一行代表一个站点一个时刻列是特征ghi列是站点实测辐照度。import pandas as pd import numpy as np import lightgbm as lgb from sklearn.metrics import mean_absolute_error, mean_squared_error # 读取第3节生成的训练样本表 df pd.read_parquet(ahi_ghi_dataset.parquet) # 按时间不重叠划分训练集2019-2021验证集2022 train df[df[time] 2022-01-01] valid df[(df[time] 2022-01-01) (df[time] 2023-01-01)] feature_cols [ sza_cos, saa_sin, saa_cos, earth_sun_distance, B01, B02, B03, B04, B05, B06, B07, B08, B09, B10, B11, B12, B13, B14, B15, B16, B03_B06_ratio, B13_minus_B15, B03_minus_B13 ] X_train, y_train train[feature_cols], train[ghi] X_valid, y_valid valid[feature_cols], valid[ghi] model lgb.LGBMRegressor( n_estimators800, learning_rate0.05, num_leaves63, subsample0.8, colsample_bytree0.8, random_state42 ) model.fit(X_train, y_train) pred model.predict(X_valid) rmse np.sqrt(mean_squared_error(y_valid, pred)) mae mean_absolute_error(y_valid, pred) mbe np.mean(pred - y_valid) print(fRMSE{rmse:.2f} W/m², MAE{mae:.2f} W/m², MBE{mbe:.2f} W/m²)LightGBM的参数需要解释一下。num_leaves63控制单棵树的复杂度对十万级样本的反演任务来说63到127之间是一个合理区间再大就容易记住站点周边的局部噪声。subsample0.8和colsample_bytree0.8分别是行采样和列采样加了之后能明显降低过拟合。learning_rate0.05配n_estimators800树的棵数已经不少如果验证集RMSE继续下降可以再把学习率降到0.03并适当增加迭代轮数。指标不要只看RMSE。MBE平均偏差反映系统性的高估或低估如果模型在晴天整体偏高MBE会直接暴露出来。一般反演业务要求MBE绝对值在10 W/m²以内否则光伏站点预测的月度发电量会明显漂移。这里只给了GBDT基线。GBDT的好处是对特征尺度不敏感、训练快、特征重要性可以直接用适合先把流程跑通。跑通之后再考虑上卷积网络把3×3邻域或者更大窗口的空间信息直接作为模型输入精度还能往上走一截但排错的难度也会翻倍。5. 葵花8反演避坑指南让模型翻车的五个细节5.1 验证集RMSE虚低上线预报就翻车现象训练集和验证集都用随机划分验证RMSE漂亮得惊人30 W/m²左右换到一整年连续数据做预测误差直接翻倍。原因相邻时刻的卫星观测和地面辐照度强相关随机划分造成信息泄漏验证集里全是训练样本的“邻居”模型等于开卷考试。解决改成按连续时间块划分训练集和验证集在时间上完全断开。如果数据跨越多年还可以做按月的分组验证看看模型在不同季节上的稳定性。5.2 晴空误差很小一到多云天就崩现象分场景统计误差时晴天的RMSE只有30多多云天却到90以上整体指标被云拖着走。原因云天样本占比低模型把主要容量都用来拟合晴空规律了。更麻烦的是云的形态太多层云、积云、卷云的辐射特征完全不一样样本不均衡时模型学不全。解决训练时按云量分层采样。可以用AHI自带的云检测产品CLM给样本打标没有的话用B03反射率粗判训练集里保证云和非云的比例接近1比1。还有一种做法是对云天样本复制或加权但加权更稳妥复制容易过拟合。5.3 日出日落时段预测系统性偏低现象太阳天顶角大于70°时模型预测值整体偏低早上和傍晚尤其明显。原因低太阳高度角下阳光穿过的大气路径更长可见光反射率对云的响应变钝同样的云量在傍晚看起来和早晨不一样。另一个原因是训练样本里低角度样本占比少模型没学够。解决最简单的办法是在训练时剔除天顶角大于80°的样本反正光伏出力在这个时段也可忽略。如果业务需要全时段输出把天顶角余弦作为一个特征同时按天顶角分层采样保证低角度样本不缺失。5.4 雪天把雪当云晴天被反演成阴天现象冬春季节的晴天反演结果偏低误差分布的峰值恰好对应降雪后的地表。原因雪的可见光反射率和云很像模型在可见光通道上分不清二者于是把积雪当成云推算出“少得”的地面辐射。解决把B051.6μm和B062.3μm通道加进特征或者直接用B03和B06的比值做衍生特征。雪在短波红外的反射率远低于云这个比值能把雪和云切开。如果覆盖范围包括高纬度地区这个特征几乎是必加的。5.5 站点反演准离站50公里就漂现象模型在BSRN站点位置的验证误差可以接受但把整张区域辐照度图画出来离站点越远越不对劲。原因站点训练样本只代表了站点的局地环境。山区尤其明显一个山谷里的站点和对面山脊的辐照度差异很大但卫星像元分辨率是1~2公里模型学不到这种微地形信息。解决在训练集里加入更多空间分散的站点如果只有单站数据就不要指望模型输出高精度的区域图把输出结果折算成晴空指数的距平会更稳妥。另一种思路是用DEM高程做地形校正特征至少能修正一部分海拔带来的系统性偏差。6. 残差里藏着物理用时空切片验证模型学会了什么模型训练完先别急着上业务。用验证集把预测值和实测值做差得到逐时次的残差然后按三个维度去切太阳天顶角、季节、云量。这一步能告诉你模型到底学的是物理规律还是数据记忆。按太阳天顶角切残差把天顶角从10°到80°分成几个区间每个区间算平均残差。如果模型在低角度区间出现系统性负偏说明余弦特征没有起到应有的作用回到特征工程里查太阳几何的计算是否有误。按季节切残差重点看梅雨季节和冬季这两个季节云的类型差异大模型如果在梅雨季整体偏高通常是水汽通道的特征权重不够。按云量切残差时可以用模型输出的晴空辐照度做归一化画一条“残差随云量变化”的曲线曲线如果在云量中等区间出现明显的尖峰说明样本不平衡的问题还没根治。还有一个值得做的互较实验挑几个典型日把模型输出的逐时辐照度日变化曲线和实测曲线画在一起再叠一条由辐射传输模型算出的晴空曲线。晴空日如果模型曲线和物理模型曲线、实测曲线三者贴合说明模型的晴空物理是正确的云天日如果模型和实测贴合但和物理模型偏离说明ML至少在统计意义上抓住了云的效应。这几年做反演我最后悔的事不是调参不到位而是最开始没花足够时间做数据对齐。特征和模型随时可以重来但时间戳错位、坐标偏移、尺度因子没还原这些错误会让后面所有工作都建在流沙上。在这个zip里真正值钱的不是某个模型结构而是一条从原始遥感文件到干净训练样本的流水线。希望帮到你。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进