前言

这篇论文《Harvesting AlphaEarth: Benchmarking the Geospatial Foundation Model for Agricultural Downstream Tasks》是一项非常严谨且具有实操指导意义的研究。它由斯坦福大学和Corteva Agriscience(科迪华)团队完成,重点评估了Google DeepMind新推出的AlphaEarth Foundation (AEF) 地理空间基础模型在农业关键下游任务中的表现。


第一部分:论文深度解读(核心流程与发现)

1. 研究背景与痛点

传统遥感(EO)在农业应用中面临三大瓶颈:

  • 数据异构性:多源卫星(光学、雷达、气候)的数据格式、分辨率、重访周期不一致,难以直接融合。
  • 数据缺失:云层遮挡、轨道重叠差异导致时序数据存在大量空洞。
  • 标签昂贵:训练监督学习模型需要大量的地面真实标签(如产量、耕作方式),这非常耗时耗力。

AEF的出现:Google DeepMind预训练的AEF(约4.8亿参数,基于约30亿张图像),通过自监督学习提取通用的地理空间表征,并以64维嵌入向量10米分辨率的形式公开在Google Earth Engine (GEE) 上,覆盖2017-2024年。这号称让研究者绕过了复杂的遥感预处理,直接“开箱即用”。然而,AEF的官方评测主要基于土地覆盖分类,在农业动态监测(如产量预测、耕作/覆盖作物检测)上缺乏系统评估。这篇论文正是为了填补这一空白。

2. 核心实验流程与方法论

2.1 数据来源与标签

研究涉及三种农业下游任务,覆盖县级(区域尺度)田块级(微观尺度)

  • 产量预测:针对玉米、大豆、冬小麦。标签来自美国农业部(USDA-NASS)的县级官方统计,以及Corteva公司提供的田块级收割机实测产量记录(超过18万条记录)。
  • 春季耕作制图:分类为高强度耕作(传统)和低强度耕作(保护性/免耕)。标签来自USDA的农业普查(县级)和Corteva的农户提交记录(田块级)。
  • 覆盖作物制图:二分类(有无种植覆盖作物)。标签来自Corteva的农户记录(2018-2024年,田块级)。
    在这里插入图片描述

2.2 特征工程:AEF vs 传统遥感 (RS)

研究核心在于对比AEF嵌入和传统遥感特征。

  • AEF模型组:直接使用GEE上的64维AEF嵌入,无需任何预处理。
  • 传统遥感组 (RS):极为精巧的特征工程。
    • 光谱:Landsat 7/8/9的六波段地表反射率。
    • 植被指数:NDVI(归一化植被指数)、GCVI(绿度叶绿素植被指数)。
    • 耕作指数:NDTI、STI、CRC(用于检测作物残茬)。
    • 气候:ERA5-Land的累积降水(PPT)和积温(GDD)。
    • 地形:USGS 3DEP高程数据。
    • 时序处理:论文使用了二阶谐波回归(Harmonic Regression)拟合作物生长季的光谱时序曲线,提取出振幅、相位、峰值前后积分面积等80多个物理意义明确的特征。
      在这里插入图片描述

2.3 模型与评估方案(非常关键的亮点)

为了防止因空间自相关导致的性能虚高(即相邻农田气候、土壤相似导致评估被夸大),论文并未采用简单的随机交叉验证(Random CV),而是设计了四个评估维度:

  1. State-Year CV(州-年交叉验证):将同一个州、同一年的数据作为一个整体,放入训练集或测试集,避免空间和时间上的数据泄漏。
  2. Yearly CV(逐年交叉验证,即留一年法):模拟真实业务场景,用过去几年训练,预测未来一年。
  3. Scale-Transfer(尺度迁移):在县级尺度上训练模型,然后在田块尺度测试(考验模型的跨尺度泛化能力)。
  4. Space-Transfer(空间迁移):在美国玉米带东部生态区(ETF,湿润气候)训练,在西部生态区(GP,干旱/半干旱气候)测试,甚至进一步做到美国至阿根廷的跨国测试(考验模型的跨区域泛化能力)。

