2015年1月13日 星期二

[機器學習](七)邏輯回歸(Logistic regression)

分類問題

談到二元分類問題(Binary Classification problem),我們可能有以下例子:
郵件:是垃圾還是非垃圾?
腫瘤:是惡性還是良性?
線上交易:是不是詐欺?

在這裡我們要預測的結果y只有兩種值:{0, 1},其中0是負面的(negative class),1是正面的(positive class)。然而multi-class problem的y可能有很多種:{0, 1, 2, 3, ..}

當使用Linear regression演算法時,我們的假設函數為:${ h }_{ \theta  }(x)$ = ${ \theta  }^{ T }x$


如果將Linear regression演算法運用在這個data set上,得到的hypothesis ${ h }_{ \theta  }(x)$ = ${ \theta  }^{ T }x$所對應的一條回歸線可能看起來會如圖1.a所示。

如果你想 進行預測,你可能會定義一個分類的門檻值(Threshold classifier output),例如${ h }_{ \theta  }(x) = 0.5$(垂直軸)。如果hypothesis輸出的值大於等於0.5,就預測y=1,否則預測y=0。

給定上圖這種data set的狀況下,把Linear regression拿來用在分類問題可能沒什麼問題,但是如果多加了一個training example,如圖1.b,則此條回歸線可能會改變,使得預測結果明顯不準確。因此,把Linear regression用在分類問題時,可能不是個好方法。

因為二元分類問題的輸出結果y只會是1或0,如果把Linear regression用在分類問題,Linear regression輸出的${ h }_{ \theta  }(x)$可能會大於1或是小於0,所以接下來的邏輯回歸(Logistic regression),其特性就是它的輸出(預測)永遠都會介在0和1之間,不會有大於1或小於0的情況,也就是0$\le{ h }_{ \theta  }(x)\le$ 1, 雖然邏輯回歸演算法有「回歸」這兩個字,但是它其實是被用在分類問題。總之,線性回歸用在分類問題不是個好方法!


邏輯回歸的假設函數

現在來談談Logistic regression,Logistic regression模型想要讓0$\le { h }_{ \theta  }(x)\le$1,原本Linear regression的輸出為${ h }_{ \theta  }(x)$ = ${ \theta  }^{ T }x$,現在Logistic regression的輸出則變成了:${ h }_{ \theta  }(x)$ = $g({ \theta  }^{ T }x)$

簡單說,就是以線性回歸為基礎,在最後多加了一層g函數,g函數定義為:$g(z)=\frac { 1 }{ 1+{ e }^{ -Z } } $,又叫做「Sigmoid function」或是「Logistic function」。

因為將這個邏輯函數應用在線性回歸的基礎上,所以叫做邏輯回歸。Sigmoid function與Logistic function算是同義詞,所以兩者皆可代表此函數。

現在,${ h }_{ \theta  }(x)$ = $g({ \theta  }^{ T }x)$ = $\frac { 1 }{ 1+{ e }^{ -{ \theta  }^{ T }x } }$

當Z為負無限大時,g(Z)會逼近於0,當Z為正無限大時,g(Z)會逼近於1。因為g(Z)輸出的值介於0和1之間,${ h }_{ \theta  }(x)$輸出的值也就介於0和1之間了。

最終,給定假設函數:${ h }_{ \theta  }(x)$ = $\frac { 1 }{ 1+{ e }^{ -{ \theta  }^{ T }x } } $,我們要做的事就如同過去,為我們的data找出參數$\theta$。

另外,如果用機率角度解釋,假設函數${ h }_{ \theta  }(x)$的輸出結果就是「y=1的機率」。

若現在要對一個病人的腫瘤進行預測(分類),而每個病人只有腫瘤大小這一個特徵,同樣的,還是額外定義一個x0=1,則特徵向量x為:

$x = \begin{bmatrix} { x }_{ 0 } \\ { x }_{ 1 } \end{bmatrix} = \begin{bmatrix} 1 \\ 腫瘤大小 \end{bmatrix}$

此時若${ h }_{ \theta  }(x)$=0.7,就代表y=1的機率為70%,也就是其腫瘤有70%的機會會是惡性的。

以上式子還可以改寫成:${ h }_{ \theta  }(x)$ = P(y=1 | x ; $\theta$)

意思是,給定每個病人其獨特的特徵向量x以及參數$\theta$時,y=1的機率(反正就是y=1的機率)。

所以給定${ h }_{ \theta }(x)$,我們也可以計算y=0的機率。由於y只會是1或0,我們知道y=0的機率加上y=1的機率會是1,也就是:P(y=1 | x ; $\theta$)+P(y=0 | x ; $\theta$)=1。所以,y=0的機率就是:P(y=0 | x ; $\theta$)=1 - P(y=1 | x ; $\theta$),簡單吧。

總之,假設函數在邏輯回歸中所代表的意思就是「輸出等於1的機率」的意思。


線性的決策邊界(Decision boundary)

回顧一下:

${ h }_{ \theta  }(x) = g({ \theta  }^{ T }x)$
g(Z)=$\frac { 1 }{ 1+{ e }^{ -Z } } $

前一段我們設定的決策邊界為:

當${ h }_{ \theta  }(x) = g({ \theta  }^{ T }x)\ge 0.5$,也就是${ \theta  }^{ T }x\ge 0$時,就預測y=1。
當${ h }_{ \theta  }(x) = g({ \theta  }^{ T }x)<0.5$,也就是${ \theta  }^{ T }x<0$時,就預測y=0。

假設現在有兩個特徵,則假設函數${ h }_{ \theta  }(x)$ = $g({ \theta  }_{ 0 }+{ \theta  }_{ 1 }{ x }_{ 1 }+{ \theta  }_{ 2 }{ x }_{ 2 })$,再另${ \theta  }_{ 0 }$ = -3,${ \theta  }_{ 1 }$ = 1,${ \theta  }_{ 2 }$ = 1,則參數向量$\theta$為:

$\theta \quad =\quad \begin{bmatrix} -3 \\ 1 \\ 1 \end{bmatrix}$

按照之前的式子,如果${ \theta  }^{ T }x$ = -3+${ x }_{ 1 }$+${ x }_{ 2 }\ge 0$,或是${ x }_{ 1 }$+${ x }_{ 2 }\ge 3$,則預測y=1。

回歸線${ x }_{ 1 }$+${ x }_{ 2 }$=3(也就是${ h }_{ \theta  }(x)$=0.5)如下圖所示:


若${ x }_{ 1 }$+${ x }_{ 2 }>3$,對於落在右上那塊的data,${ h }_{ \theta  }(x)$會預測y=1。反之,若${ x }_{ 1 }$+${ x }_{ 2 }<3$,對於落在左下那塊的data,${ h }_{ \theta  }(x)$會預測y=0。

要注意的是,圖中這條決策邊界是由假設函數${ h }_{ \theta  }(x)$ = $g({ \theta  }_{ 0 }+{ \theta  }_{ 1 }{ x }_{ 1 }+{ \theta  }_{ 2 }{ x }_{ 2 })$所形成的,而非由圖中的data set所形成,畫出data set只是為了視覺化,如果拿掉這個data set,這條邊界依然是畫成這樣,不可倒果為因!

簡而言之,當決定出${ \theta  }_{ 0 }$、${ \theta  }_{ 1 }$與${ \theta  }_{ 2 }$之後,這條決策邊界就已經形成了,之後才去探討data落在哪一區塊,而不是先有data才有這條決策邊界。

非線性的決策邊界(Decision boundary)



此圖中,這條決策邊界是怎麼畫出來的呢?在多項式回歸或是線性回歸中,我們提到可以在特徵中加入額外的「高階多項式」項目,在邏輯回歸中一樣可以這麼做。

