摘要:
採用爬蟲爬取了北京這個城市的空氣質量指數日曆史數據(爬取時間段爲2018年1月1日至今天的前一天2020年4月19日),採用兩年的歷史數據作爲訓練集,2020年的數據作爲測試集,最後採用2020年4月6日-4月19日的14天數據作爲歷史數據,去預測2020年4月20-27日的空氣質量指數AQI。
輸出結果已經打印出來,大家可以自行去查閱未來幾天的AQI值進行比對。如果不準求不要罵我,不能怪我,我只是合理對模型進行了輸入輸出,不參與預測。
目錄
數據描述與處理:
AQI(Air Quality Index,空氣質量指數)是報告每日空氣質量的參數。
AQI是環境空氣質量指數的縮寫,是2012年3月國家發佈的新空氣質量評價標準,污染物監測爲6項:二氧化硫、二氧化氮、PM10、PM2.5、一氧化碳和臭氧,數據每小時更新一次。AQI將這6項污染物用統一的評價標準呈現。
獲取的數據爲2018年1月1日至2020年4月19日,數據結構如圖所示:
輸入特徵維度爲:grade,PM25,PM10,SO2,CO,NO2,O3_8h;輸出標籤特徵爲:AQI;但是其中grade列爲char形式的描述,因此,對其中的四個等級進行替換爲數值特徵。然後,對所有數據進行標準化(或者說歸一化)處理,其中2018年-2019年的歷史數據作爲訓練集,2020年數據作爲測試集。(其中2018年12月3日,5月5日,5月26日,28日等數據爲無,我們刪除了)
模型構建與訓練:
開始模型訓練之前,無外乎要對LSTM模型構建時間序列的輸入,本次嘗試採用滑動窗口進行構建輸入,核心代碼如下:
def mult_data(dataset, target, start_index, end_index, history_size,target_size, step):
data = []
labels = []
start_index = start_index + history_size
if end_index is None:
end_index = len(dataset) - target_size
for i in range(start_index, end_index):
indices = range(i-history_size, i, step)
data.append(dataset[indices])
labels.append(target[i:i+target_size])
return np.array(data), np.array(labels)#返回輸入數據特徵和標籤
LSTM模型核心代碼如下:
multi_model = tf.keras.models.Sequential()
multi_model.add(tf.keras.layers.LSTM(32,return_sequences=True,input_shape=x_train_multi.shape[-2:]))
multi_model.add(tf.keras.layers.LSTM(16, activation='relu'))
multi_model.add(tf.keras.layers.Dense(output, activation='linear'))
multi_model.compile(optimizer=tf.keras.optimizers.RMSprop(clipvalue=1.0), loss='mae')
通過迭代訓練20次左右,觀察損失函數圖像如下圖所示,大約在10次左右loss在測試集上已經降低最優了。於是改動了迭代次數及增加dropout防止過擬合,經過一系列調整之後,便可測試該模型的預測能力。
模型預測結果:
按理說對預測結果值不能進行標準化(或者說歸一化處理,因爲均值和標準差只能使用訓練數據來計算,但是爲了能夠顯示輸出,在這裏不必那麼糾結於細節)。對模型的輸入爲最近14天的數據(2020年4月6日-4月19日),輸出爲未來7天的預測結果。下圖左邊爲輸入數據展示,右邊爲模型輸出展示,其中負號代表輸入歷史AQI數據值,輸出的藍色點爲未來7天的AQI值;
爲了方便大家看清,我在pycharm的輸出面板打出了預測值,大家可以查閱。因爲神經網絡輸出值不穩定,我找了幾組比較好的結果展示出來,大家可以自行根據未來7天的北京AQI情況進行對比檢驗這個已經訓練的LSTM模型的預測能力。查閱北京AQI數據的網站爲:https://www.aqistudy.cn/historydata/daydata.php?city=北京
迭代10次的輸出:
迭代15次的輸出:
結論:
通過預測出的結果發現,訓練好的神經網絡做線性預測還是很不穩定的,當然原因有很多,最明顯的就是我對預測值結果進行了反歸一化進行輸出。但是,這個程序確實實現了未來7天AQI值的預測問題。在未來幾天裏,我將根據真實值與預測值之間的誤差再次完善該方法。以求能夠預測個大概趨勢。如果大家有更好的解決思路,可以加Q525894654進行交流討論。
接下來的幾天便是等待驗證結果的幾天了。心情複雜且激動.....