3. 核心实验结果(颠覆性发现)

3.1 本地与时间泛化性能

  • 结论:在State-Year CVYearly CV下,AEF模型与传统RS模型性能相当(甚至略好)。例如,县级玉米产量预测的R²均在0.78~0.80左右。AEF在时间泛化上稍有优势。
  • 意义:说明AEF嵌入确实能够有效捕捉作物生长过程中的核心信息,且不需要复杂的预处理,支持“开箱即用”。
    在这里插入图片描述

3.2 尺度迁移性能(Scale-Transfer)

  • 结论AEF模型严重落后于RS模型。
  • 解释:AEF嵌入是10米分辨率的,但在县级训练时,研究人员将田块级AEF像素聚合成县级均值。这种聚合操作稀释了田块内的微观异质性信息。相反,传统RS特征(如VIs)具有直观的物理意义,即便在粗糙尺度下,依然保留了结构性的植被信号,因此跨尺度泛化能力远超AEF嵌入。

3.3 空间迁移性能(Space-Transfer)—— 最致命的弱点

  • 结论:在跨区域(东部到西部,以及美国到阿根廷)的产量预测中,AEF模型惨遭滑铁卢。例如在美国至阿根廷的转移中,AEF的R²跌至负值(约-2.13),意味着预测完全失效;而传统RS模型的R²依然能维持在0.27左右。
  • 解释:AEF嵌入虽然是“通用表征”,但不同地区、不同国家因气候带差异,相同的AEF嵌入维度(例如A05这个波段)在不同区域可能编码了完全不同、甚至无关的物理信号。具体来说,A05在美国西部与GCVI(植被绿度)强相关,但在东部却几乎不相关。因此,AEF模型学到的权重无法在跨区域场景下应用。
    在这里插入图片描述

3.4 可解释性(XAI)问题

  • 结论:AEF的64个波段(A00至A63)没有明确物理意义。论文发现,在玉米产量预测中,A05 是最重要的特征,但它可能是“温度”和“绿度”的混合体,且在不同作物(玉米、大豆)间,重要的波段完全不同,这导致AEF模型如同“黑盒”,难以被农业专家信任和修正。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

第二部分:深度中文技术博客(不少于5000字)


深度评测AlphaEarth:地理空间基础模型在农业下游任务中的“成色”如何?

导语:近年来,以Google DeepMind的AlphaEarth Foundation (AEF) 为代表的地理空间基础模型(Geospatial Foundation Models, GFMs)可谓风头无两。它们号称通过自监督学习在全球数十亿张遥感图像上训练,能够“一键提取”通用地理特征,让研究者无需再为数据预处理和模型训练发愁。然而,这些“万能模型”在高度动态、高度依赖物理机理的农业领域中,是否真的如宣传般神奇?近日,斯坦福大学与Corteva Agriscience联合发表了一项重磅基准测试研究,对AEF在产量预测、耕作制图、覆盖作物制图三大关键农业任务进行了全面“体检”。本文将带你从数据到模型、从算法到评估,深入拆解这项研究的每一处细节,并为你揭示AEF的真正“利与弊”。


第一部分:为什么我们需要“农业专属”的地球观测大模型?

1.1 遥感农业监测的“三座大山”

在深入剖析AlphaEarth之前,我们首先需要理解现代农业遥感监测面临的困境。过去半个世纪,Landsat、Sentinel、MODIS等卫星群为我们提供了海量的地表观测数据,推动了农业研究的革命。然而,在实际业务场景中,一直存在三大痛点:

  1. 数据异构性(Heterogeneity):不同卫星的光谱波段不同、空间分辨率不同(10米到1000米不等)、时间重访周期不同。如何将这堆“杂牌军”高效融合成一个统一的输入特征,是一个巨大的工程难题。
  2. 数据缺失(Data Gaps):农业尤其依赖时间序列数据来分析作物生长动态。但云层遮挡、轨道间隙会导致时间序列出现大量空洞。数据插值补全往往引入大量误差。
  3. 标签成本高(Label Scarcity):监督学习需要海量标签。但像“作物产量”精确到亩产多少斤,或“耕作强度”这种涉及到土壤管理的行为,绝大多数时候只能依靠农户或科研人员进行耗时、昂贵的田间调查。

