如何用Jena Climate Dataset训练你的第一个天气预测模型(附完整代码)
从零构建你的首个天气预测模型以Jena气候数据集为实战起点你是否曾好奇那些精准的天气预报背后究竟藏着怎样的数学模型对于机器学习初学者而言气象预测是一个绝佳的入门领域——它数据公开、问题定义清晰且与我们日常生活息息相关。今天我们就以著名的Jena气候数据集为画布亲手绘制一幅从数据到预测的完整蓝图。这不仅仅是一次代码的复制粘贴更是一次深入理解时间序列预测核心逻辑的旅程。我们将从最原始的气压、湿度读数开始一步步构建一个能够“学习”天气模式的循环神经网络最终让它尝试预测未来的温度。无论你是刚接触TensorFlow或PyTorch的新手还是希望寻找一个结构清晰、可复现的实战项目这篇文章都将为你提供详尽的指引和深度的解析。1. 理解战场Jena气候数据集深度剖析在动手写下一行代码之前我们必须像将军了解地形一样透彻理解手中的数据。Jena气候数据集由德国马克斯·普朗克生物地球化学研究所发布它记录了2021年全年在德国耶拿地区每10分钟采集一次的多项气象指标。原始数据是一个包含26495行、31列的CSV文件每一行都是一个时间切片下的环境快照。乍看之下31个特征令人眼花缭乱。但我们可以将其归为几个核心的物理量类别这有助于我们后续进行特征工程大气状态指标包括大气压力(p (mbar))、空气密度(rho (g/m**3))。温度家族这是我们的预测目标所在。除了目标变量T (degC)空气温度还有露点温度(Tdew)、相当位温(Tpot)、以及一系列不同深度的地表温度(ST002至ST128)。它们之间通常存在强相关性。水分指标相对湿度(rh (%))、比湿(sh (g/kg))、实际与饱和水汽压(VPact,VPmax,VPdef)、水汽含量(H2OC)。这些是影响体感温度和降水可能性的关键。辐射与能量短波向下辐射(SWDR)、净辐射(Rn)它们驱动着地表能量的收支平衡。风与降水风速(wv)、风向(wd)、降雨量(rain)。土壤状况不同深度的土壤湿度(SM008至SM128)和土壤温度反映了地表与大气交互的“记忆”。对于初学者一个常见的陷阱是试图将所有特征一股脑儿塞进模型。实际上特征选择是提升模型性能和可解释性的第一步。例如不同深度的土壤温度与空气温度虽然相关但作为输入特征可能会引入冗余信息让模型难以抓住主要矛盾。我们的首要目标是预测未来时刻的空气温度(T (degC))因此需要围绕这个目标来审视数据。提示在开始预处理前强烈建议你用pandas的describe()方法和简单的绘图如matplotlib的折线图快速浏览每个特征的统计分布和随时间的变化趋势。这能帮你直观发现异常值、缺失值以及特征的周期性如昼夜、季节变化。2. 数据预处理为模型准备“食材”原始数据就像未经处理的食材直接下锅很难做出佳肴。数据预处理的目的是将原始数据转化为模型能够高效“消化”的格式。这个过程通常占到一个数据科学项目80%以上的时间其质量直接决定模型的天花板。2.1 数据加载与初步清洗我们首先使用pandas库来加载数据。假设数据文件名为mpi_saale_2021b.csv。import pandas as pd import numpy as np # 加载数据并解析日期时间列 df pd.read_csv(mpi_saale_2021b.csv, parse_dates[Date Time]) df.set_index(Date Time, inplaceTrue) # 将日期时间设为索引方便后续处理 print(f数据集形状: {df.shape}) print(df.head())加载后检查缺失值是必不可少的一步。对于时间序列数据简单的向前填充用前一个时刻的值填充或插值法通常是合理的选择。# 检查缺失值 print(df.isnull().sum()) # 如果缺失值较少可以使用前向填充 df.fillna(methodffill, inplaceTrue)2.2 特征工程与选择基于我们对数据的理解进行有针对性的特征选择。这里我们采取一个策略保留与空气温度动力学过程直接相关的大气瞬时状态特征剔除高度冗余的衍生温度特征和部分土壤特征。# 定义要删除的特征列 # 删除不同深度的地表温度因为它们与空气温度高度相关且可能是结果而非原因 columns_to_drop [col for col in df.columns if col.startswith(ST)] # 也可以考虑删除部分土壤湿度特征简化初始模型 columns_to_drop.extend([SM008 (%), SM016 (%), SM032 (%), SM064 (%), SM128 (%)]) df_selected df.drop(columnscolumns_to_drop) print(f特征选择后的数据集形状: {df_selected.shape})2.3 数据标准化与序列构建机器学习模型对输入数据的尺度非常敏感。像气压约1000 mbar和温度约10 degC这样的特征数值范围差异巨大必须进行标准化。from sklearn.preprocessing import StandardScaler # 初始化标准化器注意我们的目标变量‘T (degC)’也需要被标准化但最后要单独反标准化 scaler StandardScaler() scaled_features scaler.fit_transform(df_selected) # 将标准化后的数组转回DataFrame保持列名 df_scaled pd.DataFrame(scaled_features, columnsdf_selected.columns, indexdf_selected.index)接下来是最关键的一步将时间序列数据构建成监督学习的样本。我们使用“滑动窗口”方法。例如用过去8个时间步即80分钟的所有特征来预测下一个时间步的温度。def create_sequences(data, target_column_idx, sequence_length8, forecast_horizon1): 创建序列样本。 参数: data: 标准化后的特征数组 (num_samples, num_features) target_column_idx: 目标变量温度在特征中的列索引 sequence_length: 输入序列的长度时间步数 forecast_horizon: 预测未来第几个时间步这里为1即下一个时刻 X, y [], [] for i in range(len(data) - sequence_length - forecast_horizon 1): # 输入从i到isequence_length的所有特征 X.append(data[i:isequence_length, :]) # 输出isequence_lengthforecast_horizon-1 时刻的目标温度值 y.append(data[isequence_lengthforecast_horizon-1, target_column_idx]) return np.array(X), np.array(y) # 假设‘T (degC)’在df_scaled中的列索引是1需根据实际情况调整 target_idx list(df_scaled.columns).index(T (degC)) X, y create_sequences(df_scaled.values, target_idx, sequence_length8) print(f输入X的形状: {X.shape}) # 期望为 (样本数, 8, 特征数) print(f输出y的形状: {y.shape}) # 期望为 (样本数,)最后将数据集划分为训练集、验证集和测试集。切记不要打乱时间顺序# 按时间顺序划分例如前70%训练中间15%验证最后15%测试 train_split int(0.7 * len(X)) val_split int(0.85 * len(X)) X_train, y_train X[:train_split], y[:train_split] X_val, y_val X[train_split:val_split], y[train_split:val_split] X_test, y_test X[val_split:], y[val_split:]3. 模型构建搭建循环神经网络RNN有了规整的数据我们就可以搭建模型了。对于时间序列预测循环神经网络RNN及其变体LSTM、GRU是自然的选择。它们具有“记忆”能力能够处理序列数据中的前后依赖关系。这里我们使用KerasTensorFlow的高级API来构建一个简单的LSTM模型。3.1 模型架构设计我们的模型结构并不复杂但包含了关键组件输入层接收形状为(序列长度, 特征数)的输入。LSTM层这是核心用于捕捉序列中的长期依赖关系。我们使用两层LSTM进行堆叠以增强模型的表达能力。第一层设置return_sequencesTrue将每个时间步的输出都传递给下一层。Dropout层在LSTM层之间和之后添加是一种正则化技术随机“丢弃”一部分神经元防止模型过拟合。全连接层Dense将LSTM提取的抽象特征映射到最终的预测值一个标量温度。import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers model keras.Sequential([ # 第一层LSTM返回完整序列以供下一层LSTM使用 layers.LSTM(units64, return_sequencesTrue, input_shape(X_train.shape[1], X_train.shape[2])), layers.Dropout(0.2), # 添加Dropout防止过拟合 # 第二层LSTM只返回最后一个时间步的输出 layers.LSTM(units32, return_sequencesFalse), layers.Dropout(0.2), # 全连接层逐步压缩维度 layers.Dense(units16, activationrelu), # 输出层一个神经元预测温度值 layers.Dense(units1) ]) # 编译模型 model.compile( optimizerkeras.optimizers.Adam(learning_rate0.001), # 使用Adam优化器 lossmse, # 回归任务常用均方误差作为损失函数 metrics[mae] # 同时监控平均绝对误差更直观 ) # 打印模型概要 model.summary()3.2 关键超参数解析在构建模型时我们做了几个选择理解其背后的原因至关重要超参数/组件设置值作用与考量LSTM单元数第一层64第二层32单元数决定模型的容量。从高层到底层逐层减少是一种常见的“编码器”模式帮助网络提取更精炼的特征。起始值可凭经验设定后续需调优。Dropout率0.2随机丢弃20%的神经元连接。这是一个相对保守的值旨在不过度损害模型表达能力的前提下提供正则化。对于小数据集或简单任务可以降低或取消。优化器Adam自适应学习率优化器通常比传统的SGD收敛更快、更稳定是目前的默认选择。学习率0.001Adam的常用初始学习率。如果训练损失震荡或下降过慢可以适当调整。损失函数均方误差(MSE)对大的误差惩罚更重能使预测值更倾向于靠近真实值的均值。评估指标平均绝对误差(MAE)与原始数据单位一致这里是标准化后的单位更容易解读模型误差的实际大小。注意return_sequences这个参数很容易混淆。当后面需要连接另一个循环层时必须设置为True以传递序列信息。如果是连接全连接层则最后一层循环层通常设置为False只输出最后一个时间步的隐藏状态。4. 模型训练、评估与结果分析模型搭建完毕现在是见证“学习”过程的时刻。4.1 训练过程与回调函数我们使用验证集来监控训练过程防止过拟合并可能使用早停Early Stopping来节省时间。# 定义回调函数 callbacks [ # 早停当验证集损失在连续10个epoch内不再下降时停止训练 keras.callbacks.EarlyStopping(monitorval_loss, patience10, restore_best_weightsTrue), # 学习率衰减如果损失停滞自动降低学习率 keras.callbacks.ReduceLROnPlateau(monitorval_loss, factor0.5, patience5) ] # 开始训练 history model.fit( X_train, y_train, validation_data(X_val, y_val), epochs100, # 设置一个较大的epoch数由早停回调实际控制 batch_size32, # 批量大小影响训练速度和梯度稳定性 callbackscallbacks, verbose1 # 显示进度条 )训练结束后绘制训练和验证的损失曲线是标准操作。import matplotlib.pyplot as plt plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(history.history[loss], label训练损失) plt.plot(history.history[val_loss], label验证损失) plt.title(模型损失) plt.xlabel(Epoch) plt.ylabel(MSE Loss) plt.legend() plt.subplot(1, 2, 2) plt.plot(history.history[mae], label训练MAE) plt.plot(history.history[val_mae], label验证MAE) plt.title(模型平均绝对误差) plt.xlabel(Epoch) plt.ylabel(MAE) plt.legend() plt.tight_layout() plt.show()一个健康的训练曲线应该是训练和验证损失同步平稳下降并最终趋于平缓。如果训练损失持续下降而验证损失开始上升则是典型的过拟合信号。4.2 模型评估与预测反标准化在从未见过的测试集上评估模型才能反映其真实泛化能力。# 在测试集上评估 test_loss, test_mae model.evaluate(X_test, y_test, verbose0) print(f测试集 MSE Loss: {test_loss:.4f}) print(f测试集 MAE: {test_mae:.4f})记住我们的预测值y_pred是标准化后的温度。为了理解其实际意义必须将其反标准化回原始的摄氏度。# 进行预测 y_pred_scaled model.predict(X_test).flatten() # 反标准化预测值和真实值 # 注意我们需要一个与目标变量‘T (degC)’对应的scaler来进行逆变换。 # 一种方法是拟合一个只针对目标列的scaler这里我们利用之前拟合的scaler但只逆变换目标列。 # 我们需要构建一个“假”的二维数组其形状为 (n_samples, n_features)其中只有目标列有值其他列为0。 temp_scaler_mean scaler.mean_[target_idx] temp_scaler_scale scaler.scale_[target_idx] y_pred_original y_pred_scaled * temp_scaler_scale temp_scaler_mean y_test_original y_test * temp_scaler_scale temp_scaler_mean # 计算反标准化后的误差 from sklearn.metrics import mean_absolute_error, mean_squared_error mae_original mean_absolute_error(y_test_original, y_pred_original) rmse_original np.sqrt(mean_squared_error(y_test_original, y_pred_original)) print(f反标准化后测试集 MAE: {mae_original:.2f} °C) print(f反标准化后测试集 RMSE: {rmse_original:.2f} °C)4.3 结果可视化与误差分析数字指标是冰冷的图形则能告诉我们更多故事。将一段时间内的预测值与真实值绘制在一起。# 绘制部分测试集的预测对比 plt.figure(figsize(15, 6)) # 取前200个测试样本进行可视化 plot_range 200 plt.plot(y_test_original[:plot_range], label真实温度, alpha0.7, linewidth2) plt.plot(y_pred_original[:plot_range], label预测温度, alpha0.7, linestyle--) plt.title(温度预测对比 (测试集前200个样本)) plt.xlabel(时间步 (每步10分钟)) plt.ylabel(温度 (°C)) plt.legend() plt.grid(True, alpha0.3) plt.show()观察图形你可以分析趋势捕捉模型是否能跟上温度的上升和下降趋势峰值预测对于温度的突然变化峰值或谷值模型的预测是滞后还是平滑过度了误差分布误差是否在某些特定范围如极高或极低温更大此外绘制误差的直方图或散点图也很有帮助。# 绘制误差分布 errors y_test_original - y_pred_original plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.hist(errors, bins50, edgecolorblack, alpha0.7) plt.title(预测误差分布) plt.xlabel(误差 (°C)) plt.ylabel(频次) plt.axvline(x0, colorr, linestyle--) plt.subplot(1, 2, 2) plt.scatter(y_test_original, y_pred_original, alpha0.5, s10) plt.plot([y_test_original.min(), y_test_original.max()], [y_test_original.min(), y_test_original.max()], r--, lw2) # 理想对角线 plt.title(预测值 vs 真实值散点图) plt.xlabel(真实温度 (°C)) plt.ylabel(预测温度 (°C)) plt.tight_layout() plt.show()一个理想的散点图应该所有点都紧密分布在红色对角线周围。如果图形呈现明显的非线性模式说明模型存在系统性偏差。5. 进阶探索与优化方向完成第一个可运行的模型只是一个起点。要让预测更精准可以从以下几个方向深入1. 特征工程的深化滞后特征除了使用过去时间步的原始值可以尝试创建滞后n步的特定特征如过去1小时的平均温度。衍生特征计算一些有物理意义的组合特征如温度露点差T - Tdew它能指示空气的饱和程度。周期性编码时间序列具有强烈的周期性日周期、年周期。可以将“一天中的分钟数”、“一年中的第几天”转化为正弦/余弦特征输入模型帮助模型理解周期模式。2. 模型架构的改进GRU vs LSTM可以尝试用GRU单元替换LSTM。GRU结构更简单参数更少有时能达到相近甚至更好的效果且训练更快。双向RNN对于某些任务未来的信息在训练时是已知的对理解当前状态也有帮助。双向RNN可以同时从前向和后向学习序列信息。注意力机制在更长的序列中引入注意力机制可以让模型学会关注与当前预测最相关的历史时刻而不是平等看待所有过去信息。Seq2Seq架构如果你想预测未来多个时间步例如未来24小时每小时的温度可以考虑使用编码器-解码器Seq2Seq架构。3. 超参数的系统调优手动调整超参数效率低下。可以使用Keras Tuner或Optuna等库进行自动化超参数搜索探索不同的层数、单元数、Dropout率、学习率、批次大小等组合。4. 集成与后处理模型集成训练多个不同初始条件或架构的模型将它们的预测结果进行平均Bagging或堆叠Stacking往往能获得更稳定、更准确的预测。残差分析分析模型预测的残差误差是否具有自相关性。如果存在说明模型未能完全捕捉序列中的某些模式这为进一步改进提供了线索。我在自己的实验中发现对于Jena数据集在基础LSTM模型上引入一天周期的正弦余弦编码特征并将序列长度从880分钟增加到14424小时对提升次日相同时刻的预测精度有明显帮助。当然这增加了模型的输入维度可能需要更复杂的网络或更多的数据来训练。另一个实用的技巧是在训练初期使用较高的学习率快速下降然后切换到较低的学习率进行微调这可以通过LearningRateScheduler回调实现。机器学习项目永远是在“快速实验-评估-迭代”的循环中推进的不要期望第一个模型就是最好的。享受这个不断探索和优化的过程才是学习的真谛。

