[ML]Logistic Regression(SGD version)

Posted by John on 2018-04-16
Words 1.2k and Reading Time 4 Minutes
Viewed Times

這次課堂的Assignment是要使用106個features來預測一個人的年收入是否有達到50K,使用Logistic Regression(SGD version),Logistic Regression與Linear Regression的想法蠻相近的,這裡就以Linear Regression為基礎來簡述一下我的理解中何謂Logistic Regression,以及SGD(Stochastic Gradient Descent)是什麼。

作業說明

你可以直接在我的github看到英文版的簡介,這裡就不贅述了。

Logistic Regression簡介

Logistic Regression是什麼?跟Linear Regressin差在哪裡?

複習一下上次[Python]Predict PM2.5 Use Linear Regression – 1介紹到的,Linear Regression的公式為:

$y = wx + b$

我們想透過學習的方式找到一組w,b使得x上的點對於真正的y差距越小越好。

不過這個y值畢竟是連續的,如果我今天想做的預測只有兩類(binary classification),例如我想知道明天會不會下雨(會->1 ; 不會->0)?

這時候我們可以透過將Linear Regression的結果加上一個sigmoid函式進行轉換,sigmoid畫出來的結果如下:

1200px-Logistic-curve.svg

從圖中可以發現,sigmoid轉換出來的結果必定介於[0,1]之間,如果原本的y值越大,那sigmoid = z(y)的值就會越接近1,反之z(y)的值就會趨近於0,我們就可以把這個值視成一個機率來處理上述的binary classification問題,這就是Logistic Regression的原理。

如何評估找出來的模型是最佳的(Loss Function)?

Linear Regression使用的Loss function實際上自MSE(Minmum Square Error),也就是最小平方法。Logistic Regression使用Cross Entropy(亂度)來評估”目前學習到的模型與問題理想的模型存在的差異大小”

y’是真正的label,f(x)是我們預測的label(經過sigmoid後的),如果我們預測的f(w)和y實際上差異很小的話,代表我們的模型離真正的理想模型差異很小,那Cross Entropy的值就會相對的小。所以在訓練中我們要去不斷的minimun這個Loss function。

Gradient Descent

每一次訓練中,我們都想使ln(L(w,b))的值越來越小,所以就會使用到Gradient Descent,把這個式子分別對於w和b做偏微會得到:

(這個偏微的推導中使用到了chain rule,這邊我還不夠熟練囧…)

這個式子實際上跟Linear Regression的式子一樣,所以之後再實作其實不會有太大的差別。


Stochastic Gradient Descent(SGD)

假設你有100筆的資料,每筆都有106個features,則你的x會是(100, 106)的矩陣,y是(100, 1),而你的w會是(106, 1),b則是(1, 1)。

那做一個epoch就會牽涉到一個100*106(x)的大矩陣運算,如果今天資料很大,這個x矩陣也會變得很大使得運算上效率降低。

SGD的方式是使用了batchs(批次)的想法,每一次只針對一筆(或者,多筆)來進行訓練,雖然訓練的次數變多了,但整理的運算量會比較好一點。以gradient descent的角度來看,原本的方式是看過所有資料後走一大步,而SGD則是每次都看一個(或者,多個)資料,然後走一小小步。

所以像這個例子,如果使用SGD,我的x可能就變成(1, 106)的矩陣、y是(1, 1)、w是(106, 1)和b是(1, 1)。不過SGD的batchs並不一定只能一筆,我也可以一次25筆25筆做…

借個老師上課時的PPT來介紹一下原本的方法跟SGD對於在做Gradient Descent時的差別:

SGD.PNG

SGD在訓練過程中Loss function會有起伏的狀況,因為你走的一小步可能並不是對於真正的問題比較好的一步,但是當走的步數夠多的時候,還是可能會走到理想的終點(全域最佳解)。


Normalization & Standardization

在這次的Assignment中可以發現有些屬性的數值非常大,所以該屬性只要有一點變動就很容易影響全局的變動。我們可以透過Normalization(或Standardization)將屬性的離散程度進行轉換,如此一來有機會增加training的速度和正確率。

Normalization(正規化):將資料的分布變成介於0和1之間的數值,公式為:

$(x - min) / (max - min)$

Standardization(標準化):將資料的分布變成平均值為0,標準差為1的分布,公式為:

$(x - mean(x) ) / std(x)$

最後在Standardization下,我的training set 有著~85%的Accurancy。


>