1.2 AlphaEarth Foundation (AEF) 的诞生:开箱即用的“地理空间向量库”

为了攻克上述瓶颈,2025年Google DeepMind放出了“大杀器”——AlphaEarth Foundation。这个模型的核心技术特征极具颠覆性:

  • 超级规模:参数量达到4.8亿,预训练数据覆盖全球约500万个地点,使用了约30亿张图像。
  • 多模态融合:输入不再局限于光学卫星,它同时融合了Landsat/ Sentinel的光学、Sentinel-1的雷达、GEDI的激光雷达、ERA5-Land的气候再分析数据、GRACE的重力场、GLO-30的地形数据,甚至维基百科的文本信息
  • 统一编码:通过空间-时间编码器和教师-学生框架,将稀疏、异构的地球观测数据,统一映射到一个64维的嵌入空间
  • “分析就绪”的年度数据:这是AEF最吸引人的地方——它没有像其他大模型那样只开源权重(需要用户拥有昂贵的GPU自己跑推理),而是直接在Google Earth Engine (GEE) 上提供了全球2017-2024年年度的64维嵌入图像,分辨率为10米。

这意味着,过去需要研究生苦干数月去处理的数据下载、去云、插值、波段融合工作,现在只需要几行GEE代码就能直接获取。但问题来了:这种“压缩”后的通用特征,真的适合高度依赖环境因素和物候规律的农业生产吗?


第二部分:实验设计——严谨的“体检”方案

斯坦福团队的这篇论文,核心目的就是回答上述问题。他们没有盲目崇拜AEF,而是设计了一套极具针对性的“四维评估框架”。

2.1 三大农业任务的选择

为了全方位考察AEF的实用价值,作者选取了三个具有代表性的农业下游任务:

  1. 作物产量预测(Yield Prediction):这是一个典型的回归问题。在县级(County)和农田级(Field)两种尺度上,预测美国的玉米、大豆和冬小麦产量。数据来源包含USDA-NASS的公开统计数据和Corteva公司的商业实测数据。
  2. 春季耕作制图(Tillage Mapping):这是一个分类问题(高强度耕作 vs. 低强度耕作/免耕)。作者主要关注玉米带春季的耕翻行为。同样区分了县级统计数据和农田级农户反馈数据。
  3. 覆盖作物制图(Cover Crop Mapping):这是一个检测任务(是否种植了非现金的覆盖作物以保护土壤)。这是最具挑战性的任务,因为覆盖作物的种植和生长往往发生在冬季或初春,常被积雪或厚重云层遮挡。

2.2 对照组特征工程(传统遥感组)

为公正对比,研究团队构建了一套极其精细的传统遥感(RS)基准特征。这不是随便拿几个指数,而是经过了严密的物理特征工程:

  • 降噪与去云:利用Landsat Collection 2的C波段质量掩膜,去除云、云影、雪、水和噪声像素。
  • 作物掩膜:借用USDA的作物数据层(CDL),精确圈定特定作物(玉米、大豆等)所在的像元,排除非农用地的干扰。
  • 二阶谐波回归(Harmonic Regression):这是一个非常经典的遥感时序处理技术。作者对每个生长季的光谱带和植被指数(NDVI、GCVI)进行二阶谐波拟合( (y(t) = c + a_1\cos(2\pi t) + b_1\sin(2\pi t) + a_2\cos(4\pi t) + b_2\sin(4\pi t) ) )。通过这个拟合,把离散的卫星观测变成连续的曲线。
  • 物候特征提取:从拟合曲线上提取峰值、峰值前30天积分、峰值后30天积分等。这些特征能够直接反映作物的生长速率、最大生物量和衰老过程。
  • 环境变量:加入ERA5-Land的逐月积温(GDD)累积降水(PPT),以及地形高程(DEM)
  • 耕作指数:针对耕作任务,特别计算了NDTI、STI、CRC等针对土壤残茬敏感的指数。

