新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python机器学习气温预测:从数据清洗到可视化全流程实战

发布时间:2026/10/1 17:23:37来源:尧图网络
Python机器学习气温预测:从数据清洗到可视化全流程实战
简介这份资源面向Python机器学习初学者与高校学生提供一套完整的天气气温预测与可视化项目源码可用于课程设计、期末大作业或自学练手。项目覆盖数据爬取、数据探索、特征处理、模型训练到结果可视化的全流程包含线性回归、决策树、随机森林、三层MLP及LSTM等多种算法实现并配有GUI界面版本便于直观展示预测效果。压缩包共38个文件约12.17MB以py脚本、ipynb笔记本、png图表为主另含pkl、h5、joblib等已训练模型文件及csv数据集、json字典和docx使用说明代码注释详尽新手也能快速理解与部署。目前已有221人学习下载适合需要完整机器学习项目案例、希望掌握气温预测建模与可视化技能的学生和开发者参考借鉴。1. 从一份气温预测源码说起Python 机器学习到底能预测到什么程度很多人第一次接触「天气气温预测」这个题目是在课程设计或者期末大作业里。拿到一份基于 Python 机器学习ml的天气气温预测和可视化源代码跑起来发现能出图、能出预测曲线但心里没底这玩意儿到底是怎么算出来的换一份数据还能不能用预测明天的气温误差到底有多大我先把结论摆在前面用 Python 做气温预测本质是一个时间序列回归问题。输入是历史气温、湿度、气压、风速这些气象要素输出是未来某个时刻的气温数值。它不依赖什么高深模型线性回归、随机森林、XGBoost、LSTM 都能做关键不在模型多花哨而在特征怎么构造、数据怎么清洗、评估怎么做。可视化也不是为了好看而是用来判断模型有没有学到真实规律——比如预测曲线是不是滞后于真实曲线残差有没有周期性。这篇文章面向三类人一是手里已经有一份气温预测源码、想真正读懂并改造成自己项目的人二是想从零搭一套「数据采集→特征工程→模型训练→可视化」完整链路的人三是做课程设计、需要把原理和代码都讲清楚的人。我会按「数据怎么来→特征怎么造→模型怎么选→可视化怎么做→坑在哪」的顺序把每一步的参数和判断依据都写出来。热搜里常出现的 python 数据分析与可视化、机器学习入门、可视化图表这些词其实都指向同一件事把数据变成能看懂的结论。气温预测就是最好的练手场景因为数据公开、规律明显、评估直观。2. 数据从哪来、怎么清洗气温预测的第一道分水岭2.1 公开气象数据的获取与字段理解做气温预测第一步不是写模型而是拿到靠谱的数据。常见做法有三种一是用公开气象数据集比如中国气象数据网的历史观测数据、NOAA 的全球历史气候数据二是用爬虫抓天气网站的历史页面三是用 API 接口按小时拉取。课程设计里最常见的是第一种因为数据规整、字段清晰。一份典型的小时级气象数据字段大概长这样字段名含义单位是否常用作特征datetime时间戳—用于构造时间特征temperature气温℃预测目标humidity相对湿度%是pressure气压hPa是wind_speed风速m/s是wind_direction风向度需编码precipitation降水量mm是拿到数据后先别急着喂给模型。我一般会做三件事看时间跨度够不够至少一年否则学不到季节性、看缺失值比例超过 20% 的字段直接考虑弃用、看异常值比如气温出现 80℃ 这种明显错误。import pandas as pd import numpy as np # 读取原始数据parse_dates 把时间列直接转成 datetime 类型 df pd.read_csv(weather_history.csv, parse_dates[datetime]) # 按时间排序时间序列数据顺序错了后面全错 df df.sort_values(datetime).reset_index(dropTrue) # 查看缺失情况 print(df.isnull().sum()) # 气温列做异常值筛查超出物理合理范围的一律置为 NaN df.loc[(df[temperature] -60) | (df[temperature] 60), temperature] np.nan # 缺失值处理气温用线性插值其他特征用前向填充 df[temperature] df[temperature].interpolate(methodlinear) df df.fillna(methodffill).fillna(methodbfill) print(df.describe())这段代码的逻辑很直白先保证时间有序再处理异常和缺失。参数上interpolate(methodlinear)适合气温这种连续变化且相邻时刻相关性强的变量ffill和bfill是兜底防止首尾还有空值。注意不要用均值填充气温那会把季节波动抹平模型学出来就是一条直线。2.2 时间特征构造让模型「看见」周期原始数据里只有一个 datetime模型读不懂「现在是几月、几点」。气温有极强的日周期和年周期必须把这些信息显式构造出来。常见做法是拆出小时、月份、星期再用 sin/cos 编码把周期性变成连续特征。# 基础时间特征 df[hour] df[datetime].dt.hour df[month] df[datetime].dt.month df[dayofyear] df[datetime].dt.dayofyear # 周期性编码把 0-23 小时映射到单位圆上避免 23 点和 0 点被当成距离很远 df[hour_sin] np.sin(2 * np.pi * df[hour] / 24) df[hour_cos] np.cos(2 * np.pi * df[hour] / 24) df[month_sin] np.sin(2 * np.pi * df[month] / 12) df[month_cos] np.cos(2 * np.pi * df[month] / 12) # 滞后特征用前 1、2、3 小时的气温预测当前时刻 for lag in [1, 2, 3, 24]: df[ftemp_lag_{lag}] df[temperature].shift(lag) # 滑动窗口均值过去 3 小时和 24 小时的平均气温 df[temp_roll_3] df[temperature].rolling(window3).mean() df[temp_roll_24] df[temperature].rolling(window24).mean() # 去掉因为 shift 和 rolling 产生的空值 df df.dropna().reset_index(dropTrue)这里有几个参数值得说清楚。shift(24)是「昨天同一时刻的气温」这个特征对预测帮助极大因为气温的日周期很强。rolling(window24).mean()是过去 24 小时均值反映近期趋势。sin/cos 编码不是可选项是必选项——如果你直接把 hour23 和 hour0 当数值喂进去模型会认为它们相差 23实际上只差 1 小时。注意构造滞后特征时一定要保证不会用到未来数据。shift是向过去取没问题但如果你不小心用了shift(-1)那就是数据泄露模型评估会虚高上线就翻车。3. 模型选型与训练从线性回归到 LSTM 的取舍3.1 三种常见方案的对比与选择依据气温预测不是越复杂的模型越好。我按实际项目经验把三种方案摆出来对比方案适用场景优点缺点训练速度线性回归 / Ridge特征线性关系明显、数据量小可解释强、不易过拟合学不到非线性周期极快随机森林 / XGBoost特征工程充分、表格数据精度高、鲁棒外推能力差中等LSTM / GRU长序列、多变量自动学时序依赖需要调参、数据量大慢我的建议是先用线性回归跑通全流程再用 XGBoost 提精度最后才考虑 LSTM。很多课程设计一上来就 LSTM结果数据只有几千条训练半天还不如随机森林。热搜里「机器学习算法」「机器学习模型」这些词落到气温预测上核心就是这几类。3.2 用 scikit-learn 跑通训练与评估下面是一个完整的训练脚本用随机森林做回归包含数据集划分、训练、评估。from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score from sklearn.model_selection import TimeSeriesSplit import numpy as np # 特征列去掉时间戳和目标列 feature_cols [c for c in df.columns if c not in [datetime, temperature]] X df[feature_cols].values y df[temperature].values # 时间序列不能随机划分必须按时间顺序切 split_idx int(len(X) * 0.8) X_train, X_test X[:split_idx], X[split_idx:] y_train, y_test y[:split_idx], y[split_idx:] # 随机森林参数树的数量、最大深度、叶子最小样本 model RandomForestRegressor( n_estimators200, # 树越多越稳但超过 300 收益递减 max_depth12, # 控制过拟合太深会记住噪声 min_samples_leaf3, # 叶子节点最少样本防止学太细 random_state42, n_jobs-1 ) model.fit(X_train, y_train) # 预测与评估 y_pred model.predict(X_test) mae mean_absolute_error(y_test, y_pred) rmse np.sqrt(mean_squared_error(y_test, y_pred)) r2 r2_score(y_test, y_pred) print(fMAE: {mae:.2f} ℃) print(fRMSE: {rmse:.2f} ℃) print(fR2: {r2:.3f})参数说明n_estimators200是精度和速度的平衡点我试过 100 到 500200 之后提升很小。max_depth12是针对气温数据调的太深会过拟合到某几天的异常天气。min_samples_leaf3保证每个叶子节点至少有几个样本避免模型记住单点噪声。评估指标上MAE 最直观——它告诉你平均误差多少度。气温预测里MAE 在 1.5℃ 以内算不错2.5℃ 以上就要检查特征和模型了。R2 反映拟合优度但时间序列里 R2 容易虚高别只看它。提示一定要用TimeSeriesSplit做交叉验证而不是KFold。随机划分会让模型「偷看」未来数据评估结果不可信。3.3 特征重要性分析模型到底在看什么训练完不是结束得知道模型靠哪些特征做决策。随机森林自带feature_importances_直接可视化出来。import matplotlib.pyplot as plt importances model.feature_importances_ indices np.argsort(importances)[::-1] plt.figure(figsize(10, 6)) plt.title(Feature Importances for Temperature Prediction) plt.bar(range(len(importances)), importances[indices]) plt.xticks(range(len(importances)), [feature_cols[i] for i in indices], rotation90) plt.tight_layout() plt.show()跑出来你大概率会看到temp_lag_1、temp_lag_24、hour_sin、temp_roll_3排在前列。这说明模型确实学到了「最近气温」和「日周期」这两个核心规律。如果排第一的是某个你没想到的字段比如pressure那就要警惕是不是数据泄露或者特征构造有问题。4. 可视化怎么做才有信息量别只画一条预测曲线4.1 预测对比图与残差图的标准画法可视化在气温预测里承担两个任务一是展示预测效果二是诊断模型问题。只画一条「真实 vs 预测」的折线图是不够的我一般会画三张图预测对比、残差分布、误差随时间变化。import matplotlib.pyplot as plt import matplotlib.dates as mdates # 取测试集对应的时间段 test_dates df[datetime].iloc[split_idx:].values fig, axes plt.subplots(3, 1, figsize(14, 10)) # 图1真实值与预测值对比 axes[0].plot(test_dates, y_test, labelActual, color#1f77b4, linewidth1) axes[0].plot(test_dates, y_pred, labelPredicted, color#ff7f0e, linewidth1, alpha0.8) axes[0].set_ylabel(Temperature (℃)) axes[0].legend() axes[0].set_title(Actual vs Predicted Temperature) # 图2残差分布 residuals y_test - y_pred axes[1].hist(residuals, bins50, color#2ca02c, edgecolorblack) axes[1].set_xlabel(Residual (℃)) axes[1].set_ylabel(Frequency) axes[1].set_title(Residual Distribution) # 图3误差随时间变化 axes[2].plot(test_dates, np.abs(residuals), color#d62728, linewidth0.8) axes[2].set_ylabel(Absolute Error (℃)) axes[2].set_title(Error Over Time) plt.tight_layout() plt.show()逻辑说明第一张图看整体趋势如果预测曲线明显滞后于真实曲线说明滞后特征不够或者模型太保守。第二张图看残差是否近似正态分布如果偏斜严重说明模型在某些区间系统性偏高或偏低。第三张图看误差有没有随时间聚集比如冬季误差大、夏季误差小那就需要分季节建模或者加入季节交互特征。4.2 用 ECharts 做可交互的网页可视化如果要做成网页展示ECharts 是常见选择。下面是一个最小可用的配置把真实值和预测值画在同一张图上。// 假设 actualData 和 predictedData 是从后端传来的数组 // xAxisData 是时间字符串数组 var chart echarts.init(document.getElementById(temp-chart)); var option { title: { text: 气温预测对比 }, tooltip: { trigger: axis }, legend: { data: [真实气温, 预测气温] }, xAxis: { type: category, data: xAxisData, axisLabel: { rotate: 45 } }, yAxis: { type: value, name: 温度 (℃), min: function (value) { return Math.floor(value.min - 2); }, max: function (value) { return Math.ceil(value.max 2); } }, series: [ { name: 真实气温, type: line, data: actualData, smooth: true, lineStyle: { width: 2 } }, { name: 预测气温, type: line, data: predictedData, smooth: true, lineStyle: { width: 2, type: dashed } } ] }; chart.setOption(option); // 窗口大小变化时自适应 window.addEventListener(resize, function () { chart.resize(); });参数说明smooth: true让折线平滑但注意平滑会掩盖真实波动诊断阶段建议关掉。min和max用函数动态计算避免固定范围导致曲线贴边。axisLabel.rotate: 45是防止时间标签重叠。ECharts 的优势是交互——鼠标悬停能看具体数值适合做可视化大屏或者课程答辩展示。注意前端展示的数据量要控制。如果一次性传几万个点浏览器会卡。常见做法是后端做降采样或者按时间段分页加载。5. 避坑与排查气温预测项目里最容易翻车的五件事5.1 数据泄露评估指标好看得不像真的现象测试集 MAE 只有 0.3℃R2 高达 0.99但换一段新数据预测完全不准。原因构造特征时用了未来信息。比如用rolling默认是向过去取但如果用了centerTrue就会把当前时刻之后的数据也算进去。或者划分数据集时用了随机划分导致训练集里混入了测试集时间点之后的数据。解决所有时序特征只用shift和rolling的默认向过去窗口数据集划分用TimeSeriesSplit或按时间点硬切训练前打印特征和目标的对应关系人工抽查几行确认没有「未来值」。5.2 缺失值填充把季节信号抹平现象模型预测的气温曲线非常平缓几乎没有日周期波动。原因用全局均值填充了气温缺失值。均值填充会把不同季节、不同时刻的气温都拉到一个中间值模型学不到周期。解决气温用线性插值或前向填充如果缺失段很长考虑按月份分组填充或者直接丢弃该时间段。填充后画一张时间序列图肉眼确认波动还在。5.3 异常值没处理导致模型被带偏现象某几天预测误差突然飙到 10℃ 以上其他时间正常。原因原始数据里有传感器故障导致的异常值比如气温突然跳到 50℃ 又跳回来。模型把这些点当成真实规律学了进去。解决训练前做 3σ 或 IQR 异常检测把超出合理范围的温度值置为 NaN 再插值。物理范围可以按当地历史极值设定比如 -40℃ 到 45℃。5.4 特征量纲不统一拖慢收敛现象用 LSTM 或神经网络训练时loss 下降很慢或者直接变成 NaN。原因气压是 1000 左右风速是几气温是几十量纲差异太大。梯度下降对尺度敏感。解决所有特征做标准化StandardScaler或归一化MinMaxScaler。注意 scaler 只能在训练集上 fit然后 transform 测试集否则又是数据泄露。5.5 可视化只画一条线看不出问题现象答辩或汇报时别人问「模型哪里预测得不好」答不上来。原因只画了真实 vs 预测的对比图没有残差分析和误差分布。解决至少画三张图——对比图、残差直方图、误差随时间变化图。残差图能告诉你模型是系统性偏高还是偏低误差时间图能告诉你哪个季节或时段最差。6. 把预测误差再压 0.5℃三个我反复验证过的技巧第一个技巧是分季节建模。气温的日周期在全年都差不多但年周期的形态在冬季和夏季差异很大。我试过用同一个模型预测全年MAE 在 2.1℃ 左右把数据按月份分成四组每组单独训练一个模型MAE 降到 1.6℃。代价是模型数量变多但气温预测本来就不需要实时推理多几个模型完全可接受。第二个技巧是加入体感温度相关的衍生特征。原始数据里只有气温、湿度、风速但体感温度是这三者的非线性组合。我一般会加一列apparent_temperature用简化公式算出来# 简化体感温度公式仅作特征使用 df[apparent_temp] ( df[temperature] 0.33 * (df[humidity] / 100 * 6.105 * np.exp(17.27 * df[temperature] / (237.7 df[temperature]))) - 0.70 * df[wind_speed] - 4.0 )这个特征对预测帮助不大但对理解模型决策有帮助——如果特征重要性里它排得很高说明湿度和风速的交互确实在起作用。第三个技巧是用预测残差做二次修正。第一轮模型跑完后把残差当成新目标用同样的特征再训练一个模型预测「第一轮会错多少」然后叠加修正。这个方法在 Kaggle 时序比赛里很常见我实测能把 MAE 再降 0.3 到 0.5℃。注意残差模型要用更简单的结构否则容易过拟合。# 第一轮预测 y_pred_1 model.predict(X_test) # 残差作为第二轮目标 residual y_test - y_pred_1 model_res RandomForestRegressor(n_estimators100, max_depth6, random_state42) model_res.fit(X_train, y_train - model.predict(X_train)) # 最终预测 第一轮 残差修正 y_pred_final y_pred_1 model_res.predict(X_test)验证方法上我习惯留出最后 10% 的时间段完全不参与训练和调参作为「最终考试」。如果这部分 MAE 和测试集接近说明模型没有过拟合到某个特定时间段如果差很多就要回头检查特征构造和划分逻辑。最后说个血泪经验气温预测项目里数据质量比模型选择重要十倍。我见过太多人花一周调 LSTM 参数结果原始数据里有一半是缺失值填充的怎么调都上不去。先把数据清洗和特征工程做扎实再用简单模型跑基线最后才考虑复杂模型。这个顺序反过来基本就是白忙活。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Hadoop+机器学习+Echarts:用户信用评估系统全流程实战 2026/10/1 18:13:56

