当前位置: 首页 > news >正文

基于 UCI 真实数据的城市 PM2.5 预测与预警系统实战

关键词:PM2.5 预测、城市空气质量预测、UCI 真实数据、机器学习回归、GradientBoosting、AQI 预警、Streamlit 可视化、Python 数据分析项目、课程设计

摘要

这篇文章围绕一个可以直接运行的城市空气质量 PM2.5 预测与预警系统展开。项目使用 UCI Beijing Multi-Site Air Quality Data 整理出的北京 12 个监测站日级数据,共 16,966 条记录,时间范围为 2013-03-01 至 2017-02-28。系统完成了真实数据预处理、气象与污染物特征工程、多模型训练、PM2.5 下一日预测、AQI 预警等级转换、健康建议输出和 Streamlit Web 看板展示。

项目不是只给几段模型代码,而是提供完整源码、配置文件、真实数据整理脚本、训练脚本、预测 CSV、评估报告、结果图表和正式运行截图。核心模型包含 Ridge、RandomForestRegressor 和 GradientBoostingRegressor,程序按测试集 MAE 自动选择最佳模型。本次真实数据运行结果中,最佳模型为 GradientBoosting,MAE 为 35.508 μg/m³,RMSE 为 54.378 μg/m³,R² 为 0.448,预警等级准确率为 0.466。

项目适合机器学习课程设计、数据挖掘实验、空气质量预测原型、Python 数据分析项目和 CSDN 项目实战展示。读者可以直接运行真实数据流程,也可以替换为新的城市监测站数据继续扩展。

1. 项目场景与业务目标

PM2.5 是城市空气质量监测中最常见的指标之一,它受季节、温度、湿度、气压、风速、降雨和其他污染物共同影响。空气质量预测项目的重点不只是拟合一个数值,还要把预测浓度转换成用户能理解的预警等级,并给出是否需要减少户外活动的提示。

真实雾霾天气下,能见度、出行体验和健康风险都会明显变化。预测系统的价值就在于把空气质量数据、气象变化和历史污染趋势转成可解释的未来预警。

本项目最终实现的是一个“从数据到预警”的完整流程:加载真实监测数据,按日期和站点聚合,构造滞后与滚动统计特征,训练多个回归模型,保存最佳模型,生成未来 7 天 PM2.5 预测,并将结果转换为 AQI、预警等级和健康建议。

系统架构如下图所示。数据层负责保存原始 zip、整理后的日级 CSV 和输出结果;算法层完成特征工程、模型训练、预测与预警转换;展示层负责输出图表、报告和 Streamlit 看板。

2. 数据来源与字段整理

本项目使用 UCI Beijing Multi-Site Air Quality Data。原始数据是北京多个监测站的小时级空气质量和气象记录,项目内通过tools/prepare_uci_beijing_data.py聚合为日级站点数据,输出到:

data/external/uci_beijing_daily_pm25.csv

整理后的数据包含 12 个监测站、16,966 条日级记录,日期范围为 2013-03-01 至 2017-02-28。核心字段如下:

字段含义
date日期
city北京监测站名称,格式如 Beijing-Aotizhongxin
temp_c日均气温
humidity由温度和露点估算的相对湿度
pressure_hpa日均气压
wind_speed_mps日均风速
wind_dir当日主导风向
rainfall_mm日累计降雨量
so2 / no2 / co / o3其他污染物浓度
pm10PM10 浓度
pm25PM2.5 浓度

UCI 原始数据中没有交通强度和工业活动指数,因此项目在预处理时加入了可复现的站点与工作日代理变量,作为工程演示字段。它们不是外部真实业务指标,正式研究中可以替换为城市交通指数、产业活动强度或排放源统计数据。

3. 项目目录结构

项目结构按“源码、数据、模型、结果、文档”分开,便于复现和打包。