经过这一套操作,传统的RS组特征维度高达80余个,具备极强的物理可解释性。

2.3 学习器选择:为什么不用深度学习?

读者可能会问,既然AEF是大模型,为什么不直接用深度学习微调?论文作者给出了非常务实的回答:

  • 样本量受限:在部分任务(如县级耕作分类)中,样本量(如仅2001个记录)不足以训练出有效的深度学习模型。
  • 对比公平性:传统树模型(随机森林RF和XGBoost)在处理表格数据时,通常能达到甚至超越浅层深度神经网络的效果,同时训练成本极低。
  • 业界标准化:农业遥感界最常用的业务化模型就是XGB和RF。使用它们作为载体,能够最真实地反映AEF嵌入的特征表达能力,而不是模型架构的差异。

2.4 革命性的评估方案:不仅是交叉验证

这是整篇论文最严谨的地方。常见论文通常随机划分训练集和测试集,但在地理遥感领域,这会产生严重的“数据空间自相关”伪影(即邻近的农田气候、土壤相似,随机划分会导致虚高的精度)。

为此,作者设计了四个不同的评测维度,代表了真实世界部署时的不同场景:

  1. State-Year CV(州-年交叉验证):将来自同一个州、同一个年份的所有样本作为一个整体(Bucket),防止训练集和测试集中出现同一年、同一地区的样本。这是最严谨的空间和时间独立性验证
  2. Yearly CV(逐年交叉验证,留一年法):用过去N年的数据训练模型,预测未来某一年的数据。这模拟了季节预报的业务场景,考验模型的时间泛化能力。
  3. Scale-Transfer(尺度迁移实验):用县级粗颗粒度数据训练的模型,去预测农田级的细颗粒度数据。这是一个非常苛刻的跨尺度考验
  4. Space-Transfer(空间迁移实验):进一步分为美国内部跨生态区(东部湿润气候ETF vs 西部干旱草原GP)迁移,以及跨大洲跨国(美国训练,阿根廷测试)迁移。这考验了模型在数据匮乏地区的适用性。

第三部分:实验结果大揭秘——当“大模型”遇到“现实农业”

3.1 本地表现:AEF不负众望

在State-Year CV和Yearly CV这两个标准评估下,AEF取得了令人惊喜的成绩。

  • 县级产量预测:AEF与RS模型的R²评分不相上下,均在0.78~0.80之间(玉米/大豆)。而在冬小麦的预测中,AEF甚至优于RS模型。作者分析,这可能是因为冬小麦生长季较长,跨冬的遥感监测极易受云雪影响,而AEF多模态(雷达、气候等)的整合恰好补全了光学图像的空缺。
  • 耕作与覆盖作物分类:两者的准确率和加权F1分数均在0.75~0.85左右。
  • 结论:在本地训练、本地测试的场景下,AEF具有很强的预测能力,完全能替代复杂的传统手工特征工程,且大大节省了数据下载和处理的时间(AEF数据量仅64维,且免预处理,GEE下载极快)。

3.2 跨尺度迁移(Scale-Transfer):AEF的“原罪”