相关新闻

Qwen3-TTS-Tokenizer-12Hz快速上手:从上传音频到解码还原全流程

Qwen3-TTS-Tokenizer-12Hz快速上手:从上传音频到解码还原全流程

Qwen3-TTS-Tokenizer-12Hz快速上手:从上传音频到解码还原全流程 你是否遇到过这样的烦恼:一段重要的会议录音文件太大,发送给同事要等半天;或者想保存一些语音素材,但手机存储空间总是不够用?传统的音频压…

2026/5/17 10:46:37 阅读更多 →
利用快马平台AI能力,十分钟快速生成SpringBoot项目原型

利用快马平台AI能力,十分钟快速生成SpringBoot项目原型

最近在做一个图书管理系统的原型,想用SpringBoot快速搭个架子出来。说实话,从零开始配环境、建项目、写基础代码,虽然不算难,但挺耗时间的,尤其是那些重复性的CRUD代码。正好看到InsCode(快马)平台宣传能用AI快速生成项…

2026/7/4 9:03:37 阅读更多 →
小白友好:通义千问1.8B聊天模型部署与测试完整流程

小白友好:通义千问1.8B聊天模型部署与测试完整流程

小白友好:通义千问1.8B聊天模型部署与测试完整流程 你是不是对AI聊天机器人很感兴趣,想自己动手部署一个来玩玩,但又担心过程太复杂,被一堆命令行和配置吓退?别担心,今天我就带你走一遍最简单的路。我们不…

