轉載於:https://zhuanlan.zhihu.com/p/83220850,作者:鄭援鏡燁
相關鏈接:https://www.cnblogs.com/downmoon/p/12448602.html
空氣質量指數(AQI)是衡量空氣質量好壞的重要指數,它是依據空氣中污染物濃度的高低來判斷的。
但是因爲空氣污染本身是一個較爲複雜的現象,來自固定和流動污染源的人爲污染物排放大小是影響空氣質量的最主要因素之一。
其中包括車輛、船舶、飛機的尾氣、工業企業生產排放、居民生活和取暖、垃圾焚燒等。城市的發展密度、地形地貌和氣象等也是影響空氣質量的重要因素。
·研究目標:蒐集相關數據,運用機器學習對空氣質量等級分類及預測;
·選取指標:PM2.5;PM10;SO2;CO;NO2; O3_8h;AQI;質量等級;
·數據及其來源:
·研究方法及思路:運用隨機森林,分別對指標AQI和質量等級進行預測,調用Python的sklearn包。
Step 1:準備工作
導入所需的包,運行環境:Python3.7,Anaconda4.2.0
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
import matplotlib
from sklearn.model_selection import train_test_split
Step2:數據基本統計分析
首先,看一下數據分佈情況。
data=pd.read_csv('./air_train&test.csv',index_col=0,encoding='gb2312')
print (data.head())
print (data.shape)
index=data.index
col=data.columns
class_names=np.unique(data.ix[:,-1])
#print (type(data))
print (class_names)
#print (data.describe())
#劃分訓練集和驗證集
data_train, data_test= train_test_split(data,test_size=0.1, random_state=0)
print ("訓練集統計描述:\n",data_train.describe().round(2))
print ("驗證集統計描述:\n",data_test.describe().round(2))
print ("訓練集信息:\n",data_train.ix[:,-1].value_counts())
print ("驗證集信息:\n",data_test.ix[:,-1].value_counts())
Step3:構建隨機森林迴歸模型預測AQI¶
獲取訓練集和驗證集。
import sys
X_train=data_train.iloc[:,0:-2]
X_test=data_test.iloc[:,0:-2]
feature=data_train.iloc[:,0:-2].columns
print (feature)
y_train=data_train.iloc[:,-2]
y_test=data_test.iloc[:,-2]
查看各變量間的相關係數
import sys
X_train=data_train.iloc[:,0:-2]
X_test=data_test.iloc[:,0:-2]
feature=data_train.iloc[:,0:-2].columns
print (feature)
y_train=data_train.iloc[:,-2]
y_test=data_test.iloc[:,-2]
Index(['PM2.5', 'PM10', 'SO2', 'CO', 'NO2', 'O3_8h'], dtype='object')
import seaborn as sns
sns.set(style="ticks", color_codes=True);
# 創建自定義顏色調色板
palette = sns.xkcd_palette(['dark blue', 'dark green', 'gold', 'orange'])
# 畫散點圖矩陣
sns.pairplot(data.drop([u'質量等級'],axis = 1), diag_kind = 'kde', plot_kws=dict(alpha = 0.7))
plt.show()
根據相關係數表和散點圖矩陣,PM2.5和PM10與AQI的線性相關性最大,相關係數超過了0.8,其次是CO和NO2,相關係數超過了0.7。但是,PM2.5與PM10、CO的相關係數超過了0.8,CO與NO2的相關係數也超過了0.8,即各因素間存在多重共線性,不滿足相互獨立的條件,不能直接進行線性迴歸,因此選用隨機森林預測AQI。
Step 4:模型調參
'''模型調參'''
##參數選擇
from sklearn.model_selection import RandomizedSearchCV
criterion=['mse','mae']
n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]
max_features = ['auto', 'sqrt']
max_depth = [int(x) for x in np.linspace(10, 100, num = 10)]
max_depth.append(None)
min_samples_split = [2, 5, 10]
min_samples_leaf = [1, 2, 4]
bootstrap = [True, False]
random_grid = {'criterion':criterion,
'n_estimators': n_estimators,
'max_features': max_features,
'max_depth': max_depth,
'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf,
'bootstrap': bootstrap}
#構建模型
clf= RandomForestRegressor()
clf_random = RandomizedSearchCV(estimator=clf, param_distributions=random_grid,
n_iter = 10,
cv = 3, verbose=2, random_state=42, n_jobs=1)
#迴歸
clf_random.fit(X_train, y_train)
print (clf_random.best_params_)
Step 5:模型訓練、驗證及評估
from pyecharts import Bar
rf=RandomForestRegressor(criterion='mse',bootstrap=False,max_features='sqrt', max_depth=20,min_samples_split=10, n_estimators=1200,min_samples_leaf=2)
rf.fit(X_train, y_train)
y_train_pred=rf.predict(X_train)
y_test_pred=rf.predict(X_test)
#指標重要性
print (rf.feature_importances_)
bar=Bar()
bar.add('指標重要性',feature, rf.feature_importances_.round(2),is_label_show=True,label_text_color='#000')
bar.render('指標重要性.html')
from sklearn.metrics import mean_squared_error,explained_variance_score,mean_absolute_error,r2_score
print ("決策樹模型評估--訓練集:")
print ('訓練r^2:',rf.score(X_train,y_train))
print ('均方差',mean_squared_error(y_train,y_train_pred))
print ('絕對差',mean_absolute_error(y_train,y_train_pred))
print ('解釋度',explained_variance_score(y_train,y_train_pred))
print ("決策樹模型評估--驗證集:")
print ('驗證r^2:',rf.score(X_test,y_test))
print ('均方差',mean_squared_error(y_test,y_test_pred))
print ('絕對差',mean_absolute_error(y_test,y_test_pred))
print ('解釋度',explained_variance_score(y_test,y_test_pred))
通過隨機森林迴歸得到,PM2.5和PM10仍舊是對AQI影響最大的前兩個指標,其次是NO2、O3_8h、CO,基本與相關係數分析結果一致。
通過模型評估表得,所構建的隨機森林預測AQI模型,訓練集和驗證集上擬合優度R^2分別爲0.9965、0.9858,模型效果不錯,可以用該模型對AQI進行預測。
Step6:預測
用構建的模型預測2016年中國環保重點城市AQI。
'''預測'''
data_pred=pd.read_csv('./air.csv',index_col=0,encoding='gb2312')
index=data_pred.index
y_pred=rf.predict(data_pred.values)
#將預測結果保存到文件中
result_reg=pd.DataFrame(index)
result_reg['AQI']=y_pred
result_reg.to_csv('./result_reg_city.txt',encoding='gb2312')
print (result_reg)
Step 7:可視化預測結果
#可視化預測結果
from pyecharts import Geo
import pandas as pd
df=pd.read_csv('./result_reg_city.txt',index_col=0,encoding='gb2312')
print (df.head())
geo = Geo(
"全國主要城市空氣質量",
"",
title_color="#fff",
title_pos="center",
width=1200,
height=600,
background_color="#404a59",
)
geo.add(
"",
df.iloc[:,0],
df.iloc[:,1],
visual_range=[0, 300],
visual_text_color="#111",
symbol_size=15,
is_visualmap=True,
is_piecewise=True,
#visual_split_number=6
pieces=[{"max": 50, "min": 0, "label": "優:0-50"},
{"max": 100, "min": 50, "label": "良:51-100"},
{"max": 150, "min": 100, "label": "輕度污染:101-150"},
{"max": 200, "min": 150, "label": "中度污染:151-200"},
{"max": 300, "min": 200, "label": "重度污染:201-300"},
{"max": 1000, "min": 300, "label": "嚴重污染:>300"},
]
)
geo.render('全國重點城市AQI預測結果的可視化.html')
Github地址如下:
求Star求Fork!
https://github.com/StephenZheng0315/PM2.5-Prediction-Based-on-Random-Forest-Algorithmgithub.com