Python实战:网格搜索优化随机森林回归模型预测空气质量

📅 2026/7/14 4:08:50
Python实战:网格搜索优化随机森林回归模型预测空气质量
1. 空气质量预测与机器学习基础空气质量预测是环境数据分析中的经典问题。想象一下每天早上出门前如果能提前知道当天的空气质量指数就能更好地规划是否进行户外活动。这正是机器学习可以大显身手的场景——通过分析历史气象数据和污染物浓度建立预测模型。随机森林回归模型在这个问题上表现优异因为它能自动处理复杂的非线性关系。比如温度、湿度、风速这些因素对PM2.5浓度的影响往往不是简单的线性关系。随机森林通过构建多棵决策树每棵树关注数据的不同方面最后综合所有树的预测结果就像咨询多位专家后再做决策一样可靠。我去年帮本地环保部门做过类似项目发现随机森林特别适合处理这类环境数据。当时使用的数据集包含这些关键特征气象数据温度、湿度、风速、气压降水数据降雨量、降雪量时间特征季节、月份、小时地理特征监测站位置海拔import pandas as pd # 典型空气质量数据集结构示例 data { PM2.5: [32, 45, 28, 67], # 目标变量 Temperature: [18, 22, 15, 25], Humidity: [65, 72, 58, 80], Wind_Speed: [3.2, 2.8, 4.1, 1.5] } df pd.DataFrame(data)2. 网格搜索原理与参数调优实战网格搜索(Grid Search)是调参的笨办法但效果出奇地好。它的工作原理就像试遍所有可能的密码组合——把每个参数的可能取值排列组合逐一验证哪种组合效果最好。在随机森林回归中这几个参数对模型性能影响最大n_estimators森林中树的数量建议50-500max_depth单棵树的最大深度常用3-50min_samples_split节点分裂所需最小样本数通常2-10min_samples_leaf叶节点最小样本数通常1-4max_features寻找最佳分裂时考虑的特征数常用sqrt或log2from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import GridSearchCV param_grid { n_estimators: [100, 200, 300], max_depth: [10, 20, 30, None], min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4], max_features: [sqrt, log2] } rf RandomForestRegressor(random_state42) grid_search GridSearchCV(estimatorrf, param_gridparam_grid, cv5, scoringneg_mean_squared_error, n_jobs-1, verbose2)实际项目中我发现几个调参技巧先粗调后细调先用大范围步长确定大致区间再在小范围内精细搜索参数优先级n_estimators和max_depth影响最大应优先优化时间权衡min_samples_split和min_samples_leaf对训练时间影响小可以多试几个值3. 完整项目实现与代码解析让我们从数据加载开始一步步构建完整的空气质量预测系统。假设数据存储在CSV文件中包含PM2.5浓度和各类气象指标。数据预处理阶段有几个关键点处理缺失值环境数据常有不完整记录特征缩放随机森林虽不必须但能提升某些实现的计算效率时间特征工程将时间戳转换为周期特征如小时、星期# 完整实现代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import GridSearchCV from sklearn.metrics import mean_squared_error, r2_score import matplotlib.pyplot as plt # 数据加载与预处理 df pd.read_csv(air_quality.csv) df[Date] pd.to_datetime(df[Date]) df[Hour] df[Date].dt.hour df[DayOfWeek] df[Date].dt.dayofweek # 特征与目标变量分离 X df.drop([PM2.5, Date], axis1) y df[PM2.5] # 数据集划分 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42) # 网格搜索参数设置 param_grid { n_estimators: [100, 200, 300], max_depth: [10, 20, 30, None], min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4], max_features: [sqrt, log2] } # 执行网格搜索 rf RandomForestRegressor(random_state42) grid_search GridSearchCV(rf, param_grid, cv5, scoringneg_mean_squared_error, n_jobs-1, verbose1) grid_search.fit(X_train, y_train) # 输出最佳参数 print(f最佳参数组合: {grid_search.best_params_}) best_rf grid_search.best_estimator_4. 模型评估与特征重要性分析得到最佳模型后我们需要全面评估其性能。除了常用的MSE和R²我还建议关注预测值与实际值的散点图残差分布图不同时间段的预测效果对比特征重要性分析能告诉我们哪些因素对空气质量影响最大# 模型评估 predictions best_rf.predict(X_test) mse mean_squared_error(y_test, predictions) r2 r2_score(y_test, predictions) print(f测试集MSE: {mse:.2f}) print(f测试集R²: {r2:.2f}) # 特征重要性可视化 feature_importances pd.Series( best_rf.feature_importances_, indexX.columns ).sort_values(ascendingFalse) plt.figure(figsize(10,6)) feature_importances.plot(kindbarh) plt.title(特征重要性排序) plt.xlabel(重要性得分) plt.ylabel(特征名称) plt.tight_layout() plt.show()在实际空气质量预测项目中我发现这些特征通常最重要气象条件湿度、温度、风速时间特征一天中的时段、季节空间特征监测点位置历史污染水平前几小时的PM2.5值记得保存训练好的模型方便后续部署使用import joblib # 保存模型 joblib.dump(best_rf, air_quality_predictor.pkl) # 加载模型 loaded_model joblib.load(air_quality_predictor.pkl)在项目收尾阶段建议进行敏感性分析——人为改变某些输入特征观察预测结果的变化幅度。这能帮助我们理解模型的决策逻辑确保它没有学习到虚假相关性。