和鲸社区AI实训季 空气质量预测(PM2.5)

30 阅读20分钟

1. 赛题背景

随着中国经济近 30 年来高速发展, 消耗了大量的能源,导致大气污染物排放激增,引发了社会非常关注的雾霾问题。

PM2.5 是霾的主要成分,其可导致大气能见度显著降低, 影响交通安全, 人身健康。它的来源主要是化石燃料燃烧,从平均状态来看, 城市污染程度取决于城市的能源结构、交通状况和工业排放污染物的多少, 但从实时状态而言, 与气象条件联系紧密。大尺度环流形势和局地气象条件不仅可以影响污染物的生成、积累和清除, 同时也是影响区域输送的重要外部条件。

本次比赛以 PM2.5 预测为任务,给出一段时间内某城市的相关气象观测数据及空气污染物数据,建立模型预测一段时间内的 PM2.5 指数。

2. 数据字段说明

本次比赛所用到的空气质量数据来自环境保护检测中心网站,气象数据来自美国国家气候数据中心(NCDC),由@王_晓磊汇总并分享。为了更符合算法比赛的需求,数据做了脱敏处理。

3.实现步骤详解

3.1 数据加载与预处理

读取数据并移除无关特征

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import lightgbm as lgb

train = pd.read_csv("/home/mw/input/PM257421/train.csv")
test = pd.read_csv("/home/mw/input/PM257421/test.csv")

drop_cols = ["No", "date"] 
train = train.drop(columns=drop_cols, errors='ignore')
test  = test.drop(columns=drop_cols, errors='ignore')

3.2 特征工程与数据划分

  • 准备特征矩阵和目标变量

  • 排除目标变量PM2.5和标识列id

  • 使用所有气象和污染物特征作为输入

  • 20%数据作为验证集,评估模型性能

    feature_cols = [col for col in train.columns if col not in ["PM2.5", "id"]]

    X = train[feature_cols] y = train["PM2.5"] X_test = test[feature_cols]

    X_train, X_val, y_train, y_val = train_test_split( X, y, test_size=0.2, random_state=25 )

3.3 LightGBM模型配置

设置回归任务的优化参数

params = {
    "objective": "regression",    # 回归任务
    "metric": "rmse",            # 评估指标:均方根误差
    "learning_rate": 0.01,       # 小学习率,稳定训练
    "num_leaves": 31,            # 叶子数量,控制模型复杂度
    "max_depth": 6,              # 树的最大深度
    "min_data_in_leaf": 50,      # 叶子节点最小数据量,防止过拟合
    "feature_fraction": 0.8,     # 特征采样比例
    "bagging_fraction": 0.8,     # 数据采样比例
    "bagging_freq": 5,           # 每5次迭代执行bagging
    "verbosity": -1,             # 减少日志输出
    "n_estimators": 2000         # 树的数量
}

model = lgb.LGBMRegressor(**params)

3.4 模型训练与验证

  • 使用验证集监控训练过程

  • 早停机制防止过拟合

  • RMSE作为主要评估指标

    model.fit( X_train, y_train, eval_set=[(X_val, y_val)], # 验证集用于早停 eval_metric="rmse", # 验证指标 callbacks=[lgb.early_stopping(30)] # 30轮无改善则停止 )

    val_pred = model.predict(X_val) rmse = mean_squared_error(y_val, val_pred) print("Validation RMSE:", rmse)

3.5 预测与结果输出

生成测试集预测并保存结果

test["PM2.5"] = model.predict(X_test)

submission = test[["id", "PM2.5"]]
submission.to_csv("submission_fast.csv", index=False)

print("预测完成:已保存 submission_fast.csv")