2026/5/17 10:46:37 阅读更多 →

最新新闻

电商数据采集中的行为指纹混淆技术实战

电商数据采集中的行为指纹混淆技术实战

1. 项目背景与核心价值 去年在处理某电商平台数据采集项目时,我们团队遇到了一个棘手问题:无论怎么调整请求间隔、更换代理IP,目标站点的反爬系统总能在48小时内准确识别并封禁我们的爬虫。直到尝试了"行为指纹混淆"技术后&#xf…

2026/7/4 13:09:14 阅读更多 →
2022年6月AI工程化趋势:量化、提示词工业化与可观测服务

2022年6月AI工程化趋势:量化、提示词工业化与可观测服务

1. 这不是一份“新闻简报”,而是一份AI从业者六月实操现场的切片回放 2022年6月,AI圈没有爆炸性新模型发布,没有颠覆性论文刷屏,但整个行业的毛细血管正在发生肉眼可见的搏动。我那个月同时在三个项目里踩坑:一个用Sta…

2026/7/4 13:09:14 阅读更多 →
2025届毕业生实测:10大AI科研平台效率提升指南

2025届毕业生实测:10大AI科研平台效率提升指南

1. 项目背景与价值解析 作为2025届即将毕业的理工科学生,我深刻体会到优质科研资源对学术产出的决定性影响。在完成3篇SCI论文和2项专利的过程中,我系统测试了37个主流AI科研平台,最终筛选出10个真正能提升研究效率的实用工具。这份实测报告不…

