採用LSTM預測北京未來7天的空氣質量指數AQI(大家可以查閱未來真實結果進行比對)

摘要:

      採用爬蟲爬取了北京這個城市的空氣質量指數日曆史數據(爬取時間段爲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進行交流討論。

       接下來的幾天便是等待驗證結果的幾天了。心情複雜且激動.....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章