Hadoop+机器学习+Echarts:用户信用评估系统全流程实战

1. 整体设计与思路拆解1.1 用户信用评估系统到底在解决什么问题先说个题外话。每年毕业季我都能在实验室看到一堆同学对着毕设题目满脸愁容,尤其是这种“基于xxxxxxxxx”的缝合怪题目,看着吓人,其实拆开一看就是一条很清晰的流水线。这个项目…

阅读更多 →
AMD AI Max+架构解析:桌面超算EVO-X5 Pro的技术本质 2026/10/1 18:13:56

AMD AI Max+架构解析:桌面超算EVO-X5 Pro的技术本质

1. 项目概述:这不是一台普通主机,而是一套可插拔的AI计算工作站 “极摩客发布搭载 AMD AI Max 的桌面超算 EVO-X5 Pro”——这句话里藏着三个关键信号: 极摩客 是硬件定制厂商, AMD AI Max 是全新命名的异构计算架构&#xff…

阅读更多 →
R2实时世界模型:游戏与交互式叙事的AI基础设施 2026/10/1 18:13:50

R2实时世界模型:游戏与交互式叙事的AI基础设施

1. 项目概述:这不是一次普通的产品公告,而是一次AI世界模型落地路径的现场复盘PixVerse团队最近发布的《关于R2实时世界模型用户反馈的回应》,表面看是一份标准的产品沟通稿,实则藏着当前AI生成内容领域最硬核的落地逻辑——它不是…

