论文精读:AlphaEarth农业测评:地理空间大模型真实表现揭秘
前言
这篇论文《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),而是设计了四个评估维度:
- State-Year CV(州-年交叉验证):将同一个州、同一年的数据作为一个整体,放入训练集或测试集,避免空间和时间上的数据泄漏。
- Yearly CV(逐年交叉验证,即留一年法):模拟真实业务场景,用过去几年训练,预测未来一年。
- Scale-Transfer(尺度迁移):在县级尺度上训练模型,然后在田块尺度测试(考验模型的跨尺度泛化能力)。
- Space-Transfer(空间迁移):在美国玉米带东部生态区(ETF,湿润气候)训练,在西部生态区(GP,干旱/半干旱气候)测试,甚至进一步做到美国至阿根廷的跨国测试(考验模型的跨区域泛化能力)。
3. 核心实验结果(颠覆性发现)
3.1 本地与时间泛化性能
- 结论:在State-Year CV和Yearly 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等卫星群为我们提供了海量的地表观测数据,推动了农业研究的革命。然而,在实际业务场景中,一直存在三大痛点:
- 数据异构性(Heterogeneity):不同卫星的光谱波段不同、空间分辨率不同(10米到1000米不等)、时间重访周期不同。如何将这堆“杂牌军”高效融合成一个统一的输入特征,是一个巨大的工程难题。
- 数据缺失(Data Gaps):农业尤其依赖时间序列数据来分析作物生长动态。但云层遮挡、轨道间隙会导致时间序列出现大量空洞。数据插值补全往往引入大量误差。
- 标签成本高(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的实用价值,作者选取了三个具有代表性的农业下游任务:
- 作物产量预测(Yield Prediction):这是一个典型的回归问题。在县级(County)和农田级(Field)两种尺度上,预测美国的玉米、大豆和冬小麦产量。数据来源包含USDA-NASS的公开统计数据和Corteva公司的商业实测数据。
- 春季耕作制图(Tillage Mapping):这是一个分类问题(高强度耕作 vs. 低强度耕作/免耕)。作者主要关注玉米带春季的耕翻行为。同样区分了县级统计数据和农田级农户反馈数据。
- 覆盖作物制图(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 革命性的评估方案:不仅是交叉验证
这是整篇论文最严谨的地方。常见论文通常随机划分训练集和测试集,但在地理遥感领域,这会产生严重的“数据空间自相关”伪影(即邻近的农田气候、土壤相似,随机划分会导致虚高的精度)。
为此,作者设计了四个不同的评测维度,代表了真实世界部署时的不同场景:
- State-Year CV(州-年交叉验证):将来自同一个州、同一个年份的所有样本作为一个整体(Bucket),防止训练集和测试集中出现同一年、同一地区的样本。这是最严谨的空间和时间独立性验证。
- Yearly CV(逐年交叉验证,留一年法):用过去N年的数据训练模型,预测未来某一年的数据。这模拟了季节预报的业务场景,考验模型的时间泛化能力。
- Scale-Transfer(尺度迁移实验):用县级粗颗粒度数据训练的模型,去预测农田级的细颗粒度数据。这是一个非常苛刻的跨尺度考验。
- 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的三大核心优势
- 自动化数据融合:将多源遥感和气候数据,自动融合成64维的连续、高质量向量,免去了科研人员大量的编程预处理工作。
- 计算高效:GEE上存储的年度数据,下载速度极快。相比Landsat的TB级时序影像处理,64维特征使得模型训练效率极大提升。
- 空间覆盖完整:AEF通过插值和模型预测,能够修复云层和轨道空隙,提供全球连续无缺失的地表观测向量。
4.2 AEF的三大致命限制
- 跨尺度泛化失败:由于嵌入特征的高度抽象性和不可逆性,当从粗分辨率聚合迁移到高分辨率预测时,信息丢失严重。这不建议AEF应用于需要在不同空间尺度间进行知识迁移的任务。
- 跨区域迁移失败:由于训练数据中非物理属性的地域偏差(尤其是文本信息),导致AEF对不同生态区、不同国家之间的环境差异学习不足。不要将AEF模型轻易从美洲迁移到亚洲或欧洲。
- 缺乏时间敏感性:目前的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
更多推荐




所有评论(0)