同樣的,考慮假設函數:${ h }_{ \theta  }(x)$=$g({ \theta  }_{ 0 }+{ \theta  }_{ 1 }{ x }_{ 1 }+{ \theta  }_{ 2 }{ x }_{ 2 }+{ \theta  }_{ 3 }{ x }_{ 1 }^{ 2 }+{ \theta  }_{ 4 }{ x }_{ 2 }^{ 2 })$,我們加入兩個額外的特徵${ x }_{ 1 }^{ 2 }$與${ x }_{ 2 }^{ 2 }$。

下一段,我們會探討如何自動取得參數${ \theta  }_{ 0 }$到${ \theta  }_{ 4 }$,但此時我們先假設${ \theta  }_{ 0 }=-1$,${ \theta  }_{ 1 }=0$,${ \theta  }_{ 2 }=0$,${ \theta  }_{ 3 }=1$,${ \theta  }_{ 4 }=1$。

這些參數寫成參數向量$\theta$就是:$\theta =\begin{bmatrix} -1 \\ 0 \\ 0 \\ 1 \\ 1 \end{bmatrix}$

此時就代表,如果$-1+{ x }_{ 1 }^{ 2 }+{ x }_{ 2 }^{ 2 }\ge 0$或是${ x }_{ 1 }^{ 2 }+{ x }_{ 2 }^{ 2 }\ge 1$,則預測y=1,而${ x }_{ 1 }^{ 2 }+{ x }_{ 2 }^{ 2 }=1$這條決策邊界就會長得像上圖那樣一個依照半徑為1所畫的圓。如果data落在圓圈外圍,將會預測y=1。

因此,當加入額外的多項式項目到我的特徵後,就可以得到長得更複雜的決策邊界,而不單單只是由一條 直線來分類而已。同樣的,決策邊界是由參數向量$\theta $所形成的,而非由data set所形成。

總之,當你加入越多的多項式項目到特徵中,你的決策邊界也會越複雜或奇特,下一段我們會探討如何自動化取得參數$\theta$的值並應用在我們的data中。

邏輯回歸的成本函數

假設我們有一個具有m個examples的training set,特徵向量以及假設函數如下,

$x\in \begin{bmatrix} { x }_{ 0 } \\ { x }_{ 1 } \\ ... \\ { x }_{ n } \end{bmatrix}$,其中${ x }_{ 0 }$=1,y={0,1}

${ h }_{ \theta  }(x)$ = $\frac { 1 }{ 1+{ e }^{ -{ \theta  }^{ T }x } } $

給定這個training set,我們該如何找出參數$\theta$?

在線性回歸中:成本函數$J(\theta )=\frac { 1 }{ m } \sum _{ i=1 }^{ m }{ \frac { 1 }{ 2 }  } { ({ h }_{ \theta  }({ x }^{ (i) })-{ y }^{ (i) }) }^{ 2 }$,這邊我們把1/2寫進求和裡面。其中我們將$\frac { 1 }{ 2 } { ({ h }_{ \theta  }({ x }^{ (i) })-{ y }^{ (i) }) }^{ 2 }$看成$Cost{ ({ h }_{ \theta  }({ x }^{ (i) }),{ y }^{ (i) }) }$。

若再簡化一下,不要寫(i),則$Cost{ ({ h }_{ \theta  }({ x }),{ y }) }$=$\frac { 1 }{ 2 } { ({ h }_{ \theta  }({ x })-{ y }) }^{ 2 }$。

討論線性回歸時提過,成本函數的意思就是輸出${ h }_{ \theta  }({ x })的值$,所必須付出的成本,這個函數用在線性回歸是可以的,但是用在邏輯回歸會變成一個non-convex function(非凸集函數)。

