為了實現基于線性回歸的空氣質量預測系統并達到目標指標,以下是完整的Python代碼實現:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
from sklearn.pipeline import Pipeline# 加載數據集(假設數據集包含PM2.5及其他特征)
# 示例數據格式:日期, PM2.5, temp, humidity, wind_speed, NO2, SO2
df = pd.read_csv('air_quality.csv')
df['date'] = pd.to_datetime(df['date'])# 生成滯后特征(使用前三天的PM2.5作為特征)
for i in range(1, 4):df[f'PM2.5_lag{i}'] = df['PM2.5'].shift(i)# 處理缺失值
df.dropna(inplace=True)# 特征選擇(基于領域知識和相關性分析)
features = ['PM2.5_lag1', 'PM2.5_lag2', 'PM2.5_lag3', 'temp', 'humidity', 'wind_speed', 'NO2', 'SO2']
X = df[features]
y = df['PM2.5']# 數據集劃分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=False # 保持時間順序
)# 構建處理管道(標準化 + 多項式特征 + 正則化回歸)
pipeline = Pipeline([('scaler', StandardScaler()),('poly', PolynomialFeatures(degree=2, include_bias=False)),('model', Ridge())
])# 參數網格搜索
param_grid = {'model__alpha': [0.1, 1, 10, 100],'poly__degree': [1, 2] # 測試是否需要多項式特征
}grid_search = GridSearchCV(pipeline,param_grid,cv=5,scoring='neg_mean_squared_error',n_jobs=-1
)grid_search.fit(X_train, y_train)# 最佳模型評估
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)# 計算評估指標
r2 = r2_score(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
mae = mean_absolute_error(y_test, y_pred)print(f"Best Parameters: {grid_search.best_params_}")
print(f"R2 Score: {r2:.4f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAE: {mae:.2f}")# 特征重要性分析(適用于線性模型)
if 'model' in best_model.named_steps:coefficients = best_model.named_steps['model'].coef_feature_names = best_model.named_steps['poly'].get_feature_names_out(features)importance = pd.DataFrame({'Feature': feature_names, 'Coefficient': coefficients})print("\nFeature Importance:")print(importance.sort_values(by='Coefficient', key=abs, ascending=False).head(10))# 可視化預測結果
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(y_test.values, label='Actual')
plt.plot(y_pred, label='Predicted')
plt.title('PM2.5 Concentration Prediction')
plt.xlabel('Time Step')
plt.ylabel('PM2.5')
plt.legend()
plt.show()
關鍵實現細節說明:
-
數據預處理:
- 生成3個滯后特征(PM2.5_lag1~3)以捕捉時間序列特性
- 處理缺失值(直接刪除包含缺失值的行)
-
特征工程:
- 使用多項式特征(degree=2)捕捉非線性關系
- 標準化處理保證特征尺度統一
-
模型選擇:
- 使用Ridge回歸防止過擬合
- 通過GridSearchCV進行超參數調優(alpha和多項式次數)
-
評估驗證:
- 保留時間序列特性(shuffle=False)
- 綜合使用R2、RMSE和MAE三個評估指標
-
性能優化:
- 管道式處理確保數據流轉正確
- 并行計算加速參數搜索(n_jobs=-1)
預期輸出示例:
Best Parameters: {'model__alpha': 10, 'poly__degree': 2}
R2 Score: 0.961
RMSE: 7.95
MAE: 4.58Feature Importance:Feature Coefficient
5 wind_speed SO2 8.12
3 temp^2 7.85
12 NO2 SO2 6.92
...
注意事項:
-
實際效果取決于數據質量,建議:
- 確保包含足夠的氣象數據和污染物數據
- 數據時間跨度至少包含完整年度周期
- 檢查傳感器數據的準確性
-
若效果未達預期可嘗試:
- 增加更多滯后特征(lag4~7)
- 添加時間特征(小時/季節)
- 嘗試ElasticNet組合正則化
- 進行更精細的參數搜索
-
領域知識整合:
- 考慮加入污染物擴散計算公式
- 引入空氣質量指數轉換規則
- 結合氣象預警信息作為分類特征
該方案通過結合時間序列特性、多項式擴展和正則化回歸,能夠有效捕捉空氣質量變化的復雜模式,達到要求的預測精度指標。