当研究人员把基于县级AEF数据训练的模型,直接应用到农田级数据时,灾难性滑铁卢出现了。

  • 结果:在玉米产量跨尺度预测中,AEF模型的R²从0.78骤降至 0.24(RF模型)甚至跌到负值;而传统RS模型虽然也有所下降,但依然能维持在 0.37 左右,碾压AEF。
  • 原因解析:这是一个非常深刻的现象。AEF虽然声称是10米分辨率,但在县级训练时,作者只能将所有像素平均成县级均值。AEF的64维向量是高度抽象和压缩的特征,在平均值的过程中,原本对产量有微小贡献的、农田内部的微观异质信息(如局部田块的水分、疏密差异)被彻底抹平了。相反,传统的植被指数(如NDVI和GCVI)代表的是具有物理意义的“绿度”或“生物量”,即便被平均,其物理含义依然存在,具有跨尺度稳健性。AEF作为密集嵌入,缺乏这种直观的物理稳健性。

3.3 跨区域迁移(Space-Transfer):最致命的短板

论文中最震撼的数据,来自于空间迁移实验。

  • 跨生态区(美国西部东部互推):在玉米产量预测上,AEF模型表现极差(R²在-0.28至0.51之间波动);而传统RS模型的R²可以稳定在0.6左右。
  • 跨大洲(美国推向阿根廷):美国模型到阿根廷测试时,AEF模型彻底崩溃,R²跌至-2.13,预测结果跟实际产量完全反着来。传统RS模型虽然表现也变差,但依然能给出有意义的预测(R²=0.27)。
  • 原因深度挖掘:作者做了细致的特征重要性分析。以玉米为例,在美国玉米带,AEF的 A05 嵌入波段是与产量高度相关的。但通过相关性分析发现,A05在东部生态区(ETF)与GCVI(绿度)完全不相关,但在西部生态区(GP)却强相关。这就意味着,AEF的同一波段在不同区域编码了完全不同的物理信号。当你把在美国东部训练出来的模型移到阿根廷时,模型学习的隐含信号(如针对A05的权重)不再适用,导致模型出现严重的地域偏差。这可能是因为AEF训练过程中融合了DEM、重力场以及维基百科的文本信息,这些文本信息具有极强的地域特异性,从而导致AEF编码出的向量表征偏向本地化,而非真正的通用地球物理特征。

3.4 可解释性黑洞:到底什么是A05?

深入探究AEF的可解释性,结果令人沮丧。

  • 在RS模型中,排名靠前的前10个特征(如 GCVI_int_a30, NDVI_peak, GDD_6)都是农业专家可以一眼看懂的物理变量,直接对应作物的绿度、热量累积。
  • 在AEF模型中,排名前10的特征是 A05, A31, A61 等纯数字编号。作者研究发现,A05与GCVI和GDD都有一定相关性,说明它学习到了两者的混合信号,但这种混合不稳定。在大豆产量预测中,最重要的AEF特征又变成了其他的波段。这种特征重要性随作物改变、随区域改变的特征,让科学家根本无法对AEF模型进行解释、复盘或纠错。

第四部分:AEF的全面优劣势总结与未来启示

4.1 AEF的三大核心优势

  1. 自动化数据融合:将多源遥感和气候数据,自动融合成64维的连续、高质量向量,免去了科研人员大量的编程预处理工作。
  2. 计算高效:GEE上存储的年度数据,下载速度极快。相比Landsat的TB级时序影像处理,64维特征使得模型训练效率极大提升。
  3. 空间覆盖完整:AEF通过插值和模型预测,能够修复云层和轨道空隙,提供全球连续无缺失的地表观测向量。

4.2 AEF的三大致命限制

  1. 跨尺度泛化失败:由于嵌入特征的高度抽象性和不可逆性,当从粗分辨率聚合迁移到高分辨率预测时,信息丢失严重。这不建议AEF应用于需要在不同空间尺度间进行知识迁移的任务。
  2. 跨区域迁移失败:由于训练数据中非物理属性的地域偏差(尤其是文本信息),导致AEF对不同生态区、不同国家之间的环境差异学习不足。不要将AEF模型轻易从美洲迁移到亚洲或欧洲
  3. 缺乏时间敏感性:目前的AEF数据是“年度”汇总的。这意味着我们无法用它进行生长季内的实时预测(In-season Prediction)。等到年度数据发布,作物可能已经收割,这使得AEF目前更适合“历史回顾性分析”,而非“实时农业决策”。