以下是我對non-convex的解釋:
由於${ h }_{ \theta  }(x)$ = $g({ \theta  }^{ T }x)$ = $\frac { 1 }{ 1+{ e }^{ -{ \theta  }^{ T }x } } $,其中g函數(也就是Sigmoid函數)是一個非常不線性的函數,如果套用在成本函數$J(\theta )$,則$J(\theta )$可能會長成如下左圖所示,有很多局部最小值,一個比較正式的稱呼是非凸函數。


如果你把梯度下降法用在這樣一個成本函數上,你無法保證梯度下降法能夠收斂到該函數的全局最小值。相反的,凸函數則如右圖所示,把梯度下降法用在上面,可以保證梯度下降法會收斂到該函數的全局最小值。

所以,如果你將Sigmoid函數帶進平方誤差成本函數,會使其變成一個非凸函數。我們現在要做的,就是找出可以保證使用梯度下降法會收斂到該函數的全局最小值的另一個替代的成本函數。

以下是邏輯回歸應該使用的成本函數:

$Cost({ h }_{ \theta  }(x),y)=\begin{cases} -log({ h }_{ \theta  }(x))\quad \quad if\quad y=1 \\ -log(1-{ h }_{ \theta  }(x))\quad if\quad y=0 \end{cases}$

將y=1的case畫成圖如下,其中${ h }_{ \theta  }(x)$介於0~1之間:


為何y=1的圖為何會這樣畫,可以這樣理解,Z現在代表${ h }_{ \theta  }(x)$,當橫軸叫做Z軸時,-log(Z)會呈現如下圖紅色曲線:


由於我們感興趣的只有何時成本函數才會產生0~1的值,所以我們把紫色框那個0~1的區間獨立出來,這就是y=1那張 圖的由來。

這個成本函數有些有趣的特性,首先,如果y確實等於1,且假設函數${ h }_{ \theta  }(x)$的輸出也等於1,則Cost=0,因為我們確實正確的預測出了y=1,成本當然就是0。

但如果假設函數${ h }_{ \theta  }(x)$的輸出逼近於0時,成本會接近無限大。這很直覺,如果${ h }_{ \theta  }(x)$=0,也可以說P(y=1|x;$\theta$)=0,也就是y=1的機率為0,用在腫瘤例子就是我們預測腫瘤會是惡性的機率為0,但事實上腫瘤是惡性的,因為現在y是等於1,所以我們這個學習演算法其實判斷錯誤了,付出的成本當然就很高。如果y=0,以上狀況就反之囉(看下圖)。



簡化成本函數以及梯度下降法

這一段我們會探討如何簡化成本函數的寫法,以及如何利用梯度下降法來選出理想的邏輯回歸的參數$\theta$,講完這一段你就可以知道如何實現一個完整的邏輯回歸演算法了。

這是我們完整的成本函數:$J(\theta )=\frac { 1 }{ m } \sum _{ i=1 }^{ m }Cost{ ({ h }_{ \theta  }({ x }^{ (i) }),{ y }^{ (i) }) }$

其中$Cost({ h }_{ \theta  }(x),y)=\begin{cases} \quad -log({ h }_{ \theta  }(x))\quad if\quad y=1 \\ -log(1-{ h }_{ \theta  }(x))\quad if\quad y=0 \end{cases}$

${ h }_{ \theta  }(x)$對實際值${ y }^{ (i) }$進行預測後,之間的差異就是單個樣本的成本值,加總所有這些差異後就是這個成本函數的輸出。

在分類問題中,我們的training set或是其他不在我們training set的樣本,y的值永遠都是1或是0,這是y的數學定義決定的。

由於y要嘛是0要嘛是1,我們就可以用一個簡單方式來寫這個成本函數,為了讓這個函數不要分成y=1與y=0這兩種狀況,我們可以將它寫成一個式子就好。這樣可以簡易的寫出成本函數並推導出梯度下降法。