2026/7/4 13:09:14 阅读更多 →
基于Dlib和OpenCV的驾驶疲劳检测系统实现

基于Dlib和OpenCV的驾驶疲劳检测系统实现

1. 项目概述这个基于机器视觉的驾驶疲劳检测系统是我在毕业设计期间完成的一个实际应用项目。作为一名计算机视觉方向的学生,我一直对如何将AI技术应用于交通安全领域很感兴趣。传统的疲劳驾驶检测方法往往依赖车载传感器或驾驶员生理指标,不仅成本高而且…

2026/7/4 13:07:14 阅读更多 →
AI驱动安全监控:从UEBA到SOAR的实战架构与模型选型

AI驱动安全监控:从UEBA到SOAR的实战架构与模型选型

1. 项目概述:当AI成为安全防御的“新大脑” 最近几年,安全圈的朋友们聚在一起,聊天的画风变了。以前是“昨晚又熬夜分析了一个新样本”,现在是“你们家那个AI模型,误报率压下来了吗?”。这背后,…

2026/7/4 13:07:14 阅读更多 →
Windows界面改造神器:用ExplorerPatcher重新定义你的桌面体验

Windows界面改造神器:用ExplorerPatcher重新定义你的桌面体验

Windows界面改造神器:用ExplorerPatcher重新定义你的桌面体验 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 在Windows 11发布后的…

2026/7/4 13:07:14 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