city_pm25_forecast_warning_system/ ├── app.py ├── run_demo.py ├── requirements.txt ├── README.md ├── blog.md ├── configs/ │ └── config.yaml ├── data/ │ ├── city_pm25_sample.csv │ ├── external/ │ │ └── uci_beijing_daily_pm25.csv │ └── raw/ │ └── PRSA2017_Data_20130301-20170228.zip ├── tools/ │ ├── prepare_uci_beijing_data.py │ └── run_real_uci_demo.py ├── src/ │ ├── aqi.py │ ├── data_loader.py │ ├── feature_engineering.py │ ├── model_training.py │ ├── predictor.py │ ├── report.py │ └── visualization.py ├── models/ │ ├── best_pm25_model.joblib │ └── real_uci_best_pm25_model.joblib ├── images/ │ ├── figures/ │ └── results/ └── outputs/ ├── predictions/ └── reports/

src/是核心代码目录,tools/放真实数据整理与复现实验脚本,data/external/保存整理后的真实数据,outputs/保存预测结果和报告,images/results/保存正式图表和页面截图。

4. 特征工程与建模流程

PM2.5 预测不能只看当天浓度。空气污染具有明显的持续性和季节性,因此项目在src/feature_engineering.py中构造了日期周期、气象污染物、类别变量、滞后值和滚动统计特征。

真实数据建模流程如下图所示。原始小时级监测数据先按天聚合并映射字段,然后进行训练集和测试集切分,后续进入特征工程、多模型训练、误差评估和未来 7 天预测。

本项目的预测目标是下一日 PM2.5:

target_pm25_next_day = groupby(city).shift(-1)

这意味着模型使用第 t 天的气象、污染物和历史 PM2.5 特征,预测第 t+1 天的 PM2.5。滞后特征包括pm25_lag_1pm25_lag_2pm25_lag_3pm25_lag_7,滚动统计包括 3 日和 7 日窗口。所有滞后与滚动计算都按监测站分组,避免不同站点之间串数据。

项目使用三类模型做对比:

模型作用
Ridge线性基线,训练快,便于判断非线性建模是否必要
RandomForestRegressor稳健的树模型,能处理非线性和特征交互
GradientBoostingRegressor梯度提升树,在中小规模表格数据上通常表现较强

训练完成后,程序按 MAE 从小到大排序并保存最佳模型。模型包中不仅包含 pipeline,还包含训练时的特征列、数值特征、类别特征和评估指标,便于后续预测时保持特征顺序一致。

5. AQI 预警规则

预测 PM2.5 浓度只是第一步,预警系统还需要把浓度值转成可读的空气质量等级。本项目在src/aqi.py中实现 PM2.5 到 AQI 的转换,并追加aqiwarning_levelhealth_advice三列。

代码采用公开 AQI breakpoint 的线性插值方式:

AQI = (AQI_high - AQI_low) / (C_high - C_low) * (C - C_low) + AQI_low

其中C是 PM2.5 浓度,C_lowC_high是对应等级的浓度上下界。这样模型输出连续 PM2.5 后,系统可以直接给出 Good、Moderate、Unhealthy for Sensitive Groups、Unhealthy 等等级。

6. 运行方式

安装依赖后,可以先重新生成真实数据的日级 CSV:

pipinstall-rrequirements.txt python tools/prepare_uci_beijing_data.py

然后运行真实数据训练与预测流程:

python tools/run_real_uci_demo.py

如果只想快速检查基础流程,也可以运行样例数据脚本:

python run_demo.py

Web 看板运行命令如下:

streamlit run app.py

项目内存在data/external/uci_beijing_daily_pm25.csv时,Streamlit 默认使用 UCI 真实数据;如果该文件不存在,则退回内置样例数据,保证代码仍能离线跑通。

7. 真实数据运行结果

本次验证已执行:

python tools/prepare_uci_beijing_data.py python tools/run_real_uci_demo.py

数据整理脚本输出 16,966 条日级记录,覆盖 12 个北京监测站。真实数据训练结果如下:

modelMAERMSE预警等级准确率
GradientBoosting35.50854.3780.4480.466
RandomForest36.70055.7050.4210.480
Ridge37.61555.9720.4160.439

从 MAE 和 RMSE 看,GradientBoosting 是当前配置下误差最低的模型,因此被保存为最佳模型。模型对比图如下:

这里的预警等级准确率不是回归指标,而是把真实 PM2.5 和预测 PM2.5 分别转换成 AQI 等级后,比较两者是否落在同一预警等级。它能更贴近预警系统的业务目标。

8. 测试集预测曲线

仅看指标表不够,还需要观察预测曲线是否能跟随真实 PM2.5 的变化。下图展示了 Beijing-Aotizhongxin 监测站测试集中的真实值和预测值。

可以看到,模型对多数日常波动具备跟随能力,但对极端污染峰值仍会低估。这是空气质量预测中的常见问题:如果没有未来气象预报、排放源变化、区域传输和突发污染事件信息,仅靠历史日级数据很难完整捕捉尖峰。因此该系统更适合做趋势判断和预警辅助,而不应替代官方空气质量预报。

9. 未来 7 天 PM2.5 预测与预警

项目会基于每个监测站的最新历史数据递归预测未来 7 天 PM2.5,并输出 AQI 与健康建议。结果保存到:

outputs/predictions/real_uci_future_forecast.csv

监测站预测摘要如下:

cityavg_pm25max_pm25high_days
Beijing-Aotizhongxin54.2769.027
Beijing-Changping48.9662.757
Beijing-Dingling50.0762.957
Beijing-Dongsi50.9963.377
Beijing-Guanyuan49.4065.287
Beijing-Wanliu51.8969.277

预警分布图如下。未来 7 天预测中主要出现Unhealthy for Sensitive GroupsUnhealthy两类预警,说明系统不仅输出浓度,也能给出风险分层。

部分预测明细如下:

datecitysteppredicted_pm25AQIwarning_level
2017-03-01Beijing-Aotizhongxin150.71138Unhealthy for Sensitive Groups
2017-03-02Beijing-Aotizhongxin269.02160Unhealthy
2017-03-03Beijing-Aotizhongxin365.86158Unhealthy
2017-03-04Beijing-Aotizhongxin451.97142Unhealthy for Sensitive Groups
2017-03-05Beijing-Aotizhongxin548.28132Unhealthy for Sensitive Groups
2017-03-06Beijing-Aotizhongxin648.51133Unhealthy for Sensitive Groups
2017-03-07Beijing-Aotizhongxin745.53126Unhealthy for Sensitive Groups

这些日期从真实数据最后一天 2017-02-28 之后开始,是模型基于历史序列向后递推得到的预测结果。

10. 特征重要性分析

对于机器学习项目,不能只给出预测值,还要说明模型主要依赖哪些信号。项目会从最佳模型中提取特征重要性,并保存图表和 CSV:

images/results/real_uci_feature_importance.png images/results/real_uci_feature_importance.csv

本次真实数据结果中,当前 PM2.5、前一日变化、风速、气压、NO2、降雨量和季节周期等特征排在前列。特征重要性不能直接解释因果关系,但可以帮助检查模型是否依赖了合理信号。如果某个明显无关字段权重异常,就需要回到数据清洗和特征构造阶段排查泄漏或异常值。

11. Streamlit Web 看板效果

项目提供app.py作为 Web 可视化入口。页面会展示数据概览、模型指标、模型对比、测试集预测曲线、未来预警表和特征重要性。下图是本次使用 UCI 真实数据启动 Streamlit 后截取的正式运行页面。

页面中可以看到当前数据源、数据行数、监测站数量、起止日期、最佳模型和核心指标。用户也可以上传自定义 CSV,只要字段满足docs/dataset_notes.md中的说明,系统就会基于新数据重新训练和预测。