$ Cost({ h }_{ \theta  }(x),y) = - y log({ h }_{ \theta  }(x))\quad +\quad - (1-y) log(1-{ h }_{ \theta  }(x))$

如果y=1,$Cost({ h }_{ \theta  }(x),y) = -log({ h }_{ \theta  }(x))$
如果y=0,$Cost({ h }_{ \theta  }(x),y) = -log(1-{ h }_{ \theta  }(x))$

因此以下我們可以導出最終的邏輯回歸的成本函數:

$J(\theta )=\frac { 1 }{ m } \sum _{ i=1 }^{ m }Cost{ ({ h }_{ \theta  }({ x }^{ (i) }),{ y }^{ (i) }) }$
$=-\frac { 1 }{ m }[\sum _{ i=1 }^{ m }{ { y }^{ (i) }log{ h }_{ \theta  }({ x }^{ (i) })\quad +\quad (1-{ y }^{ (i) })log(1-{ h }_{ \theta  }({ x }^{ (i) })) } ]$

以上就是這個式子大家最常用的寫法,至於為何會有這種寫法呢?主要是來自統計學的maximum likelihood estimation(MLE)。

至於要怎麼找參數$\theta$呢?我們得試圖找出能夠讓J($\theta$)的輸出儘量最小值的參數$\theta$:${ min }_{ \theta  }$ J($\theta$),也就是最小化J($\theta$)。

J($\theta$)會輸出一群參數$\theta$,例如$\Theta =\begin{bmatrix} { \theta  }_{ 0 } \\ { \theta  }_{ 1 } \\ { \theta  }_{ 2 } \\ ... \\ { \theta  }_{ n } \end{bmatrix}$。

如果有一個新的example,其有一群特徵寫成特徵向量x,我們要對它進行預測時,就可以將${ min }_{ \theta  }$ J($\theta$)所輸出的這群$\theta$用在我們的training set,讓${ h }_{ \theta  }(x)$ = $\frac { 1 }{ 1+{ e }^{ -{ \theta  }^{ T }x } } $進行假設預測,而我們的假設其實就是預測y=1的機率(就是P(y=1|x;$\theta$))。

接下來的工作就是要知道如何最小化成本函數J($\theta$),也就是為training set找出最理想的參數$\theta$。最小化成本函數的方法就是使用梯度下降法,以下是常用的梯度下降法的模板,我們用這個式子反覆更新每個參數:

Repeat{
 ${ \theta  }_{ j }:={ \theta  }_{ j }-\alpha \frac { \partial  }{ \partial { \theta  }_{ j } } J(\theta )$
}

${ \theta  }_{ j }$自己減去學習速率$\alpha$乘以後面的微分項,最後就會變成如下這樣:

Repeat{
 ${ \theta  }_{ j }:={ \theta  }_{ j }-\alpha \sum _{ i=1 }^{ m }{ ({ h }_{ \theta  }({ x }^{ (i) })-{ y }^{ (i) }) } { x }_{ j }^{ (i) }$
}

如果你有n個特徵,也就是說參數向量$\Theta =\begin{bmatrix} { \theta  }_{ 0 } \\ { \theta  }_{ 1 } \\ { \theta  }_{ 2 } \\ ... \\ { \theta  }_{ n } \end{bmatrix}$,此時你就可以用以上式子來同時更新所有$\theta$的值。

最後,你會發現這個更新參數的式子跟線性回歸時的梯度下降式子是相同的。那麼線性回歸跟邏輯回歸兩者的規則有差嗎?有的,實際上,假設的定義有發生了變化:

在線性回歸中,我們是假設${ h }_{ \theta  }(x)$ = ${ \theta  }^{ T }x$
在邏輯回歸中,我們是假設${ h }_{ \theta  }(x)$ = $\frac { 1 }{ 1+{ e }^{ -{ \theta  }^{ T }x } }$

