多分组场景下单一Random Forest Regression预测模型构建咨询
单随机森林多地点气温预测落地方案
你之前遇到的测试集仅覆盖单个地点的问题,和Location字段的one-hot编码无关,核心是错误使用了面向独立同分布样本的随机划分逻辑,不匹配时序预测+全地点覆盖的验证要求。
核心实现流程
- 特征工程处理
Location字段直接做one-hot编码即可,不需要调整编码方式。在现有Month、Year字段基础上补充两类特征提升预测精度:- 连续时间步特征:将年月转换为递增的整数值,例如2018年3月记为
time_step = (Year - 2018)*12 + Month,让模型学习长期气温变化的趋势性 - 月份周期特征:对Month做正余弦转换,还原月份的环形周期属性(避免模型把相邻的12月和1月判定为相差11的离散值),转换代码如下:
import numpy as np df['month_sin'] = np.sin(2 * np.pi * df['Month'] / 12) df['month_cos'] = np.cos(2 * np.pi * df['Month'] / 12)
- 连续时间步特征:将年月转换为递增的整数值,例如2018年3月记为
- 数据集划分(解决测试集地点覆盖不全问题)
完全抛弃默认的随机train_test_split,采用时间前切分逻辑:- 按时间先后对所有样本排序,取时间最早的80%区间内所有地点的样本作为训练集,时间最晚的20%区间内所有地点的样本作为测试集。例如你有2018.1-2021.12共48个月的数据,就取2018.1-2021.2的全地点样本做训练,2021.3-2021.12的全地点样本做测试。这种划分方式完全匹配“用历史数据预测未来”的场景,不会出现数据泄露,且测试集天然覆盖全部50个地点。
- 交叉验证环节使用
TimeSeriesSplit做时序分折,禁止使用普通K折随机打乱分折,每一轮验证集的时间必须晚于对应训练集的时间,保证每折验证都覆盖所有地点。
- 模型训练与批量预测
- 训练阶段输入特征为
time_step、month_sin、month_cos、Year、所有Location的one-hot列,标签为Temp,直接训练单个RandomForestRegressor即可,不需要为每个地点单独建模。 - 预测未来x个月时,先构造完整的待预测特征表:
- 先生成未来x个月所有月份对应的Month、Year、time_step、month_sin、month_cos值
- 对每个未来月份,拼接50个地点的one-hot编码,最终生成
x*50行的特征表(每个地点每个月对应1行) - 将构造好的特征表输入训练完成的模型,输出结果即为所有地点对应月份的气温预测值。
- 训练阶段输入特征为
注意:绝对不要在时序气象预测任务中使用随机打乱样本的划分方式,这种方式会让模型在训练阶段间接接触到未来时间的气温信息,得到的测试集精度是虚高的,实际预测未来数据时效果会出现明显下跌。
内容的提问来源于stack exchange,提问作者Nina Hartley
相关产品推荐
相关产品推荐

