第二篇出爐摟:[Python]Predict PM2.5 Use Linear Regression-2
這是課堂的一次Assignment,利用OPENDATA歷史資料去predict未來的PM2.5值,使用線性回歸的方法,覺得很有很有意思,將做的過程記錄下來。
這篇會稍微介紹一下Machine Learning中Linear Regression的原理,以及如何實作,下一篇再來講述在實際面對數據時所遇到的挑戰和解決方法。
作業說明
本次作業的資料是從中央氣象局網站下載的真實觀測資料,希望大家利用linear regression或其他方法預測PM2.5的數值。本次作業使用豐原站的觀測記錄,分成train set跟test set,train set是豐原站每個月的前20天所有資料。test set則是從豐原站剩下的資料中取樣出來。
train.csv:每個月前20天的完整資料。
test.csv:從剩下的資料當中取樣出連續的10小時為一筆,前九小時的所有觀測數據當作feature,第十小時的PM2.5當作answer。一共取出240筆不重複的test data,請根據feauure預測這240筆的PM2.5。
Linear Regression簡介
太詳細的介紹就不說了,網路上都查的到,這邊講一下自己的理解,有些可能沒有那麼正確,如果講錯還請更正:
線性回歸的基本性質就是在你手上有一些資料(data)的時候,想要找出一個模型(方程式)使得所有的data(你現在手上的,以及,未來出現的)離這條線的差距都盡可能小。
這條線如果是直線,那他的方程式就是一維的線性方程式$y = ax + b$
如果是曲線那方程式就會是二維以上,ex: $y = ax + bx^2 + cx^3 +…. + z$
我們要做的就是利用手上的data(在方程式中便是x)去找出最佳的參數(a,b,c…z)。
接下來會有一些問題:
- 為什麼Linear Regression可以進行Predict?
想一下回歸要做的事情,就是找到一組參數使得所有data對這條線的誤差越小越好,那麼如果我真的找到了這一條線,我就可以用一個訓練時不曾出現過的data x’代到這個方程式中得到y’,這個y’就會是我們預測的結果(因為x’和你在訓練的data都是來自於一個相同的資料分布)。
以本次作業預測PM2.5為例,OPENDATA中每小時記錄了CO、CH4、NO、NO2…各種氣體的觀察值,那麼我好奇:這些氣體的值是否一定程度上會影響到PM2.5呢?(例如一氧化碳越高,PM2.5會不會也提高呢),假設PM2.5的值 = 2CO + 3CH4,那之後我只要知道CO跟CH4的值,我就可以去預測PM2.5的值了。
在上述例子中:
CO、CH4…這些值就是data,也就是x
CO的係數2和CH4的係數3則是我們要找的weight,也就是a,b,c,….z
- 如何評估找出的線是最佳的?
我們可以透過Loss Function來估算我們的參數好壞,Loss Function的公式為$\sum( (y - y’)^2)$
y是真正的data
y’是透過我們的方程式預估出來的值
平方是因為誤差有正有負,做sigma則是要將所有data誤差進行加總
所以透過Loss Function,我們可以發現值越大代表資料離那條線越遠,則這條線較差。
- 如何找出最佳的線(weights)?
我們剛剛說Loss Function的式子是$\sum( (y - y’)^2)$ ,將y’展開成y’ = wx + b(假設是一維的線性方程式,如果是多維的問題一樣是這個式子,把y,w,x,b都想像成矩陣即可)
變成: $\sum( (y - (wx + b) )^2)$,其中w,b是我們要求的
不難看出: 要使這個Loss Function越小越好可以將問題轉換成=>找出最佳的w和b
先考慮w的部份,還記得微積分找一個多項式的最小/最大值怎麼做嗎?找出一階微分=0的點
就物理的意義來說,一階微分也可以被視作斜率,所以我對於一個Loss Function(L)做一階微分會有三種結果,y軸是Loss值,x軸是w,這邊搭配一張老師上課的PPT比較好理解:
- 斜率=0,那我們找到了最佳(或局部最佳)的w
- 斜率>0,代表現在線是往右上的趨勢,那我們應該要往反方向(左下)走才會走到平地(斜率=0)
- 斜率<0,代表現在線是往左上的趨勢,那我們應該要往反方向(右下)走才會走到平地(斜率=0)
首先我們對L進行w的偏微分(因為要最小的只是w),會得到
將原本的w減掉這個2 sigma( (y - (wx + b) ) (-x)),就會使w依照當前的斜率去進行更新,這就是Gradient Descent(梯度下降法)。同理參數b,所以總共有兩個式子要更新:
n是learning rate,實際上在做的時候這個變數會決定了你更改的幅度(就像你決定要往右下走,但要走多遠就是由n來控制的),並且,你有沒有可能走過頭?所以你必須要不斷地去重複做上述的事情(做幾次在Machine Learning稱為epochs),值到整個函數達到收斂。
SO,you will determine two parameters: learning rate(n) and training times(eopchs),and then you can start your training!!
現在我們知道了何謂Linear Regression、如何用它來預測、實作的步驟,下一篇將會講我在實作這個Assignment中面臨到的問題。