4.3 给科研与开发者的建议

  • 什么场景下用AEF? 如果你只打算做单一区域的历史分析,且不追求物理可解释性,AEF能极大提高你的研发效率。
  • 什么场景下不要用AEF? 如果你需要做跨区域、跨国家的农业推广,或者你需要在农田级进行高精度决策,请坚持使用传统遥感特征(如植被指数结合气候数据)。传统方法在空间迁移和尺度迁移中的鲁棒性,是目前任何基础模型都难以替代的。
  • 对Google DeepMind的建议:未来的AEF版本可以尝试生产月度或旬度的嵌入数据,以支持季节内预测;同时需要增强对抗性特征,消除由于地理位置引起的嵌入偏差;并且应该开发特征归因技术,让A00-A63这些波段具备明确的物理语义,打破“黑盒”困境。

结语:基础模型不是万能药,严谨评测才是指路明灯

这篇论文的发表在业界引起了不小的震动。它打破了人们对“大模型”的神话,深刻地提醒我们:地理空间基础模型确实提供了新的范式,但农业科学具有其独特的复杂性和地缘依赖性。我们不能仅凭模型在初始测试集上的高分数就盲目信赖,跨尺度、跨空间、跨时间的严谨基准测试(Benchmarking) 才是将AI落地到实际生产中的唯一检验标准。

AEF为我们展示了“开箱即用”的便捷,但它用惨痛的数据告诉我们:在真实世界中,模型不仅要能“看得见”,还要能“跨得过去”和“说得清”。对于每一位农业遥感实践者来说,是选择AEF的高效,还是选择RS物理特征的稳健,需要我们结合具体的业务场景做出理性的权衡。这篇论文不仅仅是一个AEF的评测,更是一套未来所有地理空间基础模型评估的“方法论样板”。

附件

# ==========================================
# 1. 导入依赖库
# ==========================================
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import joblib
from pathlib import Path

from sklearn import metrics
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.model_selection import train_test_split, KFold
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.neural_network import MLPRegressor

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# ==========================================
# 2. 定义特征列名 (AlphaEarth 嵌入特征)
# ==========================================
feature_selected = []
feature_name = 'FM'  # FM 代表 Foundation Model,即 AEF
for k in range(0, 64):
    # 生成 A00, A01, ..., A63 共64个特征列名
    formatted = str(k).zfill(2) 
    feature_selected.append('A' + formatted)

# ==========================================
# 3. 读取数据
# ==========================================
# 读取预先下载好的 CSV 数据集,包含特征、年份、州代码和真实产量(yield)
df_all = pd.read_csv("US_FM_Corn_Data_shared.csv")

# 打印数据形状,输出为 (6325, 106),说明有 6325 条县级样本,106 列(64个嵌入特征+元数据)
print(df_all.shape)

# ==========================================
# 4. 初始化评估结果存储列表
# ==========================================
random_seed = 20  # 设置随机种子,保证实验可复现性

list_year = []      # 存储评估的场景(或年份)名称
list_num = []       # 存储测试集样本数

list_RMSE_RF = []   # 存储 RF 模型的 RMSE
list_R2_RF = []     # 存储 RF 模型的 R²

list_RMSE_XGB = []  # 存储 XGB 模型的 RMSE
list_R2_XGB = []    # 存储 XGB 模型的 R²

list_RF_models = [] # 存储训练好的 RF 模型对象 (用于后续分析或保存)

# ==========================================
# 5. 时空交叉验证 (Spatial-Temporal CV)
# ==========================================
# 记录当前评估方案名称
list_year.append('Spatial-Temporal CV')
list_num.append(df_all.shape[0])

# 初始化模型:200棵树的随机森林和梯度提升树(XGBoost)
rf_model  = RandomForestRegressor(n_estimators=200)
XGB_model = GradientBoostingRegressor(n_estimators=200)