12. 核心代码说明

真实数据入口是tools/run_real_uci_demo.py,它会覆盖配置中的数据路径和输出路径,保证真实数据结果与样例数据结果分开保存:

config["data"]["sample_path"]="data/external/uci_beijing_daily_pm25.csv"config["training"]["model_path"]="models/real_uci_best_pm25_model.joblib"config["training"]["metrics_path"]="outputs/reports/real_uci_model_metrics.json"config["forecast"]["forecast_path"]="outputs/predictions/real_uci_future_forecast.csv"

训练函数train_and_evaluate会完成监督数据构造、时间顺序切分、候选模型训练、指标计算和最佳模型保存。预测函数forecast_next_days则基于最近历史数据递推未来多天,并调用append_warning_columns追加 AQI、预警等级和健康建议。

13. 如何替换为自己的城市数据

如果要替换为新的城市数据,需要把字段整理成本项目标准格式。最关键的字段是:

date, city, temp_c, humidity, pressure_hpa, wind_speed_mps, wind_dir, rainfall_mm, so2, no2, co, o3, pm10, pm25

如果没有traffic_indexindustrial_index,可以先用稳定的代理变量,也可以从特征工程配置中删除对应字段。小时级数据可以先按天聚合,例如计算日均 PM2.5、日均温度、日均风速和累计降雨量,再进入当前日级预测流程。

替换数据后,建议重新运行:

python tools/run_real_uci_demo.py

如果使用的是新的文件名,可以修改configs/config.yaml或复制tools/run_real_uci_demo.py中的路径配置。

14. 可扩展方向

第一,可以增加模型类型。对于表格数据,LightGBM、XGBoost 和 CatBoost 往往表现较强;对于严格时序建模,可以加入 LSTM、TCN 或 Transformer 类模型。

第二,可以增加时间序列交叉验证。当前代码按时间顺序划分训练集和测试集,避免未来信息泄漏;正式实验中可以进一步使用 walk-forward validation。

第三,可以接入未来气象预报。当前未来 7 天预测使用递推方式估计外生变量,如果接入天气预报 API,短期预测的业务意义会更强。

第四,可以加入地图可视化。多站点数据可以结合经纬度,用 Folium、PyDeck 或 ECharts 展示空间分布。

第五,可以扩展为后台服务。将预测结果写入数据库,再用 Flask 或 FastAPI 提供接口,就可以形成空气质量预警后台。

15. 常见问题

为什么不用 LSTM?
LSTM 对时序数据有优势,但对环境、数据量和训练调参要求更高。这个项目定位是可运行、易部署、适合课程设计和工程展示,因此先使用传统机器学习模型。

预警等级准确率为什么不高?
PM2.5 极端峰值往往与未来气象、区域传输、突发排放和节假日活动有关。当前模型只使用历史日级数据和已有气象污染物字段,因此能做趋势辅助,但不能完全预测极端污染过程。

UCI 数据能直接用于当前城市决策吗?
不能。本文使用的是历史公开数据,适合学习、实验和原型验证。实际部署需要接入当地最新监测数据、气象预报和业务规则。

为什么还保留样例数据?
样例数据用于兜底运行,避免没有真实 CSV 时项目无法启动。正式博客和截图使用的是包内 UCI 真实数据。

16. 总结

本文完成了一个基于 UCI 真实空气质量数据的城市 PM2.5 预测与预警系统。项目从真实数据整理、特征工程、模型训练、指标评估、未来预测、AQI 预警到 Streamlit 可视化都给出了完整实现。

本次真实数据运行中,系统处理了 16,966 条北京多监测站日级记录,最佳模型为 GradientBoosting,测试集 MAE 为 35.508 μg/m³,RMSE 为 54.378 μg/m³,R² 为 0.448,并输出了未来 7 天预警表、特征重要性图、模型对比图和正式 Web 页面截图。相比只展示零散代码的教程,这个版本更适合用于 CSDN 技术博客、课程设计、机器学习实验报告和二次开发。

