徐萬鏞,包理群,吳守霞
(蘭州工業(yè)學(xué)院 電子信息工程學(xué)院,甘肅 蘭州 730050)
空氣質(zhì)量(Air Quality)是反映空氣污染程度的重要指標(biāo),它影響著人類的身體健康和生活質(zhì)量,全面、及時地了解空氣污染的變化規(guī)律對科學(xué)防治污染有著重要的現(xiàn)實意義,也出現(xiàn)了很多關(guān)于空氣質(zhì)量監(jiān)測的研究但獲取到的都是實時監(jiān)測數(shù)據(jù)[1-2].通過對空氣質(zhì)量的提前預(yù)測可以使相關(guān)部門及普通居民提前做好應(yīng)對不同空氣狀況的準(zhǔn)備.
不同地區(qū)的主要污染物濃度不同,工業(yè)發(fā)達(dá)地區(qū)主要污染物來源于工業(yè)廢氣排放,所以SO2等污染物濃度較高;而部分發(fā)達(dá)地區(qū)人口密度大,受人類活動影響PM2.5濃度相對較高;西北地區(qū)空氣受地理位置影響,風(fēng)沙大導(dǎo)致PM10濃度相對高于其他城市.現(xiàn)有研究多以中部地區(qū)數(shù)據(jù)為主,面對西部研究相對較少[3].故此,本文以蘭州市空氣質(zhì)量數(shù)據(jù)為例,選擇并搭建LSTM神經(jīng)網(wǎng)絡(luò)模型,研究該神經(jīng)網(wǎng)絡(luò)模型在蘭州市空氣質(zhì)量指數(shù)預(yù)測中的應(yīng)用,實現(xiàn)對未來12 h內(nèi)空氣質(zhì)量指數(shù)的預(yù)測,在探究AQI濃度值預(yù)測的同時對其他污染物的預(yù)測有著啟發(fā)性意義,可為相關(guān)部門在開展空氣質(zhì)量預(yù)報預(yù)警工作時提供數(shù)據(jù)參考.
本文選取的訓(xùn)練集是2014—2021年內(nèi)每個小時的所有空氣質(zhì)量指數(shù)數(shù)據(jù)序列.間隔如此長的歷史信息若使用RNN循環(huán)神經(jīng)網(wǎng)絡(luò),會導(dǎo)致后期數(shù)據(jù)受到前期數(shù)據(jù)影響,權(quán)值大幅下降導(dǎo)致學(xué)習(xí)效果不理想.同時時間序列過長可能會導(dǎo)致在連續(xù)乘法運算的過程中出現(xiàn)過大或者過于小的值,造成梯度爆炸或梯度消失問題[4].LSTM通過在RNN模型的基礎(chǔ)上增加細(xì)胞控制機制來對傳統(tǒng)RNN模型進(jìn)行改進(jìn),可以保持對較為久遠(yuǎn)的歷史信息的“記憶”.由此解決RNN處理序列過長信息時導(dǎo)致的梯度爆炸問題[5].
LSTM網(wǎng)絡(luò)的基本結(jié)構(gòu)展開如圖1所示,不同于RNN循環(huán)網(wǎng)絡(luò),LSTM加入了遺忘門機制.LSTM中不僅使用了單一網(wǎng)絡(luò)層,而是將4個網(wǎng)絡(luò)層通過特殊方式進(jìn)行組合.
LSTM的關(guān)鍵是細(xì)胞狀態(tài).細(xì)胞在鏈上的運行中只對其進(jìn)行一些微小的線性操作,所以信息可以基本保存不變地穿過.LSTM通過門(Gate)的結(jié)構(gòu)來對細(xì)胞狀態(tài)進(jìn)行刪除或添加信息的操作.門由1個Sigmoid神經(jīng)網(wǎng)絡(luò)層和1個點乘法運算組成,這樣的結(jié)構(gòu)可以讓數(shù)據(jù)有選擇性地傳遞下去.
圖1 LSTM網(wǎng)絡(luò)結(jié)構(gòu)
試驗所用空氣質(zhì)量數(shù)據(jù)較大,傳統(tǒng)方法不便進(jìn)行處理.本文利用Pandas函數(shù)將數(shù)據(jù)進(jìn)行篩選提取,處理完成的數(shù)據(jù)置換為CSV文件格式.首先使用均值填充方法將數(shù)據(jù)整合收集過程中出現(xiàn)的空缺值進(jìn)行填補,然后采用歸一化處理使所有數(shù)值都轉(zhuǎn)化到區(qū)間[0,1]內(nèi)的數(shù)值,從而去除數(shù)據(jù)的單位限制,轉(zhuǎn)變?yōu)闊o量綱的純數(shù)值形式.最后將處理結(jié)果集按8∶2的比例劃分為訓(xùn)練集和測試集.
Keras為用戶提供了2種不同的模型:序貫?zāi)P?Sequential)和函數(shù)式模型(Model)[6].函數(shù)式模型的使用較為廣泛,但編譯速度慢,層級間的關(guān)系也較為復(fù)雜.本文中,預(yù)測的輸出值單一,所以采用編譯速度更快、操作更簡單的序貫?zāi)P?
本文選擇4層LSTM加2層Dense層的組合構(gòu)建訓(xùn)練模型,網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示.首先對第1層LSTM參數(shù)進(jìn)行設(shè)置,將輸出維度設(shè)置為32,即該層網(wǎng)絡(luò)結(jié)構(gòu)的神經(jīng)元數(shù)量為32.由于需要在第1層下方接入第2層LSTM結(jié)構(gòu),所以需要返回序列,故設(shè)置參數(shù)return_sequences=True,輸入shape設(shè)置為input_shape=(input_windows, 7).以此來確定輸入的形狀為行數(shù)等于設(shè)定好的步長,列數(shù)是7的矩陣.接著對第2層LSTM進(jìn)行設(shè)置,將輸出維度設(shè)置為64,由于需要接入第3層LSTM結(jié)構(gòu),仍設(shè)置參數(shù)return_sequences=True,第3層LSTM同理于第2層,只是需要將輸出維度再次放大.到第4層LSTM時,該層網(wǎng)絡(luò)結(jié)構(gòu)的神經(jīng)元數(shù)量已經(jīng)達(dá)到了256個,同時,由于其下方接入全連接層,所以不需要再返回序列,設(shè)置參數(shù)return_sequences=False.
圖2 預(yù)測模型網(wǎng)絡(luò)結(jié)構(gòu)
在LSTM層中進(jìn)行多輪運算后,已經(jīng)將特征基本提取出來,但這時的特征之間沒有關(guān)聯(lián).所以需要加入Dense層將之前提取到的特征經(jīng)過非線性變化關(guān)聯(lián)起來,最后映射在輸出空間上.為了能使其更快收斂,這里選擇加入2層Dense層.
第1層Dense層輸出的數(shù)組的尺寸為 (*, 64),之后引入非線性函數(shù)作為激活函數(shù),在第1層選用tanh函.第2層Dense層是神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的最后1層,這里需要輸出維度和之前選擇的輸出步長匹配,所以輸出數(shù)值尺寸為(*,output_windows),引入最簡單的linear函數(shù)作為激活函數(shù).
計算參數(shù)設(shè)置完成后,就可以進(jìn)行模型的訓(xùn)練階段.對model.fit()函數(shù)進(jìn)行參數(shù)的設(shè)置,步驟如下:
步驟1:模型輸入數(shù)據(jù),直接將輸入數(shù)據(jù)選擇為x_train集合.同樣,數(shù)據(jù)標(biāo)簽也在之前做好相應(yīng)的處理工作,可以直接選用y_train集合.
步驟2:指定驗證集,直接設(shè)置驗證集的輸入數(shù)據(jù)與標(biāo)簽數(shù)據(jù)與處理中分類好的x_test, y_test.
步驟3:設(shè)置迭代次數(shù),將迭代次數(shù)epochs選定為50次,參考實際工程中最常用的batch_size,將batch_size設(shè)置成16.
步驟4:因為訓(xùn)練集合數(shù)據(jù)多,訓(xùn)練時間長的原因,本次模型訓(xùn)練不采用默認(rèn)顯示方式,選擇每迭代1次顯示1次日志的方式.
步驟5:配置回調(diào)函數(shù),在本次訓(xùn)練中選定了其中3個回調(diào)函數(shù).
CSVLogger:將每次迭代完成的訓(xùn)練結(jié)果數(shù)據(jù)存入csv文件.
ModelCheckpoint:每經(jīng)歷1次迭代后,就根據(jù)參數(shù)指定保存1個效果最佳的模型。save_best_only設(shè)為True,即之前的模型不再保留,最佳的模型直接將其覆蓋,然后verbose設(shè)置為1,使其顯示詳細(xì)信息.
ReduceLROnPlateau:經(jīng)過一定次數(shù)的迭代之后,learning_rate(學(xué)習(xí)速率)不再下降,模型效果不再提升,自動動態(tài)調(diào)整學(xué)習(xí)率的變化.
完成上述所有步驟后,運行訓(xùn)練程序,待模型訓(xùn)練完成,就獲得了存入model.h5文件內(nèi)的最佳模型;同時,每次迭代完成后的統(tǒng)計信息也被存入train.log文件內(nèi).
均方誤差是誤差平方平均數(shù),能夠避免誤差相加正負(fù)抵消后的問題,本文選用均方誤差評價預(yù)測效果[7],有
(1)
損失隨迭代次數(shù)(epoch)的變化曲線如圖3所示,分別為訓(xùn)練集和測試集上的測試結(jié)果.由圖3可以看到:訓(xùn)練集的均方誤差在不斷下降,從0.007降至0.001,說明通過不斷深入學(xué)習(xí),模型優(yōu)化的效果越來越好;同時,測試集均方誤差長期處于0.001 3左右并趨于穩(wěn)定,反映出該預(yù)測模型表現(xiàn)良好.
圖3 均方誤差變化曲線
同理于MSE,為防止正負(fù)誤差相抵消且能更好地反映預(yù)測值誤差的實際情況.試驗增加了另一種度量方式——平均絕對誤差(Mean Absolute Error,MAE)[8],即
(2)
從日志文件'train.log'讀出數(shù)據(jù)后使用Matplotlib繪圖工具將損失函數(shù)隨迭代次數(shù)變化的過程繪制曲線,如圖4所示.
圖4 平均絕對誤差變化曲線
該平均絕對誤差函數(shù)隨著學(xué)習(xí)次數(shù)不斷下降,同樣反映出了該預(yù)測模型具有較優(yōu)的性能,能夠達(dá)到所需的精準(zhǔn)度.
為了更加直觀地觀察模型的預(yù)測值與實際值的擬合程度,以輸出步長為12,即需要繪制12條擬合曲線,分別對12 h的擬合度進(jìn)行查看,如圖5所示,由于數(shù)據(jù)量大,線條密集且重合度較高的原因,此處展示圖較為模糊,在12 065條測試數(shù)據(jù)中,藍(lán)色線條與橙色線條基本吻合,說明預(yù)測值與實際值擬合程度足夠高,取得了較好的預(yù)測效果.
圖5 預(yù)測值擬合曲線
本文采用4層LSTM結(jié)構(gòu)加雙層全連接層,為了驗證其預(yù)測效果,將其與傳統(tǒng)3層模型(見圖6)進(jìn)行對比.試驗利用本研究中的模型與傳統(tǒng)3層模型,分別對2019年的空氣質(zhì)量數(shù)據(jù)進(jìn)行預(yù)測,并計算MSE及MAE進(jìn)行效果比對.
圖6 3層LSTM模型結(jié)構(gòu)
為確保不受其他因素影響,3層模型不改變其他訓(xùn)練參數(shù),僅對LSTM層數(shù)及神經(jīng)元數(shù)量進(jìn)行調(diào)整,對比結(jié)果如表1所示.
表1 預(yù)測誤差指標(biāo)
從2種模型的MSE、MAE的對比可以看出:4層LSTM神經(jīng)網(wǎng)絡(luò)模型的預(yù)測精度明顯高于傳統(tǒng)3層結(jié)構(gòu).為直觀看出數(shù)據(jù)差異,做出第一小時的擬合曲線,如圖7所示.
圖7 網(wǎng)絡(luò)擬合曲線對比
圖7中:實線為真實值;pred1為本文設(shè)計的4層LSTM網(wǎng)絡(luò)的預(yù)測結(jié)果;pred2為3層LSTM網(wǎng)絡(luò)的預(yù)測結(jié)果.可以看出:橙色曲線擬合程度遠(yuǎn)高于綠色曲線,4層LSTM神經(jīng)網(wǎng)絡(luò)模型的預(yù)測效果優(yōu)于傳統(tǒng)3層LSTM神經(jīng)網(wǎng)絡(luò)模型.驗證了本文采用的模型在空氣質(zhì)量預(yù)測方面具有較好的效果.
本文研究LSTM神經(jīng)網(wǎng)絡(luò)在空氣質(zhì)量預(yù)測領(lǐng)域的應(yīng)用.以蘭州市空氣質(zhì)量指數(shù)及PM10、CO、NO2、SO2、O3等主要空氣污染物濃度數(shù)據(jù)為例,使用LSTM遞歸神經(jīng)網(wǎng)絡(luò)構(gòu)建出預(yù)測模型,采用4層LSTM加2層Dense層的網(wǎng)絡(luò)結(jié)構(gòu),選用48 h的輸入步長,實現(xiàn)對未來12 h內(nèi)空氣質(zhì)量指數(shù)的預(yù)測,并與傳統(tǒng)3層模型進(jìn)行了對比,驗證了本文設(shè)計的4層LSTM模型具有較好的預(yù)測效果.