# --- 5.1 RF 模型 5 次重复实验 ---
r2_scores = []
rmse_scores = []

for i in range(5):
    # 核心逻辑:创建州和年份的唯一组合,避免同一个州、同一年的数据出现在训练集和测试集中(防止空间自相关导致伪高精度)
    unique_keys = df_all[['State', 'year']].drop_duplicates()

    # 随机划分 unique_keys,30% 作为测试集 (基于州-年组合划分)
    train_keys, test_keys = train_test_split(unique_keys, test_size=0.3, random_state=i)

    # 将划分好的 key 合并回原数据集,获取最终用于训练和测试的 DataFrame
    df_train = df_all.merge(train_keys, on=['State', 'year'])
    df_test = df_all.merge(test_keys, on=['State', 'year'])

    # 提取 AEF 特征作为 X
    X_train = df_train[feature_selected]
    X_test = df_test[feature_selected]

    # 提取真实产量作为 y,并乘以 0.0673 进行单位换算 (可能是从 蒲式耳/英亩 转换为 吨/公顷)
    y_train = df_train['yield'] * 0.0673
    y_test = df_test['yield'] * 0.0673

    # 训练 RF 模型
    rf_model.fit(X_train, y_train)
    y_pred = rf_model.predict(X_test)

    # 计算 R²
    r2 = r2_score(y_test, y_pred)
    r2_scores.append(r2)

    # 计算 RMSE (这里用了 mean_squared_error,后续开根号)
    rmse = mean_squared_error(y_test, y_pred)
    rmse_scores.append(rmse)

# 打印 5 次实验的平均结果
R2_RF = np.mean(r2_scores)
RMSE_RF = np.mean(rmse_scores)
print(random_seed)
print('RF')
print(R2_RF, RMSE_RF)

# 保存结果
list_RMSE_RF.append(RMSE_RF)
list_R2_RF.append(R2_RF)

# --- 5.2 XGB 模型 5 次重复实验 ---
r2_scores = []
rmse_scores = []

for i in range(5):
    # 逻辑同上,仅将模型替换为 XGB
    unique_keys = df_all[['State', 'year']].drop_duplicates()
    train_keys, test_keys = train_test_split(unique_keys, test_size=0.3, random_state=i)

    df_train = df_all.merge(train_keys, on=['State', 'year'])
    df_test = df_all.merge(test_keys, on=['State', 'year'])

    X_train = df_train[feature_selected]
    y_train = df_train['yield'] * 0.0673

    X_test = df_test[feature_selected]
    y_test = df_test['yield'] * 0.0673

    XGB_model.fit(X_train, y_train)
    y_pred = XGB_model.predict(X_test)

    r2 = r2_score(y_test, y_pred)
    r2_scores.append(r2)

    rmse = mean_squared_error(y_test, y_pred)
    rmse_scores.append(rmse)

# 打印 5 次实验的平均结果
R2_XGB = np.mean(r2_scores)
RMSE_XGB = np.mean(rmse_scores)
print(random_seed)
print('XGB')
print(R2_XGB, RMSE_XGB)

list_RMSE_XGB.append(RMSE_XGB)
list_R2_XGB.append(R2_XGB)

# ==========================================
# 6. 逐年交叉验证 (Yearly CV - 留一年法)
# ==========================================
# *注意:原代码中未显式定义 years 列表,但在下面循环中使用了 years。
# 根据上下文推断,years = [2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024]