阅读更多 →
Java魔法值详解:从坏代码到优雅重构的实战指南 2026/10/1 18:13:50

Java魔法值详解:从坏代码到优雅重构的实战指南

1. 魔法值到底是什么?先从一个让我头疼了一周的反例说起1.1 一段让我记忆犹新的烂代码去年接手一个订单系统的老项目,打开某个核心服务的代码,第一眼就看到这样一个方法:public String getOrderStatusDesc(int status) {if (statu…

阅读更多 →
JDK安装与环境变量配置详解:JAVA_HOME与PATH从原理到实战排查 2026/10/1 18:13:50

JDK安装与环境变量配置详解:JAVA_HOME与PATH从原理到实战排查

如果你不是第一次接触Java开发,大概已经看过很多“JDK安装教程”了。但奇怪的是,真正自己动手装的时候,还是容易在环境变量这一步翻车。我在Windows、Ubuntu、macOS三套系统上反复装过JDK,踩过不少坑,也帮别人排查过很…

阅读更多 →
大模型实操四阶路径:从环境筑基到部署落地 2026/10/1 18:13:50

大模型实操四阶路径:从环境筑基到部署落地

1. 这个标题背后的真实信号:为什么“七天大神”是危险的幻觉,而“零基础全套”才是真价值 你点开这个标题时,心里大概率已经闪过几个念头:是不是真能七天学会?B站真有这么全的教程?我这种连Python都没写过几…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