Python机器学习气温预测源码包:从数据爬取到LSTM模型与GUI可视化全流程

发布时间:2026/10/3 8:52:42
Python机器学习气温预测源码包:从数据爬取到LSTM模型与GUI可视化全流程 简介这份资源是面向计算机相关专业学生与项目实战学习者的机器学习天气预测完整项目包适用于期末大作业、毕业设计及课程实践场景难度适中已通过导师评审并获得98分。项目以Python为核心围绕气温预测与数据可视化展开涵盖数据爬取、数据探索、特征处理、模型训练与GUI展示等完整流程涉及线性回归、决策树、随机森林、三层MLP与LSTM等多种算法并配有模型持久化文件与可视化图表便于对照理解各模型的预测效果与调参思路。压缩包共38个文件约12.17MB包含py源码、ipynb笔记本、png与jpg图表、pkl与joblib模型文件、h5深度模型、csv与json数据集以及docx说明文档结构清晰源码均经本地编译调试可运行。目前已有117人学习适合需要完整方案与排错参考的学习者下载使用。1. 从一份能跑通的气温预测源码说起它到底解决了什么问题很多同学做机器学习期末大作业时卡点从来不是「不会调库」而是手里没有一份结构完整、能跑通、还带文档的工程。这份 Python 机器学习天气预测与可视化源码包恰好补的就是这个缺口它把数据爬取、数据探索、特征工程、多模型训练、GUI 展示、可视化图表串成了一条完整链路数据集用的是 WeatherData.csv 和临沧 2020 到 2023 年的历史天气 CSV模型覆盖线性回归、决策树、随机森林、3 层 MLP 和 LSTM 五类还附带了训练好的权重文件和一份 docx 手册。适合正在做机器学习、数据分析方向大作业或毕业设计的同学也适合想拿一个真实时间序列项目练手的人。它不教你从零推导反向传播但能让你在本地把「气温预测」这件事从头到尾跑一遍并且看懂每一步在干什么。2. 环境搭建与数据管线从 requirements.txt 到能喂进模型的数据2.1 依赖安装与版本对齐拿到压缩包后第一件事不是急着跑 .py而是先把环境对齐。包里有一份 requirements.txt这是最省事的入口。我一般会先建一个独立虚拟环境避免和本机已有的 TensorFlow、scikit-learn 版本打架因为 LSTM 那部分对 TensorFlow 版本比较敏感版本错位很容易出现加载 .h5 模型失败的情况。# 创建虚拟环境Python 建议 3.8 到 3.10 python -m venv weather_env # 激活环境Windows weather_env\Scripts\activate # 激活环境macOS / Linux source weather_env/bin/activate # 按清单安装依赖 pip install -r requirements.txt这段命令的逻辑很直白先隔离环境再按清单装包。参数上唯一需要留意的是 Python 版本requirements.txt 里通常会锁定 tensorflow、scikit-learn、pandas、matplotlib、joblib 这几个核心库。如果安装过程中 tensorflow 报错常见做法是单独指定一个稳定版本比如pip install tensorflow2.10.0而不是硬扛最新版。装完之后建议跑一句pip list核对一下重点看 tensorflow、scikit-learn、joblib 三个是否都在。2.2 数据文件结构与字段理解这个项目的数据分两块一块是 dataset 目录下的 WeatherData.csv属于整理好的主数据集另一块是 Lingcang202001-202312.csv是临沧地区 2020 年 1 月到 2023 年 12 月的逐日历史天气。配套的 all_county_dict.json 和 city_dict_1.json 是城市与区县的映射字典全国天气信息爬取.py 和 临沧历史天气爬取.py 负责把原始数据抓下来。文件作用使用阶段WeatherData.csv主训练数据集训练与评估Lingcang202001-202312.csv临沧历史天气明细可视化与验证all_county_dict.json全国区县映射爬取阶段city_dict_1.json城市编码映射爬取阶段requirements.txt依赖清单环境搭建理解字段是后面所有操作的前提。气温预测任务里通常会把日期、最高温、最低温、天气状况、风力、降水量作为原始列然后从日期里拆出年、月、日、星期等时间特征。这一步在 数据探索.py 里能看到具体做法我建议先打开这个脚本读一遍比直接跑模型更能建立整体感。2.3 数据探索与特征构造数据探索这一步决定了后面模型的上限。时间序列预测最忌讳的就是把未来信息泄漏进训练集所以构造滞后特征lag feature时一定要按时间顺序切分而不是随机打乱。import pandas as pd # 读取主数据集 df pd.read_csv(dataset/WeatherData.csv) # 日期列转标准时间类型 df[date] pd.to_datetime(df[date]) # 按时间排序时间序列不能乱序 df df.sort_values(date).reset_index(dropTrue) # 拆出时间特征 df[year] df[date].dt.year df[month] df[date].dt.month df[day] df[date].dt.day df[weekday] df[date].dt.weekday # 构造前 1 天、前 2 天的气温滞后特征 df[lag_1] df[temperature].shift(1) df[lag_2] df[temperature].shift(2) # 去掉因 shift 产生的空值 df df.dropna().reset_index(dropTrue)逻辑说明先排序保证时间连续再拆时间特征最后用 shift 构造滞后项。参数上shift(1) 表示用前一天的值预测当天shift(2) 是前两天的值。滞后阶数不是越多越好一般先试 1 到 3 阶阶数太高会引入冗余和过拟合。dropna 是必须的否则第一行会是 NaN直接喂给模型会报错。这一步做完数据才算真正能进模型。3. 五类模型训练与权重文件从线性回归到 LSTM 的落地路径3.1 传统模型线性回归、决策树、随机森林包里 models 目录下已经存好了 linear_regression_model.pkl、decision_tree_model.pkl、random_forest_model.pkl 三个权重文件说明作者是把传统模型和深度学习模型分开训练的。传统模型的好处是训练快、可解释性强适合先跑出一个基线再拿深度学习模型去对比。import joblib import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import mean_absolute_error, r2_score df pd.read_csv(dataset/WeatherData.csv) features [lag_1, lag_2, month, day, weekday] X df[features] y df[temperature] # 时间序列按顺序切分前 80% 训练后 20% 测试 split int(len(df) * 0.8) X_train, X_test X[:split], X[split:] y_train, y_test y[:split], y[split:] models { linear: LinearRegression(), tree: DecisionTreeRegressor(max_depth8, random_state42), forest: RandomForestRegressor(n_estimators200, random_state42) } for name, model in models.items(): model.fit(X_train, y_train) pred model.predict(X_test) print(name, MAE:, mean_absolute_error(y_test, pred), R2:, r2_score(y_test, pred)) joblib.dump(model, fmodels/{name}_model.pkl)逻辑说明切分用顺序切分而不是 train_test_split 随机切这是时间序列的铁律。决策树的 max_depth 控制树深防止过拟合随机森林的 n_estimators 是树的数量200 是常见起点。评估用 MAE 和 R2MAE 直接反映平均误差多少度R2 看拟合优度。joblib.dump 把模型存成 pkl方便 GUI 直接加载不用每次重训。3.2 3 层 MLP 与 Keras 权重加载3层MLP气温预测.py 和对应的 .h5 权重走的是 Keras 路线。MLP 适合处理已经构造好特征的表格数据三层结构一般是「输入层 两个隐藏层 输出层」激活函数用 ReLU输出层用线性激活做回归。import numpy as np from tensorflow.keras.models import Sequential, load_model from tensorflow.keras.layers import Dense from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_scaled scaler.fit_transform(X_train) model Sequential([ Dense(64, activationrelu, input_shape(X_train.shape[1],)), Dense(32, activationrelu), Dense(1) ]) model.compile(optimizeradam, lossmse, metrics[mae]) model.fit(X_scaled, y_train, epochs100, batch_size32, validation_split0.1) model.save(models/MPL_temperature_prediction_model.h5)逻辑说明StandardScaler 对特征做标准化神经网络对量纲敏感不标准化收敛会很慢。两个隐藏层 64 和 32 是常见配置epochs 100 配合 validation_split 0.1 观察是否过拟合。注意包里权重文件名是 MPL_temperature_prediction_model.h5这里有个拼写细节加载时要用实际文件名别按 MLP 去找否则会报文件不存在。3.3 LSTM 时间序列预测与 scaler 配套LSTM 是这个项目里技术含量最高的部分LSTM气温预测.py 和 .ipynb 都在做这件事。LSTM 需要把数据整理成「样本数、时间步长、特征数」的三维张量这是新手最容易翻车的地方。import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense from sklearn.preprocessing import MinMaxScaler import joblib scaler MinMaxScaler() data scaler.fit_transform(df[[temperature]]) joblib.dump(scaler, models/lstm_scaler.joblib) def make_sequences(data, step7): X, y [], [] for i in range(len(data) - step): X.append(data[i:istep, 0]) y.append(data[istep, 0]) return np.array(X), np.array(y) X_seq, y_seq make_sequences(data, step7) X_seq X_seq.reshape((X_seq.shape[0], X_seq.shape[1], 1)) model Sequential([ LSTM(50, activationrelu, input_shape(7, 1)), Dense(1) ]) model.compile(optimizeradam, lossmse) model.fit(X_seq, y_seq, epochs50, batch_size32) model.save(models/LSTM_temperature_prediction_model.h5)逻辑说明step7 表示用过去 7 天预测第 8 天这是气温预测里比较自然的窗口。reshape 把二维转成三维第三维是特征数这里只有气温一个特征所以是 1。scaler 必须和模型一起保存因为预测时新数据要用同一个 scaler 变换否则量纲不一致预测结果会离谱。lstm_scaler.joblib 就是干这个的别把它弄丢。4. 可视化与 GUI把预测结果变成能演示的东西4.1 气温可视化.ipynb 的图表逻辑可视化是这类大作业的加分项。气温可视化.ipynb 里通常会用 matplotlib 画真实值对比预测值的折线图、月度气温分布、年度趋势等。img 目录下那批 png 和 jpg 就是运行后导出的结果图可以直接放进报告。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False plt.figure(figsize(12, 5)) plt.plot(y_test.values, label真实气温) plt.plot(pred, label预测气温) plt.xlabel(时间) plt.ylabel(气温) plt.title(气温预测对比) plt.legend() plt.savefig(img/prediction_compare.png, dpi150) plt.show()逻辑说明中文字体必须设置否则标题和标签会显示成方块这是最常见的翻车点。figsize 控制画布大小dpi 150 保证导出图清晰。真实值和预测值画在同一张图上一眼就能看出模型在哪些区间偏差大比如极端高温或降温拐点处往往误差偏大。4.2 GUI 最简版与正式版的差异GUI最简版.py 和 GUI正式版.py 是两个不同复杂度的界面。最简版一般只做「输入特征、点击预测、显示结果」三步适合快速验证模型能不能加载正式版会加上文件选择、图表嵌入、多模型切换等功能。我建议先用最简版确认模型加载没问题再上正式版。import tkinter as tk import joblib import numpy as np model joblib.load(models/random_forest_model.pkl) def predict(): feats [float(entry.get()) for entry in entries] result model.predict(np.array([feats])) label.config(textf预测气温: {result[0]:.2f}) root tk.Tk() root.title(气温预测) entries [] for name in [lag_1, lag_2, month, day, weekday]: tk.Label(root, textname).pack() e tk.Entry(root) e.pack() entries.append(e) tk.Button(root, text预测, commandpredict).pack() label tk.Label(root, text等待预测) label.pack() root.mainloop()逻辑说明tkinter 是标准库不用额外装。输入框顺序必须和训练时 features 的顺序完全一致顺序错了预测结果就是错的这是 GUI 里最隐蔽的坑。正式版如果加载的是 .h5 模型记得用 load_model 而不是 joblib两种格式不能混用。5. 避坑与排查跑不通时先看这几条5.1 模型加载报错格式与文件名对不上现象运行 GUI 或预测脚本时提示找不到模型文件或者加载 .h5 时报格式错误。原因通常是文件名拼写不一致比如权重文件实际叫 MPL_temperature_prediction_model.h5脚本里却写成 MLP或者用 joblib 去加载 .h5格式根本不匹配。解决先ls models核对实际文件名pkl 用 joblib.loadh5 用 tensorflow.keras.models.load_model两者不能互换。5.2 预测结果离谱scaler 没配套使用现象LSTM 预测出来的气温是 0 到 1 之间的小数或者数值完全不合理。原因是用 MinMaxScaler 训练后预测时忘了用同一个 scaler 做逆变换。解决加载 lstm_scaler.joblib对预测结果执行scaler.inverse_transform把归一化后的值还原成真实温度。5.3 中文乱码matplotlib 字体没设置现象可视化图表里标题、坐标轴全是方块。原因matplotlib 默认字体不支持中文。解决在绘图前加plt.rcParams[font.sans-serif] [SimHei]和plt.rcParams[axes.unicode_minus] FalseWindows 下 SimHei 一般都有macOS 可以换成 Arial Unicode MS。5.4 时间序列切分错误随机切分导致数据泄漏现象模型在测试集上 R2 高得离谱实际预测却很差。原因用了 train_test_split 随机切分把未来数据混进了训练集。解决改成按时间顺序切分前 80% 训练、后 20% 测试滞后特征也要确保只用历史信息。5.5 爬取脚本失效网页结构变化现象全国天气信息爬取.py 或 临沧历史天气爬取.py 跑出来是空数据。原因目标网页结构改版原来的解析规则失效。解决打开脚本检查请求 URL 和解析逻辑用浏览器开发者工具重新定位数据所在的标签更新解析规则。这类脚本本身依赖外部网页时效性有限数据文件已经存好的情况下优先用现成 CSV。6. 进阶玩法把这份源码改成你自己的项目跑通只是第一步真正拉开差距的是你能不能在这份源码基础上做出自己的东西。我一般会从三个方向改换数据、换模型、换展示。换数据是最容易上手的。把 Lingcang202001-202312.csv 换成你所在城市的历史天气重新跑一遍数据探索和训练报告里就有了地域特色。换模型可以试试在 LSTM 基础上加一层 Dropout 或者换成 GRU对比一下 MAE 的变化这就是一份现成的模型对比实验。换展示则是把 tkinter 界面换成 pyecharts 或 echarts 做可视化大屏演示效果会好很多。改造方向具体做法预期收益换数据替换城市历史 CSV报告有地域针对性换模型LSTM 加 Dropout 或换 GRU有模型对比实验换展示tkinter 换 pyecharts演示更直观加评估补 RMSE、MAPE 指标评估更完整验证改造是否有效最直接的办法是固定随机种子跑三次取平均 MAE避免单次结果波动带来的误判。我踩过最深的坑就是只看一次 R2 就下结论后来发现换个随机种子结果能差好几个点。从那以后我每次改完模型都强制跑三遍取均值再对比基线。希望这份源码能帮你把大作业顺利落地也希望你在它基础上做出点自己的东西。本文还有配套的精品资源点击获取