4. 农业气象时序数据特征工程

原始农业气象时序数据通常以逐日或逐小时的形式记录气温、降水、相对湿度、日照时数、风速等要素。直接把原始观测值送入预测模型,往往难以表达作物对温度的累积响应、降水亏缺的持续效应以及季节节律。特征工程的任务,就是把一条条原始观测序列转换为模型可理解、可解释、且与预测目标强相关的特征集。本节围绕滑动窗口统计特征、滞后特征、傅里叶特征、日期时间特征和气象指数构建五类方法展开,并以一个“冬小麦返青至拔节期日平均气温预测”的示例场景贯穿说明。

一、滞后特征:把“过去”显式交给模型

滞后特征是最基础也最有效的一类时序特征。对序列 $x_t$,滞后 $k$ 阶特征定义为 $x_{t-k}$。例如用前 1、2、3、7 天的日平均气温作为当日气温的预测输入,可写成 lag1、lag2、lag3、lag7。滞后阶数的选择应结合气象要素的自相关结构和作物的生理响应时间:气温通常 lag1~lag3 已能捕捉短期惯性,而土壤墒情、降水累积效应可能需要 lag7、lag14 甚至更长。

实现时要注意两点。第一,滞后特征必须严格使用预测时刻之前的数据,避免把未来信息泄漏进训练集;第二,序列开头的 $k$ 行会因缺少历史值而产生缺失,应在建模前删除或做合理填充。以 Python 的 pandas 为例:

df = df.sort_values("date")
for k in [1, 2, 3, 7]:
    df[f"temp_lag{k}"] = df["temp_mean"].shift(k)
df = df.dropna(subset=["temp_lag1", "temp_lag2", "temp_lag3", "temp_lag7"])

二、滑动窗口统计特征:刻画近期状态与波动

滞后特征只取单点历史值,而滑动窗口统计特征能概括一段时间内的整体水平和离散程度。常用窗口长度为 3、7、15、30 天,统计量包括均值、标准差、最大值、最小值和累计量。例如 7 天滑动平均气温反映近期冷暖背景,7 天滑动降水累计反映近期水分补给,15 天气温标准差可反映温度变幅是否剧烈。

窗口统计的关键是“窗口只覆盖当前时刻及以前”。在 pandas 中应使用 rolling(window=7, min_periods=7) 后再 shift(1),确保当日特征不包含当日观测值(若当日值在预测时不可得)。示例参数下,7 天滑动平均气温在返青期约 3~8 ℃、拔节期升至 10~15 ℃,这一量级变化本身就能为模型提供明显的季节信号。

三、傅里叶特征:表达季节与日节律

气象要素具有明显的周期性。傅里叶特征用正弦、余弦对构造平滑的周期编码,避免模型把“第 180 天”和“第 181 天”误认为毫不相干的两个类别。对年周期,常用:

import numpy as np
doy = df["date"].dt.dayofyear
for k in [1, 2]:
    df[f"sin_year{k}"] = np.sin(2 * np.pi * k * doy / 365.25)
    df[f"cos_year{k}"] = np.cos(2 * np.pi * k * doy / 365.25)

一阶谐波刻画全年单峰节律,二阶谐波可补充春秋过渡的不对称性。若数据为逐小时,还可加入日周期谐波(周期 24)。傅里叶特征的优势在于连续、平滑、参数少,且外推到下一周期时不会像“日期序号”那样越界失真。

四、日期时间特征:显式标记农事与季节节点

日期时间特征把日历信息拆成模型可用的离散或连续变量,包括月份、旬、星期、是否节假日,以及更贴合农业的物候阶段标记。例如用“是否处于返青期”“是否处于拔节期”“距播种天数”等布尔或计数特征,把作物的生理阶段直接告诉模型。需要注意,月份、旬这类类别特征宜做独热编码或周期编码,避免模型误读大小关系;而“距播种天数”是连续量,可直接使用。

五、气象指数构建:从要素到农业意义

气象指数把多个要素组合成具有农学含义的单一指标,常见的有活动积温、有效积温、连续无降水日数、标准化降水指数等。以有效积温为例,设基点温度 $T_b=10$ ℃,日有效积温为 $\max(T_{\text{mean}}-T_b, 0)$,再按生育阶段累加:

df["gdd_daily"] = (df["temp_mean"] - 10).clip(lower=0)
df["gdd_cum"] = df["gdd_daily"].cumsum()

干旱指数可用“连续无有效降水日数”与“近 30 天降水距平百分率”组合表达:前者反映干旱持续时间,后者反映水分亏缺程度。示例中若某站近 30 天降水 8 mm、常年同期 25 mm,则距平百分率约为 −68%,配合连续 18 天无有效降水,可判定为明显干旱信号。这类指数比原始降水更接近作物受害的实际过程,通常能显著提升模型对产量、发育期或灾害风险的预测能力。

农业气象时序特征工程:从原始观测到模型特征集 原始时序数据 日平均气温 降水量 / 相对湿度 日照时数 / 风速 按日期排序、去重、补缺 滞后特征 lag1 / lag2 / lag3 / lag7 shift(k),严禁未来信息 滑动窗口统计 3/7/15/30 天窗口 均值·标准差·累计量 傅里叶特征 年周期 sin/cos 谐波 日周期谐波(逐小时) 日期时间特征 月份·旬·距播种天数 物候阶段标记 气象指数 有效积温·干旱指数 特征集 滞后项 4 个 窗口统计 12 个 傅里叶项 4 个 日期时间项 5 个 气象指数 3 个 共约 28 维 按时间切分训练/验证 预测模型 回归 / 树模型 / LSTM 目标:日平均气温 或发育期 / 产量 防泄漏要点 · 所有特征只使用 t 时刻及以前的数据 · 先按时间切分,再在训练集内拟合标准化参数 · 窗口与滞后产生的缺失行统一处理

六、特征集组织与防泄漏检查

五类特征生成后,应统一按时间索引对齐,形成“一行一天、一列一特征”的宽表。示例中滞后 4 项、窗口统计 12 项、傅里叶 4 项、日期时间 5 项、气象指数 3 项,合计约 28 维特征。组织时建议保留原始日期列用于切分,特征列统一为数值型;类别型日期特征做编码后再入模。

防泄漏是特征工程中最容易出错也最致命的环节。正确做法是:先按时间把数据切分为训练段和验证段,再在训练段内部计算标准化均值与方差,最后应用到验证段;滑动窗口和滞后特征在切分边界处要保证验证段第一行只使用训练段末尾的历史值。若发现验证集指标异常偏高,应优先排查是否存在“用当日值构造当日特征”或“用全量数据拟合标准化参数”的问题。

建议在特征生成后做一次快速体检:检查各特征缺失率、滞后与窗口特征在序列首尾的完整性、特征与目标的相关性方向是否符合农学常识(如有效积温与发育进度应正相关),以及训练段与验证段的特征分布是否发生明显漂移。

完成上述步骤后,得到的特征集既保留了原始气象要素的信息,又把作物生理节律、近期状态和累积效应显式表达出来,为后续的回归、树模型或深度时序模型提供了结构清晰、可解释、可复现的输入基础。