Logistic Regression(邏輯迴歸)詳細講解

Logistic Regression(邏輯迴歸)

以前在學校學到Logistic Regression的時候,雖然最後會使用,但是對於許多地方有很多的疑惑,今天在這裏詳細梳理一下Logistic Regression的過程:


迴歸的思想

Logistic Regression和線性迴歸一樣,是迴歸中常見的算法。很多人剛接觸Logistic Regression,不知道迴歸的含義。其實在念中學的時候學到的用最小二乘法求解線性迴歸方程,就是我們最早接觸到的迴歸。在二維平面上有很多的點<x1,y1>,<x2,y2>...<xn,yn>,從這些點中選出一條直線,來很好的擬合這些點。通過求解,最後得到的迴歸方程形式是y=bx+a,然後來一個新的新的x,通過這個函數,能夠計算得到對應的y的值。

所以一種常見的迴歸就是通過一系列的點,計算得到一條合適的線。當有新的輸入時,可以直接計算得到輸出。不侷限於二維平面的話,點可以表示爲<x1,y1>,<x2,y2>...<xn,yn>x1是一個d維的向量。對於線的表示都不盡相同,線性迴歸得到的預測函數形式是y=w⃗ Tx⃗ +a,對於Logistic 迴歸,是一條“S”型曲線,在接下來會講到。

還有一些迴歸不是通過得到一條線。比如使用決策樹來回歸。就是把一些點分佈到樹的節點上。每個節點的平均值就是作爲迴歸值。

簡單來說,迴歸就是根據輸入預測一個值。

Logistic Regression形式

Logistic Regression最常見的應用場景就是預測概率。比如知道一個人的 年齡性別血壓膽固醇水平體重,想知道這個人患心臟病的概率。首先很容易想到通過線性迴歸,根據這一組值來計算得到一個分數。對於病人的特徵(x0,x1,x2,...,xd),計算得到危險分數是 

s=i=0dwixi

計算得到的分數越高,風險越大,分數越低,風險越小。s的取值是[,+]的值,但是我們想要的是一個[0,1]之間的值。因此需要一個轉換函數來把這個分數轉換成[0,1]之間的值。這個函數稱爲Logistic 函數,Logistic函數是一個S形的函數。 
形狀如下圖所示: 
Logistic Function 
這個函數也稱爲sigmoid函數。函數能夠把s映射到[0,1]之間,我們把這個函數稱爲θ(s)。Logistic函數形式爲: 
θ(s)=es1+es=11+es

其中e即是自然常數。 
因此整個Logistic Regression的函數形式爲: 
h(x⃗ )=11+ew⃗ Tx⃗ 

損失函數

在Logistic Regression函數中,我們使用最大似然方式來求解模型的參數。有關最大似然,維基百科有定義。 
我們把真實模型稱爲f,學習得到的模型爲hf是未知的,要用h去擬合f。Logistic Regression的目標函數是,在已知x的條件下,輸出y=+1的概率,y=+1即爲f(x)y=1的概率爲1f(x)。對於數據集D={(x⃗ 1,+1),(x⃗ 2,1),...,(x⃗ n,1)},抽取到該數據集的概率爲 

P(x⃗ 1)f(x⃗ 1)P(x⃗ 2)(1f(x⃗ 2))...P(x⃗ n)(1f(x⃗ n))

因爲f是真正產生這個數據集的,f產生這個數據集的概率應該是很大的(最大似然估計的思想)。如果我們用h來代替f,那麼得到該數據集的概率爲 
P(x⃗ 1)h(x⃗ 1)P(x⃗ 2)(1h(x⃗ 2))...P(x⃗ n)(1h(x⃗ n))
,這個概率我們稱爲似然函數likelihood(h)。需要找到的最終的函數h應該是likelihood(h)取最大值的那個h。即我們要求解likelihood(h)最大值,然後得到h即爲我們想要的。

likelihood(h)=P(x⃗ 1)h(x⃗ 1)P(x⃗ 2)(1h(x⃗ 2))...P(x⃗ n)(1h(x⃗ n))

其中,根據Logistic函數的對稱性有1h(x⃗ )=h(x⃗ )。從而有 
likehood(h)i=1nh(yixi)()

我們要求解maxhlikelihood(h),即需要求解maxhni=1h(yixi),我們需要的是求得w⃗ 這個參數,因此轉換得到 
likehood(w)i=1nθ(yiw⃗ Txi)

這是一個連乘,兩邊取對,即可轉換成連加。 
ln(likehood(w))i=1nln(θ(yiw⃗ Txi))1ni=1nln(θ(yiw⃗ Txi))

求解上式的最大值,等價於求解 
minw⃗ 1ni=1nln(θ(yiw⃗ Txi))

θ函數定義代入,得到 
minw⃗ 1ni=1nln(1+eyiw⃗ Txi)

定義
Ein(w⃗ )=i=1nln(1+eyiw⃗ Txi)

