[ML]Predict PM2.5 Use Linear Regression-2

Posted by John on 2018-03-23
Words 1.3k and Reading Time 4 Minutes
Viewed Times

上一篇連結:[Python]Predict PM2.5 Use Linear Regression-1

上篇用自己的想法簡單了闡述Linear Regression、原理和實作過程,但畢竟還是理論,面對實際資料的時候又是另一回事了,這篇要來講處理實際data的過程以及遇到的問題還有解決方法,做一些紀錄:

1. 打開dataset先觀察一下,總要先知道資料長什麼樣子才有辦法做處理

31.png

這份dataset每小時紀錄一次18種不同的空氣資料,一天紀錄24小時,且一個月紀錄20天,總共12個月。

=>資料總共有 1(index row) + 182012 = 4320列(rows),3(text) + 24 = 27行(columns)

(第一次真正的動手處理資料,由於之後的動作都是牽涉到矩陣乘法,必須第一個矩陣的列數和第二個矩陣的行數相同才能乘,所以我很重視每個矩陣的row和col數量,才不會到時候有這方面的BUG產生。)

  1. Feature Extracting:把我們需要的資料取出來

觀察一下資料,前三行的資訊都是我們不需要的(我們只需要連續9小時,每小時18個不同空氣的數值,不用管是哪一天的)

  • 為了方便之後擷取data,我把432027的資料轉換成一個185760(12月20天1天24小時)的矩陣,也就是從1/1開始,把1/2的資料拉上來接再1/1的後面,之後把1/3拉上來接再1/1後面…,這樣一來我就可以用迴圈去從這個18*5760的矩陣連續取出資料(如果不做這一步,會很難從1/1晚上取到1/2早上,因為要處理跨天的問題)。

32.png

  • 以每個月(20天*24小時 = 480筆)為單位,每9個小時的資料存成矩陣x的一列(162),並在第163個位置存上1這個數字,這個1是用來對y = xw + b的b做乘法的,之後我們同樣的也在w矩陣的最後一個位置多存上b這個數字,如此一來,原本要更新w和b兩個變數,就可以變成更新一個w矩陣即可。我覺得這個很難講解,看下面的圖說故事吧。
  • 此外,每個第10小時的PM2.5值則存到一個矩陣y的一列中。
  • 在做資料萃取的時候我沒有跨月做(其實也可以做),所以一個月總共有480- 10 + 1 = 471筆資料,乘上12個月=5652筆。

33.png
34.png

所以做完上述兩件事後,會有y= xw 這個式子中的x和y矩陣(b被合併了),x的size會是5652(12個月一個月可以取471筆)163(18個資料9小時 + b),y會是56521。

到這裡來檢查一下,y=xw的式子中,y是56521,x是5652163,矩陣乘法要成立的話w就必須是163*1的矩陣才行,實際上也沒錯,實際上這個式子真正的樣子是:

$y = w0x0 + w1x1 + w2x2 + w3x3 + w4x4 + … + w162x162 + b$,w和b剛好有163個,而資料{x0,x1…,x162}共有5652組。

那麼w的163個數字應該要是什麼呢?亂數設定即可(當然也可以設0,因為0也是亂數的一種可能嘛xD)

  1. 更新Weights(Gradient Descent)

到這裡就輕鬆多了,我深深覺得在這個Assignment中最難的就是資料處理的部分…

現在每做一次y = xw,就等於是predict 5652筆data的PM2.5值,但一定不準,所以要用上次講到的梯度下降法去更新我們的權重,也就是w這個矩陣,式子就不說了上次有提到。

上次有說到我們要控制兩個參數:learning rate以及epochs,接下來就是不斷的調整,使得妳的Loss function越小越好。一開始我完全沒概念要如何給定這兩個值,結果發現Loss function爆炸了(指數級上升),後來先把learning rate調小,然後逐漸增加epochs兩三次來觀察L有無下降的趨勢,如果沒有代表這個rate可能不太適合,再重新設定learning rate,然後再用不同的epochs來觀察…

最後我發現我的L降低到一個程度後就不會再降低了,所以我的model就train到這裡,雖然用這個model預測PM2.5還是會有誤差, 但誤差都介於0~20以內,所以我覺得或許是個還不錯的結果…吧。

  1. Adagrad 調整learning rate是需要一直嘗試的,但透過Adagrad可以幫助妳不用太care這個參數,它的原理大概是:learning rate會隨著妳的epochs增加而越來越小,進而達到model的收斂。就像妳打高爾夫,第一次揮桿很大力,但隨著揮桿次數越多,快到洞的時候妳的揮桿就會越來越小力,因為妳只想讓球移動一點點距離。我最後是用了這個方法來training model的,做出來的效果比不用adagrad好一點,不過也沒差太多(但是要嘗試很多次就是了)。 好啦,說了這麼多,完整的程式碼放在github

>