所以兩者的梯度下降法實際上是兩個完全不同的東西。當我們在談論線性回歸的梯度下降法時,我們談到了如何監控梯度下降法以確保其收斂,而在邏輯回歸中也可以使用同樣的方法。在更新參數時可以用一個for迴圈(for j in range(0,n):)來更新,但更理想的是,我們可以使用向量化的實現(vectorized implementation)來同時更新參數,也就是:

 ${ \theta  }:={ \theta  }-\alpha \frac { 1 }{ m } \sum _{ i=1 }^{ m }{ [({ h }_{ \theta  }({ x }^{ (i) })-{ y }^{ (i) }) } { x }^{ (i) }]$

最後,線性回歸所講到的特徵縮放(Feature scaling)也可以用在邏輯回歸中,如果你的特徵彼此之間差距很大的話,將特徵縮放用在邏輯回歸也可以讓梯度下降法收斂得更快。

最佳化演算法



寫程式時,可能需要寫$J(\theta)$以及$\frac { \partial  }{ \partial { \theta  }_{ j } } J(\theta )$的code,寫完後就可以使用梯度下降法。其實不只有梯度下降法可以使用,最佳化演算法有如下可以選擇:

  • Gradient descent
  • Conjugate gradient
  • BFGS
  • L-BFGS

除了梯度下降法,其他三個都超出本課程範圍,不過它們有些好處,首先它們不需要手動選擇學習速率$\alpha$且收斂速度通常都比梯度下降法快,缺點就是更複雜了點。除非你是數值計算專家,否則儘量不要用這些方法,且儘量不要自己寫這些演算法,因為效能好與不好是很明顯的,直接用專家寫好的library比較適合。

舉個例子,假設現在有兩個特徵,也就是有兩個參數${ \theta  }_{ 1 }$與${ \theta  }_{ 2 }$,若你想要最小化J(\theta),則${ \theta  }_{ 1 }=5$且${ \theta  }_{ 2 }=5$,以下為octave的code:


如果把它應用到邏輯回歸呢?如下所示:



主要就是希望你寫一個可以返回成本函數值以及梯度值的函數,此演算法也可以用在線性回歸。如果你要用到非常高級的機器學習,就要使用這些比較進階的演算法,而不是梯度下降法。

多類別分類問題(one-vs-all classification algorithm)

假設你現在希望有一個演算法可以自動將郵件分類,或者說自動加上標籤,則你可能會有很多種郵件資料夾,例如工作(y=1)、朋友(y=2)、家庭(y=3)、興趣(y=4)等四類。

又如果有一個病人因為鼻子不舒服來看診,則他的陣狀可能有:沒生病(y=1)、著涼(y=2)、流感(y=3)

最後一個例子,如果你遇到一個有關天氣的機器學習分類問題,則天氣可能有晴天(y=1)、多雲(y=2)、雨天(y=3)、下雪(y=4)。

y寫成0,1,2,3或是1,2,3,4都沒關係,不會影響最後結果。

以下為二元分類問題與多元(三元)分類問題的比較,三元分類問題總共有三個類別:


以下講解one-vs-all演算法,one-vs-all又可叫作one-vs-rest。對於三元分類問題,我們要做的就是將我們的training set分成「三個二元分類問題」,對於類別1,我們建立一個新的偽training set充當類別2與類別3。類別1(三角形)代表正樣本(值=1),偽類別2,3(圓形)代表負樣本(值=0),之後就可以找出合適的邏輯回歸分類器分開正副樣本,對於類別2與3,方法一樣:



最後,我們擬合出了三個分類器,i=1,2,3,每個分類器都對其中一種狀況進行訓練。



對於每個新的輸入x,我們選擇一個能讓分類器${ h }_{ \theta  }^{ (i) }$最大化的類別i,當作是x屬於的類別,也就是選出哪個分類器的效果最好,我們就認為得到最好的分類。有了一對多這個演算法,你就可以把邏輯回歸用於多元分類問題了。



沒有留言:

張貼留言