ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Python机器学习天气预测可视化源码:期末大作业完整实战指南

Python机器学习天气预测可视化源码:期末大作业完整实战指南 简介这是一套面向计算机相关专业学生与项目实战学习者的机器学习天气预测完整方案适用于期末大作业、毕业设计及课程实践场景难度适中可帮助读者快速理解从数据获取到模型部署的全流程。压缩包共38个文件约12.17MB包含10个py脚本、4个ipynb笔记本、10张png图表以及pkl、h5、joblib等模型文件与csv、json数据集覆盖数据爬取、模型训练、可视化与GUI交互等模块。已有115人学习下载。资源提供线性回归、决策树、随机森林、MLP与LSTM等多类气温预测实现并附数据探索、气温可视化及全国天气信息爬取脚本模型权重与标准化器均已保存便于直接复现与对比实验配套docx手册与requirements说明可辅助理解目录结构与运行环境适合作为课程设计参考或二次开发基础。1. 从一份天气预测源码说起机器学习期末大作业到底该交什么每年期末季总有一批同学在搜索框里敲下「Python机器学习天气预测可视化源码」想找一份能直接跑通、能改、能写进报告的大作业。这个标题背后其实藏着三件事用 Python 做机器学习建模、用真实气象数据做预测、再把结果用可视化图表讲清楚。它适合两类人——一类是赶期末大作业的学生需要一套结构完整、注释清楚、能复现的代码另一类是刚入门机器学习的工程师想找一个数据量不大、特征直观、能快速看到效果的练手项目。天气预测恰好满足这些条件数据公开、特征有物理含义、回归和分类任务都能做可视化结果也好看。但真正动手时你会发现坑不在模型本身而在数据清洗、特征构造和评估方式上。下面我按自己做过的一套流程把从数据到图表再到报告的完整路径拆开讲。2. 天气预测的数据从哪来、特征怎么选先别急着上模型2.1 公开气象数据的获取与字段理解做天气预测第一步不是写模型而是搞清楚数据长什么样。常见的公开数据源包括气象站历史观测记录、再分析数据集和城市级日值数据。我一般会选一份包含日期、气温、湿度、气压、风速、风向、降水量、云量这些字段的 CSV时间跨度至少一年最好三到五年。字段越多特征工程的空间越大但也要注意缺失值和量纲问题。拿到数据后先做三件事看行数列数、看每列的数据类型和缺失比例、看时间字段是否连续。很多同学直接df.describe()就开跑结果后面发现某个月份整段缺失模型评估直接失真。我的习惯是先画一张缺失值热力图再决定是插值、删除还是换数据源。import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 读取气象数据parse_dates 把日期列直接转成 datetime df pd.read_csv(weather_history.csv, parse_dates[date]) # 查看基本信息行数、列名、类型、缺失情况 print(df.info()) print(df.isnull().sum().sort_values(ascendingFalse)) # 缺失值热力图一眼看出哪些时间段或字段缺得厉害 plt.figure(figsize(12, 5)) sns.heatmap(df.isnull(), cbarFalse, yticklabelsFalse, cmapviridis) plt.title(Missing Value Map) plt.show()这段代码的逻辑是先建立数据全貌再决定清洗策略。parse_dates参数很关键如果日期列是字符串后面做时间序列特征会非常麻烦。isnull().sum()按缺失数量排序能快速定位问题字段。热力图不是装饰它能暴露「某几个月整段缺失」这种用统计量看不出来的问题。2.2 特征工程把原始气象字段变成模型能吃的输入原始字段往往不能直接喂给模型。比如风向是 0 到 360 度的角度直接当数值用会引入错误的序关系日期字段本身没有预测意义但「月份」「季节」「是否周末」有。我一般会构造这几类特征时间特征月份、季度、一年中的第几天、是否节假日滞后特征前一天、前两天的气温和湿度天气有很强的自相关性滚动特征过去 3 天、7 天的平均气温和降水量角度编码风向用 sin 和 cos 两个分量表示避免角度断裂import numpy as np # 时间特征 df[month] df[date].dt.month df[day_of_year] df[date].dt.dayofyear df[season] df[month].map({12:0,1:0,2:0,3:1,4:1,5:1, 6:2,7:2,8:2,9:3,10:3,11:3}) # 滞后特征前 1 天和前 2 天的气温 df[temp_lag1] df[temperature].shift(1) df[temp_lag2] df[temperature].shift(2) # 滚动特征过去 3 天平均气温 df[temp_roll3] df[temperature].rolling(window3).mean() # 风向角度编码 df[wind_sin] np.sin(np.deg2rad(df[wind_degree])) df[wind_cos] np.cos(np.deg2rad(df[wind_degree])) # 滞后和滚动会产生 NaN直接删掉这些行 df df.dropna().reset_index(dropTrue)这里每个操作都有明确目的。shift构造滞后特征时第一行必然变成 NaNrolling的前两行也是 NaN所以最后统一dropna。风向的 sin/cos 编码是处理周期性变量的标准做法比直接保留角度值稳定得多。做完这一步特征数量通常从原来的十来个扩展到二三十个模型能捕捉的信息明显变多。注意滞后特征在真实预测场景中只能用历史数据不能把未来信息混进来。做时间序列切分时训练集必须在测试集之前不能随机打乱。3. 模型选型与训练从线性回归到梯度提升的取舍3.1 为什么天气预测常用回归而不是分类天气预测可以做成分类任务比如预测「明天是否下雨」也可以做成回归任务比如预测「明天的气温是多少」。期末大作业里回归任务更容易展示模型效果因为可以直接用 MAE、RMSE、R² 这些指标量化可视化时真实值和预测值的折线图也直观。我一般会先做气温回归再做降水分类两个任务共用一套特征管道。模型选择上不要一上来就上深度学习。传统机器学习模型在中小规模气象数据上表现已经很稳训练快、调参少、解释性强。我常用的对比组合是线性回归作为基线、随机森林作为主力、梯度提升作为提升项。如果数据量确实大、特征维度高再考虑加一层简单的神经网络。from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score # 特征列和目标列 feature_cols [month, day_of_year, season, humidity, pressure, wind_sin, wind_cos, temp_lag1, temp_lag2, temp_roll3] X df[feature_cols] y df[temperature] # 时间序列切分前 80% 做训练后 20% 做测试 split_idx int(len(df) * 0.8) X_train, X_test X.iloc[:split_idx], X.iloc[split_idx:] y_train, y_test y.iloc[:split_idx], y.iloc[split_idx:] # 三个模型对比 models { LinearRegression: LinearRegression(), RandomForest: RandomForestRegressor(n_estimators200, random_state42), GradientBoosting: GradientBoostingRegressor(n_estimators200, random_state42) } for name, model in models.items(): model.fit(X_train, y_train) pred model.predict(X_test) mae mean_absolute_error(y_test, pred) rmse np.sqrt(mean_squared_error(y_test, pred)) r2 r2_score(y_test, pred) print(f{name}: MAE{mae:.2f}, RMSE{rmse:.2f}, R2{r2:.3f})这段代码的核心是「时间序列切分」而不是随机切分。split_idx保证训练集在时间上早于测试集避免用未来数据预测过去。三个模型的参数都保持默认或简单设置目的是先看基线表现。n_estimators200是随机森林和梯度提升的常用起点再往上加收益递减还容易过拟合。3.2 参数怎么调三个必调参数和它们的边界随机森林和梯度提升的调参空间很大但期末大作业不需要网格搜索到极致。我一般只调三个参数参数作用常用范围调参建议n_estimators树的数量100–500先设 200看验证集曲线是否还在下降max_depth树的最大深度3–15太深容易过拟合太浅欠拟合learning_rate梯度提升的学习率0.01–0.2越小需要越多树通常 0.05–0.1 起步调参时不要只看测试集要留一个验证集。我的做法是从训练集里再切 20% 做验证用验证集选参数最后用测试集报最终指标。如果发现训练集 R² 很高但测试集 R² 很低基本就是过拟合优先降max_depth或减n_estimators。from sklearn.model_selection import TimeSeriesSplit from sklearn.model_selection import GridSearchCV # 时间序列交叉验证避免随机切分带来的信息泄露 tscv TimeSeriesSplit(n_splits5) param_grid { n_estimators: [100, 200, 300], max_depth: [5, 8, 12], learning_rate: [0.05, 0.1] } grid GridSearchCV( GradientBoostingRegressor(random_state42), param_grid, cvtscv, scoringneg_mean_absolute_error, n_jobs-1 ) grid.fit(X_train, y_train) print(Best params:, grid.best_params_) print(Best MAE:, -grid.best_score_)TimeSeriesSplit是这里的关键它按时间顺序切分交叉验证折不会让模型看到未来的数据。scoringneg_mean_absolute_error是因为 sklearn 的 GridSearchCV 默认最大化分数MAE 越小越好所以取负。n_jobs-1用满 CPU 核数能明显缩短调参时间。4. 可视化怎么做才不像截图堆砌从折线图到误差分布4.1 预测结果对比图让真实值和预测值同框可视化不是把plt.plot随便画几条线就完事。期末大作业里老师最想看到的是「你的模型到底预测得准不准」。最直接的方式是把测试集上的真实气温和预测气温画在同一张折线图上再叠加误差曲线。如果预测值整体贴合真实值说明模型学到了主要趋势如果某些时间段偏差特别大就要回去看那段时间的数据是不是有异常。import matplotlib.dates as mdates # 用测试集对应的时间索引 test_dates df[date].iloc[split_idx:] plt.figure(figsize(14, 6)) plt.plot(test_dates, y_test.values, labelActual, linewidth1.5) plt.plot(test_dates, pred, labelPredicted, linewidth1.5, alpha0.8) plt.fill_between(test_dates, y_test.values, pred, colorgray, alpha0.2, labelError) plt.xlabel(Date) plt.ylabel(Temperature) plt.title(Actual vs Predicted Temperature) plt.legend() plt.gca().xaxis.set_major_formatter(mdates.DateFormatter(%Y-%m)) plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval2)) plt.xticks(rotation45) plt.tight_layout() plt.show()fill_between把真实值和预测值之间的差距填成灰色区域误差大小一目了然。mdates控制日期显示格式避免 x 轴标签挤成一团。alpha参数让预测线稍微透明两条线重叠时也能看清。4.2 误差分布与特征重要性解释模型为什么这么预测只画一张对比图还不够报告里最好加上误差分布直方图和特征重要性排序。误差分布能看出模型是系统性偏高还是偏低特征重要性则能解释「哪些气象因素对预测贡献最大」。随机森林和梯度提升都自带feature_importances_属性直接拿来画横向条形图。# 误差分布 errors y_test.values - pred plt.figure(figsize(8, 5)) sns.histplot(errors, bins30, kdeTrue) plt.axvline(0, colorred, linestyle--) plt.title(Prediction Error Distribution) plt.xlabel(Error) plt.show() # 特征重要性 importances models[GradientBoosting].feature_importances_ feat_imp pd.Series(importances, indexfeature_cols).sort_values() plt.figure(figsize(8, 6)) feat_imp.plot(kindbarh) plt.title(Feature Importance) plt.xlabel(Importance) plt.tight_layout() plt.show()误差分布如果近似正态且均值接近 0说明模型没有明显系统偏差。特征重要性图里滞后气温和滚动平均气温通常排在最前面这符合天气的物理规律。如果某个无关特征排得很高就要检查是不是数据泄露了。5. 避坑与排查天气预测大作业最容易翻车的五个地方5.1 用随机切分做时间序列指标虚高现象训练集和测试集 R² 都在 0.95 以上但把模型拿去预测下个月的数据误差大得离谱。原因train_test_split默认随机打乱测试集里混入了训练集之后的数据模型实际上「偷看」了未来。解决改用时间顺序切分训练集在前、测试集在后交叉验证用TimeSeriesSplit。5.2 滞后特征构造后没删 NaN模型报错或结果异常现象RandomForestRegressor训练时报「Input contains NaN」或者删了 NaN 但没重置索引后面按时间画图时对不上。原因shift和rolling必然产生缺失值很多人只dropna不reset_index。解决df df.dropna().reset_index(dropTrue)确保索引连续画图时用df[date]而不是原始索引。5.3 风向直接当数值模型学到错误序关系现象风向特征重要性很低但物理上风向对天气影响很大。原因0 度和 360 度在数值上差很远实际是同一个方向模型无法理解这种周期性。解决用 sin 和 cos 两个分量编码风向保留角度信息的同时消除断裂。5.4 缺失值用均值填充破坏时间连续性现象填充后数据看起来完整但模型在缺失段附近的预测明显偏差。原因气象数据有强时间相关性均值填充抹掉了趋势。解决优先用前后值插值interpolate或前向填充ffill实在缺得太多就删掉那段时间。5.5 可视化图表没有标题和单位报告被扣分现象代码跑通了图也画了但老师反馈「看不懂」。原因缺 x 轴 y 轴标签、缺单位、缺图例。解决每张图都加xlabel、ylabel、title、legend气温标摄氏度降水量标毫米日期格式统一。6. 把源码变成能交差的报告三个进阶技巧第一个技巧是加一个简单的预测界面。不用做很复杂的 Web 应用用ipywidgets在 Jupyter Notebook 里拉几个滑块让用户调湿度、气压、前一天气温实时输出预测结果。这个交互能显著提升大作业的演示效果代码量也不大。from ipywidgets import interact def predict_temp(humidity, pressure, temp_lag1): input_df pd.DataFrame([[6, 180, 2, humidity, pressure, 0.5, 0.8, temp_lag1, temp_lag1-1, temp_lag1]], columnsfeature_cols) result models[GradientBoosting].predict(input_df)[0] print(fPredicted temperature: {result:.1f} C) interact(predict_temp, humidity(30, 100, 5), pressure(980, 1040, 2), temp_lag1(-10, 40, 1))第二个技巧是把模型评估结果整理成一张对比表直接放进报告。表格比文字更有说服力也方便老师快速看到你做了哪些对比。模型MAERMSER²训练时间线性回归2.83.60.821s随机森林1.92.50.913s梯度提升1.72.30.938s第三个技巧是保存模型和特征列方便复现。用joblib把训练好的模型和feature_cols一起存下来下次直接加载就能预测不用重新训练。import joblib # 保存模型和特征列 joblib.dump({model: models[GradientBoosting], features: feature_cols}, weather_model.pkl) # 加载时直接还原 saved joblib.load(weather_model.pkl) model saved[model] features saved[features]我自己做这类大作业时最大的教训是「先跑通再优化」。一开始总想把特征工程做到完美、模型调到最优结果时间全花在调参上报告反而没写完。后来我改成先用线性回归跑通全流程出一版图表和指标再逐步替换模型、加特征。这样任何时候都有一份能交的版本心里不慌。希望帮到你。本文还有配套的精品资源点击获取
返回列表