err(w⃗ ,y,x⃗ )=ln(1+eyiw⃗ Txi)

err(w⃗ ,y,x⃗ )爲在極大似然估計下,Logistic方程的誤差,稱爲cross entropy error。而讓Ein(w⃗ )最小的w⃗ 是我們希望得到的Logistic Regression模型的參數。

最小化Ein(w⃗ )

根據以上的推導,損失函數Ein(w⃗ )爲 

Ein(w⃗ )=i=1nln(1+eyiw⃗ Txi)

從數學上可以推導出Ein(w⃗ )是連續平滑的,可微,且二次可微的,也是凸函數(來自林軒田老師視頻)。要求Ein(w⃗ )的最小值,就對Ein(w⃗ )求微分,然後計算微分等於0的點。 
Ein(w⃗ )w⃗ 每一個方向分量wj上求偏微分 
Ein(w⃗ )wj=1ni=1nθ(yiw⃗ Txi)(yixi,j)

把偏微分中的xi,j換成向量,則可以得到一階微分: 
Ein(w⃗ )=1ni=1nθ(yiw⃗ Txi)(yixi)

Ein(w⃗ )屬於該損失函數的梯度,在二維空間的話我們稱爲斜率。如果直接令: 

Ein(w⃗ )=0

來求解的話,是很難求解出w⃗ 的值的,因此需要使用其他方式。

梯度下降法

直接求解是無法求解出w⃗ 的,一種思想是採用迭代的方式求最小的Ein(w⃗ )。每次改變w⃗ 一點,儘可能使這個改變讓Ein(w⃗ )朝着變得更小,這樣逐步使Ein(w⃗ )趨近於最小值。如第t次到t+1次迭代,權重更新的形式如下: 

w⃗ t+1=w⃗ t+ηv⃗ 

其中v⃗ 是一個單位向量,η是步長。Ein(w⃗ t+1)應該要比Ein(w⃗ t)更小,這樣的更新纔有意義。因爲我們是要找到Ein(w⃗ )的最小值。 
Ein(w⃗ t+1)代入w⃗ t,得到Ein(w⃗ t+ηv⃗ )。現在有Ein(w⃗ )的一階微分,可以對Ein(w⃗ t+ηv⃗ )採用泰勒展開,如下: 
Ein(w⃗ t+ηv⃗ )Ein(w⃗ t)+ηv⃗ TEin(w⃗ t)

忘記泰勒展開沒關係,可以從直觀上來理解這個式子。根據以上的結論,Ein(w⃗ )是存在最小值的,同時是光滑連續,可微及二次可微的。其曲線類似於下圖: 
這裏寫圖片描述 
任何一條曲線,如果只看一小段的話,可以把這一小段曲線看成是一個線段。從數學上來講,一個函數在某一點到附近的另外一點,可以用一個線段來表示。附近點的值爲該點的值加上一小段線段的梯度,就得到了上式。

要使Ein(w⃗ t)+ηv⃗ TEin(w⃗ t)Ein(w⃗ t)小很多,必須ηv⃗ TEin(w⃗ t)取最小值,η是不變的,兩個向量相乘需要得到最小值,很顯然方向相反時,向量乘積取得最小值。因此v⃗ 需要和Ein(w⃗ t)方向相反,同時v⃗ 是單位向量,因此在wt點時有 

v⃗ =Ein(w⃗ t)Ein(w⃗ t)

因此有w⃗ 的更新方式爲

w⃗ t+1=w⃗ tηEin(w⃗ t)Ein(w⃗ t)

到此,梯度下降總體思想結束了。梯度下降主要有兩種方法,一種是隨機梯度下降,一種是批量梯度下降。批量梯度下降每次更新權重需要訓練完所有的數據,隨機梯度下降每次訓練完一條記錄,就可以計算對應梯度,更新權重。在實際使用中,推薦使用隨機梯度,收斂速度快。同時有關步長η的設置需要注意,設置太大會引起抖動,太小收斂速度太慢,可以採用動態的步長,比如一開始比較大,慢慢的縮小。迭代更新的停止條件從理論上來說是找不到更小的Ein(w⃗ ),在實際使用可以直接設置一個比較大的迭代次數,或者根據經驗設置一個迭代次數,一般都會收斂。當然這些都是工程上的東西了。

總結

到此基本講完了Logistic Regression大部分內容了。當時在學校學完之後怎麼也沒懂,損失函數爲什麼是這樣,爲什麼要使用隨機梯度下降等等這些問題一直沒有解決,雖然看看博客也能夠做實驗把代碼寫完(南京大學數據挖掘課程很贊啊)。最近在看林軒田老師的視頻,慢慢弄,基本搞懂了。Logistic Regression作爲常見的一類迴歸,其中的思想在很多算法中都用到。歡迎大家一起討論。

Ref: http://blog.csdn.net/joshly/article/details/50494548

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章