# --- 6.1 RF 模型逐年训练测试 ---
for i, year in enumerate(years):
    # 将所有年不等于 year 的数据划为训练集,等于 year 的数据划为测试集
    df_train = df_all[df_all['year'] != year]
    df_test  = df_all[df_all['year'] == year]

    X_train = df_train[feature_selected]
    y_train = df_train['yield'] * 0.0673

    X_test = df_test[feature_selected]
    y_test = df_test['yield']  * 0.0673

    # 重新初始化 RF 模型 (避免上一轮污染)
    rf_model = RandomForestRegressor(n_estimators=200)

    rf_model.fit(X_train, y_train)
    y_pred = rf_model.predict(X_test)

    R2 = r2_score(y_test, y_pred)
    RMSE = np.sqrt(mean_squared_error(y_test, y_pred)) # 这里使用 np.sqrt 计算真实的 RMSE

    print(year)
    print(X_test.shape)
    print(R2, RMSE)

    # 聚合所有年份的真实值和预测值,用于计算整体指标
    if i == 0:
        y_test_all = y_test
        y_pred_all = y_pred
    else:
        y_test_all = np.concatenate((y_test_all, y_test), axis=0)
        y_pred_all = np.concatenate((y_pred_all, y_pred), axis=0)

    # 将预测值赋给测试集 (会触发 Pandas SettingWithCopyWarning 警告,建议使用 .loc)
    df_test.loc[:, 'pred'] = y_pred 

    # 记录单年结果
    list_year.append(year)
    list_num.append(df_test.shape[0])
    list_RMSE_RF.append(RMSE)
    list_R2_RF.append(R2)

    list_RF_models.append(rf_model)

# 计算 RF 在所有年份上的总体 R² 和 RMSE
print("RF all")
R2 = r2_score(y_test_all, y_pred_all)
RMSE = np.sqrt(mean_squared_error(y_test_all, y_pred_all))

list_year.append('All')
list_num.append(y_test_all.shape[0])
list_RMSE_RF.append(RMSE)
list_R2_RF.append(R2)

print(r2_score(y_test_all, y_pred_all), np.sqrt(mean_squared_error(y_test_all, y_pred_all)))

# --- 6.2 XGB 模型逐年训练测试 (逻辑同上) ---
for i, year in enumerate(years):
    df_train = df_all[df_all['year'] != year]
    df_test  = df_all[df_all['year'] == year]

    X_train = df_train[feature_selected]
    y_train = df_train['yield'] * 0.0673

    X_test = df_test[feature_selected]
    y_test = df_test['yield']  * 0.0673

    XGB_model = GradientBoostingRegressor(n_estimators=200)

    XGB_model.fit(X_train, y_train)
    y_pred = XGB_model.predict(X_test)

    R2 = r2_score(y_test, y_pred)
    RMSE = np.sqrt(mean_squared_error(y_test, y_pred))
    print(year)
    print(X_test.shape)
    print(R2, RMSE)

    if i == 0:
        y_test_all = y_test
        y_pred_all = y_pred
    else:
        y_test_all = np.concatenate((y_test_all, y_test), axis=0)
        y_pred_all = np.concatenate((y_pred_all, y_pred), axis=0)

    df_test.loc[:, 'pred'] = y_pred

    list_RMSE_XGB.append(RMSE)
    list_R2_XGB.append(R2)

# 计算 XGB 在所有年份上的总体 R² 和 RMSE
print("XGB all")
R2 = r2_score(y_test_all, y_pred_all)
RMSE = np.sqrt(mean_squared_error(y_test_all, y_pred_all))

list_RMSE_XGB.append(RMSE)
list_R2_XGB.append(R2)

print(r2_score(y_test_all, y_pred_all), np.sqrt(mean_squared_error(y_test_all, y_pred_all)))

# ==========================================
# 7. 汇总评估结果
# ==========================================
# 将上述所有评估结果(时空CV、各年份Yearly CV、总体结果)整合到一个 DataFrame 中方便导出或绘图
df_eval = pd.DataFrame({
    'year': list_year,
    'num': list_num,
    'R2_RF': list_R2_RF,
    'RMSE_RF': list_RMSE_RF,
    'R2_XGB': list_R2_XGB,
    'RMSE_XGB': list_RMSE_XGB,
})
# df_eval 此时包含了所有实验的完整记录

数据链接

https://github.com/yuchima8/Harvest_AlphaEarth/blob/main/code/US_FM_Corn_Data_shared.csv

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