孟田華,盧玉和,丁少軍,高清蘭,黃榮
(1.山西大同大學(xué)物理與電子科學(xué)學(xué)院,大同037009;2.大同市氣象局,大同037010)
天氣溫度對(duì)人們的生存生活有著重要的影響,特別是一天中的最高溫度和最低溫度。但由于影響短期溫度變化的機(jī)制和要素非常復(fù)雜,采用傳統(tǒng)常用的天氣預(yù)測(cè)方法,如天文學(xué)相關(guān)高空氣象圖解析天氣法的成本較高[1],而利用天氣預(yù)測(cè)儀THE-860 可預(yù)測(cè)范圍又很有限,不便于推廣[2,3]。作為機(jī)器學(xué)習(xí)的一個(gè)重要分支,支持向量機(jī)(SVM)在小樣本分類、回歸等方面體現(xiàn)出獨(dú)特的優(yōu)勢(shì),因其無需大量樣本和經(jīng)驗(yàn)假設(shè),在實(shí)現(xiàn)經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化和結(jié)構(gòu)風(fēng)險(xiǎn)最小化的同時(shí)亦可避免過擬合現(xiàn)象。目前,該智能機(jī)器學(xué)習(xí)方法已在很多領(lǐng)域得到成功的應(yīng)用[4-10]。此外,歷年天氣溫度的數(shù)據(jù)容易在網(wǎng)上獲取,故基于機(jī)器學(xué)習(xí)方法的預(yù)測(cè)便顯得更加經(jīng)濟(jì)實(shí)用。
本文以山西省大同市為例,利用SVM 基于Python爬取網(wǎng)頁所獲得的大量天氣溫度數(shù)據(jù),建立了可預(yù)測(cè)未來一天天氣的最高溫和最低溫SVM 回歸模型[11-17]。利用此預(yù)測(cè)模型可根據(jù)歷史天氣溫度的數(shù)據(jù)有效預(yù)測(cè)當(dāng)?shù)氐臏囟惹闆r,具有一定的推廣意義。此外SVM 的準(zhǔn)確率高且泛化能力強(qiáng),具有良好的預(yù)報(bào)能力。
樣本數(shù)據(jù)獲取采用Python 爬蟲技術(shù),即利用Py?thon 抓取網(wǎng)頁天氣數(shù)據(jù),其原理是模擬網(wǎng)頁瀏覽器,通過調(diào)用Python 的requests 庫和re 模塊,加載需要爬取的網(wǎng)頁信息,用正則表達(dá)式從網(wǎng)頁信息中提取出我們需要的天氣數(shù)據(jù),并將其保存下來并進(jìn)行后期的數(shù)據(jù)分析和整理。具體方法如下:
(1)目標(biāo)站點(diǎn)的分析
我們所獲取天氣數(shù)據(jù)的目標(biāo)站點(diǎn)是:http://www.qixiangtai.org/2011datongxian4yuetianqi/,其目標(biāo)站點(diǎn)的URL 和網(wǎng)頁源碼(HTML)如圖1 所示。
圖1 網(wǎng)頁的URL和HTML
通過對(duì)網(wǎng)頁上的URL 分析可知,http://www.qixi?angtai.org 為歷史天氣網(wǎng)的主站點(diǎn),2011datongxian4yue?tianqi 則表示該頁面是大同2011 年4 月的天氣數(shù)據(jù),因此只要通過改變URL 里的參數(shù)即可得出近8 年96個(gè)月任何一天的天氣溫度數(shù)據(jù)。由HTML 可知,需要爬取的數(shù)據(jù)日期,最高氣溫和最低氣溫分別由()標(biāo)簽包圍,其上的父節(jié)點(diǎn)的標(biāo)簽()包含了需要爬取的一天中所有信息,其中我們所需要的日期是一個(gè)“title”,溫度可以直接用正則表達(dá)式提取。
(2)溫度數(shù)據(jù)的爬取
調(diào)用request 庫,采用get 方式獲取URL,如果請(qǐng)求狀態(tài)的狀態(tài)碼為200,即請(qǐng)求正常,則將從服務(wù)器獲取網(wǎng)頁源代碼,否則返回?zé)o,并將其定義為函數(shù),代碼為:
采用正則表達(dá)式的方式對(duì)網(wǎng)頁信息進(jìn)行提取,將抓取到的一個(gè)HTML 當(dāng)作一個(gè)字符串,先采用.*?的非貪婪方式匹配此字符串并調(diào)用re 模塊中的compile()函數(shù)返回一天的天氣溫度,得到一次匹配結(jié)果后,再用re 模塊里的re.findall()函數(shù)對(duì)HTML 里所有符合上述匹配模式的字符進(jìn)行匹配,得到整個(gè)月的所有最高溫度和最低溫度匹配結(jié)果,考慮到每天的最高溫度和最低溫度要分別抓取,這里采用字典遍歷匹配結(jié)果,用yelid()生成器提取出字符串里的日期+最高溫度或者日期+最低溫度。其中item[1]表示爬取最高氣溫,item[2]表示爬取最低氣溫,將上述解析HTML 過程定義為一個(gè)函數(shù):
用一個(gè)for 循環(huán)將URL 里的每個(gè)月用一個(gè)字符串寫入便可得到一年的數(shù)據(jù),考慮到網(wǎng)站服務(wù)器,用time.sleep(1)將時(shí)間延遲一秒。代碼如下:
所爬取溫度數(shù)據(jù)的部分結(jié)果見圖2,其中顯示了2011 年4 月最低氣溫的部分?jǐn)?shù)據(jù)。
圖2 爬取數(shù)據(jù)的部分結(jié)果
我們將前面所獲取的大同市市區(qū)近8 年每日天氣的最高溫度和最低溫度數(shù)據(jù)導(dǎo)入到Excel 文本里,然后對(duì)其格式進(jìn)行調(diào)整以滿足SVM 建模所要求的形式,并將修改后的數(shù)據(jù)以txt 文本的形式導(dǎo)出,部分?jǐn)?shù)據(jù)集如表1 和表2 所示。
表1 最高溫樣本集(℃)
表2 最低溫樣本集(℃)
利用上述訓(xùn)練樣本建立SVM 大同市溫度預(yù)測(cè)回歸模型,其中當(dāng)前溫度為目標(biāo)值,前10 天的溫度為特征值,這是10 元線性回歸問題,即一個(gè)樣本有10 個(gè)特征的線性回歸問題:
其中ω是待求值,x 為特征值,y 為目標(biāo)值?;貧w模型的建立就是為了找到參數(shù)向量ω,這樣就可以得到一個(gè)映射關(guān)系,通過這個(gè)映射關(guān)系得出決策函數(shù),進(jìn)而利用決策函數(shù)實(shí)現(xiàn)輸入向量x 得出目標(biāo)值y。
為了避免各個(gè)因子之間的量級(jí)差異,對(duì)全部數(shù)據(jù)集進(jìn)行歸一化(SVM-Scale)處理,使得特征值落在[-1,1]的范圍之間。
常用數(shù)據(jù)樣本集的處理方法有交叉驗(yàn)證法,留出法和自助法。針對(duì)我們所研究對(duì)象的特征,選用k 折交叉驗(yàn)證法,選取k=10,即十折交叉驗(yàn)證,分別將最高溫度的200 組數(shù)據(jù)和最低溫度的180 組數(shù)據(jù)隨機(jī)分成均勻的10 份,將其中9 份作為訓(xùn)練樣本,剩余1 份作為驗(yàn)證樣本。
SVM 最初是由感知機(jī)發(fā)展而來的,感知機(jī)是處理分類問題的,回歸是分類的推廣,這里是對(duì)天氣溫度的預(yù)測(cè),屬于回歸問題,所以,選擇ε-支持向量回歸機(jī)(ε-SVR)作為訓(xùn)練算法。
而常見核函數(shù)如下:
高斯核RBF(也稱徑向基核):可以處理偏非線性問題
線性核linear:只能處理線性問題
Sigmoid(雙曲正切)核:可以處理非線性問題
K(x,xi)=tanh(βx*xi+θ),
其中:
在DOS 窗口下調(diào)用Python2.7、svm-train、pnuplot對(duì)訓(xùn)練樣本進(jìn)行訓(xùn)練,分別得到尋優(yōu)參數(shù)c,g,p 的值,其中c 表示ε-SVR 中懲罰系數(shù)ε,g 表示RBF 核函數(shù)中γ值,p 表示SVR 中的損失函數(shù)中的ε,接著根據(jù)c,g,p的值進(jìn)行訓(xùn)練(svm-train)即可得到一個(gè)模型(model)文件,用此SVM 模型對(duì)測(cè)試樣本進(jìn)行預(yù)測(cè)(svm-pre?dict)得出預(yù)測(cè)結(jié)果。
對(duì)最高溫度分別用徑向基(RBF)核函數(shù),線性(lin?ear)核函數(shù),sigmoid 核函數(shù)訓(xùn)練,其預(yù)測(cè)結(jié)果的均方差如表3 所示。
表3 最高溫樣本集(℃)
通過比較三種核函數(shù)對(duì)本問題的預(yù)測(cè)結(jié)果可知,選擇RBF 核函數(shù)的均方差最小,可靠性最高,所以本研究選取RBF 作為核函數(shù)。我們利用訓(xùn)練樣本所建立的溫度預(yù)測(cè)模型參數(shù)分別為:預(yù)測(cè)最高氣溫對(duì)應(yīng)模型參數(shù)是=84.8,=0.327441406,=1.65;最低氣溫對(duì)應(yīng)模型參數(shù)是=627.2,gˉ=0.005859375,=0.74453125。這里的,,是10 個(gè)訓(xùn)練樣本尋優(yōu)參數(shù)平均值。
我們隨機(jī)選取2019 年的部分溫度數(shù)據(jù)作為測(cè)試集,對(duì)上述由模型參數(shù)所建立好的SVM 最高氣溫預(yù)測(cè)模型和SVM 最低氣溫預(yù)測(cè)模型進(jìn)行驗(yàn)證,對(duì)應(yīng)的預(yù)測(cè)結(jié)果如表4 和表5 所示。
表4 最高溫樣本集(℃)
表5 最低溫樣本集(℃)
通過比較真實(shí)值和預(yù)測(cè)值,我們可得出最高溫和最低溫預(yù)測(cè)的整體均方差分別為2.43 和2.66。其中,大多數(shù)預(yù)測(cè)值的絕對(duì)誤差在0℃附近,部分?jǐn)?shù)據(jù)預(yù)測(cè)結(jié)果雖有偏差,但總體偏差不大,其預(yù)測(cè)結(jié)果相對(duì)較好,此結(jié)果表明基于SVM 的天氣溫度預(yù)測(cè)的可靠性與可行性。
本研究首先利用Python 爬取國內(nèi)天氣網(wǎng)歷史天氣溫度的數(shù)據(jù),然后利用SVM 對(duì)歷史的天氣溫度數(shù)據(jù)進(jìn)行建模預(yù)測(cè),通過比較三種不同核函數(shù)的預(yù)測(cè)結(jié)果,優(yōu)選出RBF 核函數(shù)來建立預(yù)測(cè)未來天氣溫度的SVM 模型。并隨機(jī)選取了2019 年1 月到5 月的部分?jǐn)?shù)據(jù)來檢驗(yàn)我們所建立的最高溫SVM 回歸模型和最低溫SVM 回歸模型,結(jié)果顯示其均方差均小于2.7,說明利用SVM 這一方法進(jìn)行溫度預(yù)報(bào)是可靠的,且有較強(qiáng)的泛化能力,因而可為天氣預(yù)報(bào)領(lǐng)域提供一種新的技術(shù)手段。