参考资料

  1. UCI Beijing PM2.5 Data: https://archive.ics.uci.edu/dataset/381/beijing+pm2+5+data
  2. UCI PM2.5 Data of Five Chinese Cities: https://archive.ics.uci.edu/dataset/394/pm2+5+data+of+five+chinese+cities
  3. UCI Beijing Multi-Site Air Quality Data: https://archive.ics.uci.edu/dataset/501/beijing+multi+site+air+quality+data
  4. EPA AQI Breakpoints: https://aqs.epa.gov/aqsweb/documents/codetables/aqi_breakpoints.html
  5. scikit-learn RandomForestRegressor: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
  6. scikit-learn GradientBoostingRegressor: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html
  7. Streamlit Documentation: https://docs.streamlit.io/
  8. Wikimedia Commons 北京雾霾场景图:https://commons.wikimedia.org/wiki/File:Beijing_Forbidden_City_Smog.jpg
http://www.jsqmd.com/news/933506/

相关文章:

  • 一线名师闭门分享:用Sora 2 72小时内完成一学期16节AI增强型实验课视频(含物理/化学/生物全科案例包)
  • Kronos股票预测模型:基于深度学习的金融时间序列预测解决方案
  • 智能体的可解释性:用户信任的关键因素
  • 基于 RAG 的三级工单智能分类系统:从自然语言到工单分类的完整落地方案
  • 当SCP收容失效:用Unreal Engine 5构建一个基于SCP-136的心理恐怖游戏原型
  • Hermes WebUI HTML作为Python原始字符串:ADR-002决策解析
  • 开源跨平台音乐聚合解决方案:LX Music桌面版的技术创新与实践价值
  • 保姆级教程:用Adams/Car和Simulink搞定整车联合仿真(附模型文件)
  • 手把手教你给Nginx服务器开启IPv6访问(附本地测试与验证全流程)
  • FPGA跨时钟域信号处理:从亚稳态的‘山顶滚球’到实战中的同步器链设计
  • 别再只仿真了!用ILA抓取Vivado FIFO IP核的真实波形,深度解读full/empty信号时序
  • AI Agent工具链集成:API与RAG
  • 从ROS Bag到YOLOv5模型:手把手教你打造车载交通信号灯识别系统(Ubuntu 20.04环境)
  • Solana智能代理安全架构:基于闭包的密钥隔离与确定性决策引擎
  • 茅台预约自动化神器:5分钟部署的智能抢购解决方案
  • 别再死记硬背代码了!拆解C51按键控制LED的底层逻辑与寄存器操作
  • OBS StreamFX插件:从零开始打造专业级直播画面的完整指南
  • 保姆级教程:从零为你的微信小程序申请并配置getPhoneNumber权限(避坑指南)
  • VASP中 DFT+U 核心参数
  • AI Agent执行链路的可靠性工程:故障注入与混沌测试
  • 【Python 成员运算符 in 与 not in】
  • Podman代理配置全攻略:从环境变量到systemd,哪种姿势最适合你的场景?
  • 2026年口碑好的陕西钢材配送/西安钢材配送/钢材口碑好的厂家推荐 - 品牌宣传支持者
  • 3年AI提示词研究精华!掌握这4个要素,让AI秒变你的私人智囊团,效率飙升300%!
  • 猫抓扩展网络嗅探失效?深度解析浏览器请求拦截机制与性能调优
  • B站m4s视频转换完整指南:永久保存你的珍贵收藏
  • 从AI模型到AI系统:评估单元切换与工程实践指南
  • 2026年北京离婚律师推荐榜单:5位实战派解纷专家力荐,路军芳律师领衔 - 本地品牌推荐
  • 2026年口碑好的钢材配送/钢材加工优质厂家汇总推荐 - 行业平台推荐
  • 别再搞混了!一文看懂多模态和全模态的区别