1. 程式人生 > >NG機器學習總結-(四)邏輯迴歸以及python實現

NG機器學習總結-(四)邏輯迴歸以及python實現

在第一篇部落格NG機器學習總結一中,我們提到了監督學習通常一般可以分為兩類:迴歸和分類。線性迴歸屬於迴歸問題,例如房價的預測問題。而判斷一封郵件是否是垃圾郵件、腫瘤的判斷(良性還是惡性)、線上交易是否欺詐都是分類問題,當然這些都是二分類的問題。

Email:Spam / Not Spam? (是否垃圾郵件)

Online Transactions : Fraudulent(Yes or No)?(是否欺詐)

Tumor : Malignant / Benign ? (腫瘤良性或惡性)

y = {0 , 1}  1: “positive class”(e.g. malignant)   0 : “negative class” (e.g. benign)

這個時候如果我們進行分類,有一種辦法是直接使用線性迴歸模型,然後將其結果隱射成0和1,例如結果大於0.5視為1,結果小於0.5的視為0,如下圖腫瘤判斷的例子。當然這種方法並不適用,因為分類並非線性迴歸模型。分類問題其實和迴歸問題有點相似,當然這裡我們預測的值是離散的。

現在我們以二分類為例(當然這裡大多數情況下是多類別的),例如垃圾郵件系統,x^{(i)}代表一封郵件的特徵輸入,1代表其是垃圾郵件,0代表其不是垃圾郵件,因此y\in (0,1),對於給定的x^{(i)}其對應的輸出y^{(i)}也稱為標籤。

一、模型表示

這裡我們嘗試忽略y是離散值並使用以前的線性迴歸演算法來處理分類問題,我們知道當y\in (0,1),線性迴歸演算法的模型h_{\theta}(x)取值大於1或者小於0這樣來分類明顯是不合適的,因此我們需要將我們的模型h_{\theta}(x)

的取值滿足0\leqslant h_{\theta}(x)\leqslant 1,這裡我們使用sigmoid函式來包裝我們的模型,如下,這就是邏輯迴歸模型。

h_{\theta}(x)=g(\theta^{T}x)

z=\theta^{T}x

g(z)=\frac{1}{1+e^{-z}}

Sigmoid函式是個很漂亮的S形,其作用可以將取值的範圍友好的表示成[0,1],而且受異常資料的影響較小,所以我們用sigmoid函式來包裝就能很好的解決模型取值範圍的問題,如下圖所示:

(ps:其實,邏輯迴歸的本質上是線性迴歸,只是在特徵到結果的對映中加入了一層函式對映,即先把特徵線性求和,然後使用一個函式g(z)進行計算。g(z)函式可以將連續值對映到0和1上。也就是說線性迴歸的輸出時y=f(x)=wx,而邏輯迴歸的輸出是y=g(f(x))=g(wx)。)

這裡寫圖片描述

二、決策邊界

為了得到預測值是0或1的離散值,我們還需要將我們的模型輸出約束一下:

h_{\theta}(x)\geq 0.5\rightarrow y=1

h_{\theta}(x)< 0.5\rightarrow y=0

觀測sigmoid函式,我們可以發現:

\theta^{T}x\geq 0\Rightarrow y=1

\theta^{T}x< 0\Rightarrow y=0

因此這裡的決策邊界,就是可以將y=0和y=1的區域分開的一個條件。我們可以看下面的圖,左邊的座標圖是我們的資料分佈位置,座標圖中左下角的圓圈是y=0的類別,右上角的紅叉是y=1的類別,座標圖中的那條藍色線就是我們要找的決策邊界線。

這裡我們的例子模型表示為:

h_{\theta}(x)=g(\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2})

當我們取theta的值為(-3, 1, 1)的時候,可以看出-3+x_{1}+x_{2}= 0是圖中那條決策邊界線。

上述中我們的模型的決策邊界線是一條直線,當然有些時候h_{\theta}(x)並不是一個線性模型,比如是多項式模型,如下圖,我們的決策邊界是一個圓形,有的時候也可能是不規則的形狀。

這裡我們的例子模型表示為:

h_{\theta}(x)=g(\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+\theta_{3}x^{2}_{1} +\theta_{4}x^{2}_{2})

當theta取值是(-1,0,0,1,1)的時候,可以看出-1+x^{2}_{1}+x^{2}_{2}=0是我們的決策邊界。

當我們的h_{\theta}(x)模型更為複雜的時候,決策邊界的形狀可能就不是規則的。

三、損失函式

線性迴歸演算法中其損失函式如下表示:

J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2}

h_{\theta}(x)是線性模型的時候這是一個凸函式,如果我們繼續用這個來表示邏輯迴歸的損失函式的話,那麼它就是一個非凸函式。在使用梯度下降法求解的時候不僅存在著區域性最小值而且求導還異常困難。

這裡NG直接給出邏輯迴歸的損失函式,如下兩張圖。(當時看視訊的時候覺得他結合圖解講解為什麼這樣是可以表示邏輯迴歸的損失函式的,但是沒有解釋為什麼用log函式來表示。其實這個可以通過邏輯迴歸模型本身推導得到,就是邏輯迴歸裡面常用到的極大似然函式推導得到,有興趣的可以上網搜尋一下推導過程,這裡不作過多的說明。)

h_{\theta}(x)=g(\theta^{T}x)

Cost(h_{\theta}(x),y)=\begin{cases} -log(h_{\theta}(x)) & \text{ if } y=1 \\ -log(1-h_{\theta}(x))& \text{ if } y=0 \end{cases}

y=1時,如果h_{\theta}(x)=1,此時cost=0;但是如果當h_{\theta}(x)\rightarrow 0cost\rightarrow \infty

反之

y=0時,如果h_{\theta}(x)\rightarrow 1,此時cost\rightarrow \infty;但是如果h_{\theta}(x)=0cost=0

簡化這個損失函式如下:

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)}logh_{\theta}(x^{(i)})+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))]

四、梯度下降法求解

邏輯迴歸的梯度下降法求解的過程其實是和線性迴歸的梯度下降法求解過程相似,不同的是損失函式的不同,接下來直接給出求解的結果:

J(\theta)=-\frac{1}{m}[\sum_{i=1}^{m}y^{(i)}logh_{\theta}(x^{(i)})+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))]

Want min_{\theta}J(\theta)

Repeat {

        \theta_{j}:=\theta_{j}-\alpha \frac{\partial }{\partial \theta_{j}}J(\theta)

}

======================>下面的推導過程希望能夠手動推導一遍,觀察公式就可發現其和線性迴歸沒什麼兩樣,用程式碼實現的時候不過是h函式用sigmoid函式置換了一下。

Repeat {

        \theta_{j}:=\theta_{j}-\frac{\alpha}{m} \sum^{m}_{i=1}(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)}      

}     

h_{\theta}(x)=\frac{1}{1+e^{-\theta^{T}x}}

五、多分類

上述中,我們使用的是二分類(y=0,y=1)來介紹邏輯迴歸的,但現實場景下大多是多類別的情況,比如郵件標籤系統,郵件來自於工作、朋友、家人還是愛好?醫學診斷中,感冒、流感還是沒有生病?天氣預測中,晴天、陰天、雨天還是雪天?

對於以上的多類別情況,如何利用邏輯迴歸演算法來做呢?如果我們對每一個類別i都訓練一個邏輯迴歸模型並預測其值y=i類別的概率值,那麼當一個新的輸入x,我們用每一個類別的邏輯迴歸模型預測其對應類別的輸出值,然後取概率值最大的那個類別。如下圖所示,對每一個類別建立邏輯迴歸模型的時候,其他的類別統一當成另一種類別(間接的轉換成二分類的問題),這樣就可以用邏輯迴歸來解決多類別的問題。

Train a logistic regression classifier h_{\theta}^{(i)}(x) for each class i to predict the probability that y=i

On a new input x to make a prediction,pick the class i that maximizes

maxh^{(i)}_{\theta}(x)

六、python實現

這裡用python簡單實現了邏輯迴歸演算法(只使用了兩個特徵變數),然後利用邏輯迴歸從疝氣病症預測病馬的死亡率。