1. 程式人生 > >小白的機器學習筆記系列 之四-邏輯迴歸

小白的機器學習筆記系列 之四-邏輯迴歸

一個概率問題

前面我們講了線性分類和線性迴歸,這裡讓我們來思考另外一類問題——求概率問題。 比如說,我們根據一個人的既往病歷,生活習慣,年齡等來判斷一個人是否會得心肌梗塞。我們想要的答案不僅僅是一個簡單的是或否,實際上我們希望知道的是得心肌梗塞的風險有多大。醫生會根據病人的情況以及自己的經驗做出很高危,高危,中等風險,低風險等判斷,實際上這可以看做是一個概率問題,我們可以劃定當得心肌梗塞的概率高於某個概率值時,我們認為是很高危,當處在某一個概率區間則認為是高危,以此類推。 那麼,機器學習是否可以習得處理這一類問題的能力嗎? 是的,我們可以用邏輯迴歸演算法來處理這一類問題。

數學模型

我們之前介紹過的線性迴歸

模型如下:

S(x)=i=0dxiwiS(x)=\sum_{i=0}^dx_i*w_i

我們希望得到的輸出是一個概率值,因此我們可以對S(x)S(x)再做一次如下變換,使得最終的輸出結果落在0-1之間。 θ(S)=es1+es\theta(S)=\frac{e^s}{1+e^s} 上面這個函式的影象如下所示,可以看到輸入S在-\infty++\infty區間內,而輸出θ(S)\theta(S)則始終落在0到1之間。 在這裡插入圖片描述 由此變換得到的輸出值是一個概率,而非是或否這樣一個簡單的結論,這個概率值被稱為軟閾值(soft threshold)

衡量錯誤

讓我們再回頭看一下,應該如何來學習樣本資料。依舊以“心肌梗塞發生概率預測問題”為例,我們得到的樣本資料,包括每個病人的各種相關資訊、是否發生心肌梗塞的實際結果。我們令1表示發生了心肌梗塞,0表示未發生心肌梗塞。 機器學習的目標是使預測結果儘可能的接近實際情況,我們可以用一個條件概率來概括上述問題,即求在輸入引數xx已發生的情況下yy亦發生的概率P(yx)P(y|x)。我們令P(yx)P(y|x)表示如下: P(yx)={1θ(s)...y=0θ(s)...y=1...P(y|x) = \biggl\{^{\theta(s)... y = 1}_{1-\theta(s) ... y = 0}...

(1)

其中,θ(s)=es1+es,s(x,w)=i=0dxiwi\theta(s)=\frac{e^s}{1+e^s}, s(x,w) = \sum_{i=0}^dx_i*w_i

此處θ(s)\theta(s)是發生心肌梗塞的概率。若病人實際發生了心肌梗塞(y=1y=1)時,我們令P(yx)P(y|x)為預測的心肌梗塞發生概率θ(s)\theta(s),且該概率應儘可能大。若該病人未發生心肌梗塞(y=0y=0),我們令P(yx)P(y|x)1θ(s)1-\theta(s),即該病人未發心肌梗塞的概率,1-θ(s)\theta(s)應當儘可能大,相當於θ(s)\theta(s)儘可能小。

總之,我們的問題最終歸結為對與所有的訓練樣本(x1,y1)(x2,y2)...(xN,yN)(x^1,y^1),(x^2,y^2),...,(x^N,y^N),求出一組W使得P(yx)P(y|x)最大化。

這個問題似乎很難直接求解,我們轉而尋找它的一系列等價命題如下:

  • 等價一1Nj=1NP(yjxj)...\frac1N\prod_{j=1}^NP(y^j|x^j)...(2) 求最大值, N為訓練樣本總數。
  • 等價二 對(2)式求最大值,等價於對1Nln(j=1NP(yjxj))-\frac1Nln(\prod_{j=1}^NP(y^j|x^j))求最小值 說明: 此處我們對P(yjxj)P(y^j|x^j)求乘積,主要也是考慮對數的乘積可以化為和的對數。

因為P(yx)P(y|x)是一個分段函式,我們對它進行分段討論。

  • y=1y=1

1Nln(j=1NP(yjxj))-\frac1Nln(\prod_{j=1}^NP(y^j|x^j))

=1Nj=1Nyjln(θ(s))...=-\frac1N\sum_{j=1}^Ny^j*ln(\theta(s))...(3)

  • 同理,當y=0y=0

1Nln(j=1NP(yjxj))-\frac1Nln(\prod_{j=1}^NP(y^j|x^j))

=1Nj=1N(1yj)ln(1θ(s))...=-\frac1N\sum_{j=1}^N(1-y^j)*ln(1-\theta(s))...(4)

在此我們對這個分段函式用一個數學小技巧將分段函式統一到一個數學函式表示式中。 Loss(θ,y)=1Nj=1N(yjln(θ(s))+(1yj)ln(1θ(s)))...Loss(\theta,y) = -\frac1N\sum_{j=1}^N(y^j*ln(\theta(s))+(1-y^j)*ln(1-\theta(s)))...(5)

(5)這個函式被稱為交叉熵,在機器學習中它通常被用作邏輯迴歸的損失函式。為了求得它的最小值,我們會採用梯度下降法。

梯度下降法求最小值

梯度的本意是一個向量(向量),表示某一函式在該點處的方向導數沿著該方向取得最大值,即函式在該點處沿著該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。—— [百度百科]

直觀的來理解梯度下降演算法,有點像盲人下山,我們先試探性的摸索自己站立位置周圍,尋找到一個最為陡峭的方向,邁出一小步。然後,重複這個動作,一步一步向谷底走去,一直到我們向四周摸索,再也找不到向下的方向,我們就認為我們已經找到了谷底。

梯度下降的迭代計算步驟如下:

  1. 求損失函式的梯度
  2. W(1)=W(0)λLossW(1) = W(0) -\lambda\nabla Loss W(1)=W(0)γLossW(1) = W(0) -\gamma\nabla Loss
  3. 如果W(1)W(0)>0W(1)-W(0)>0,則重複如果W(1)W(0)>0W(1)-W(0)>0,則重複步驟1。否則,認為已經到達底部,停止。

在這裡插入圖片描述

接下來,我們看一下如何計算這個損失函式的導數,使用鏈式法制求導過程如下。

Loss(θ,y)=1Nj=1N(yjln(θ(s))+(1yj)ln(1θ(s)))...Loss(\theta,y) = -\frac1N\sum_{j=1}^N(y^j*ln(\theta(s))+(1-y^j)*ln(1-\theta(s)))...(5)

Lossθ=yθ+1y1θ\frac{\partial Loss}{\partial \theta}=-\frac y\theta+\frac{1-y}{1-\theta}