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")