1. 程式人生 > >線性模型之邏輯迴歸(LR)(原理、公式推導、模型對比、常見面試點)

線性模型之邏輯迴歸(LR)(原理、公式推導、模型對比、常見面試點)

參考資料(要是對於本文的理解不夠透徹,必須將以下部落格認知閱讀,方可全面瞭解LR):

(1).https://zhuanlan.zhihu.com/p/74874291

(2).邏輯迴歸與交叉熵

(3).https://www.cnblogs.com/pinard/p/6029432.html

(4).https://zhuanlan.zhihu.com/p/76563562

(5).https://www.cnblogs.com/ModifyRong/p/7739955.html

 


 

一、邏輯迴歸介紹

  邏輯迴歸(Logistic Regression)是一種廣義線性迴歸。線性迴歸解決的是迴歸問題,預測值是實數範圍,邏輯迴歸則相反,解決的是分類問題,預測值是[0,1]範圍。所以邏輯迴歸名為迴歸,實為分類。接下來讓我們用一句話來概括邏輯迴歸(LR):

邏輯迴歸假設資料服從伯努利分佈,通過極大化似然函式的方法,運用梯度下降來求解引數,來達到將資料二分類的目的。

這句話包含了五點,接下來一一介紹:

  • 邏輯迴歸的假設
  • 邏輯迴歸的損失函式
  • 邏輯迴歸的求解方法
  • 邏輯迴歸的目的
  • 邏輯迴歸如何分類

 二、邏輯迴歸的假設

任何的模型都是有自己的假設,在這個假設下模型才是適用的。邏輯迴歸的第一個基本假設是假設資料服從伯努利分佈。

伯努利分佈:是一個離散型概率分佈,若成功,則隨機變數取值1;若失敗,隨機變數取值為0。成功概率記為p,失敗為q = 1-p。

在邏輯迴歸中,既然假設了資料分佈服從伯努利分佈,那就存在一個成功和失敗,對應二分類問題就是正類和負類,那麼就應該有一個樣本為正類的概率p,和樣本為負類的概率q = 1- p。具體我們寫成這樣的形式:

邏輯迴歸的第二個假設是正類的概率由sigmoid的函式計算,即:

即:

寫在一起:

個人理解,解釋一下這個公式,並不是用了樣本的標籤y,而是說你想要得到哪個的概率,y = 1時意思就是你想得到正類的概率,y = 0時就意思是你想要得到負類的概率。另外在求引數時,這個y是有用的,這點在下面會說到。

另外關於這個值,  是個概率,還沒有到它真正能成為預測標籤的地步,更具體的過程應該是分別求出正類的概率,即y = 1時,和負類的概率,y = 0時,比較哪個大,因為兩個加起來是1,所以我們通常預設的是隻用求正類概率,只要大於0.5即可歸為正類,但這個0.5是人為規定的,如果願意的話,可以規定為大於0.6才是正類,這樣的話就算求出來正類概率是0.55,那也不能預測為正類,應該預測為負類。

 理解了二元分類迴歸的模型,接著我們就要看模型的損失函數了,我們的目標是極小化損失函式來得到對應的模型係數θ。

 三、邏輯迴歸的損失函式

 回顧下線性迴歸的損失函式,由於線性迴歸是連續的,所以可以使用模型誤差的的平方和來定義損失函式。但是邏輯迴歸不是連續的,自然線性迴歸損失函式定義的經驗就用不上了。不過我們可以用最大似然法(MLE)來推匯出我們的損失函式。有點人把LR的loss function成為log損失函式,也有人把它稱為交叉熵損失函式(Cross Entropy)。

極大似然估計:利用已知的樣本結果資訊,反推最具有可能(最大概率)導致這些樣本結果出現的模型引數值(模型已定,引數未知)

如何理解這句話呢?

再聯絡到邏輯迴歸裡,一步步來分解上面這句話,首先確定一下模型是否已定,模型就是用來預測的那個公式:

引數就是裡面的  ,那什麼是樣本結果資訊,就是我們的x,y,是我們的樣本,分別為特徵和標籤,我們的已知資訊就是在特徵取這些值的情況下,它應該屬於y類(正或負)。

反推最具有可能(最大概率)導致這些樣本結果出現的引數,舉個例子,我們已經知道了一個樣本點,是正類,那麼我們把它丟入這個模型後,它預測的結果一定得是正類啊,正類才是正確的,才是我們所期望的,我們要儘可能的讓它最大,這樣才符合我們的真實標籤。反過來一樣的,如果你丟的是負類,那這個式子計算的就是負類的概率,同樣我們要讓它最大,所以此時不用區分正負類。

這樣串下來,一切都說通了,概括一下:

一個樣本,不分正負類,丟入模型,多的不說,就是一個字,讓它大

一直只提了一個樣本,但對於整個訓練集,我們當然是期望所有樣本的概率都達到最大,也就是我們的目標函式,本身是個聯合概率,但是假設每個樣本獨立,那所有樣本的概率就可以由以下公式推到:

設:

似然函式:

為了更方便求解,我們對等式兩邊同取對數,寫成對數似然函式:

在機器學習中我們有損失函式的概念,其衡量的是模型預測錯誤的程度。如果取整個資料集上的平均對數似然損失,我們可以得到:

即在邏輯迴歸模型中,我們最大化似然函式和最小化損失函式實際上是等價的。所以說LR的loss function可以由MLE推匯出來。

 四、邏輯迴歸損失函式的求解

解邏輯迴歸的方法有非常多,主要有梯度下降和牛頓法。優化的主要目標是找到一個方向,引數朝這個方向移動之後使得損失函式的值能夠減小,這個方向往往由一階偏導或者二階偏導各種組合求得。邏輯迴歸的損失函式是:

隨機梯度下降:梯度下降是通過 J(w) 對 w 的一階導數來找下降方向,初始化引數w之後,並且以迭代的方式來更新引數,更新方式為 :

其中 k 為迭代次數。每次更新引數後,可以通過比較  小於閾值或者到達最大迭代次數來停止迭代。

梯度下降又有隨機梯度下降,批梯度下降,small batch 梯度下降三種方式:

  • 簡單來說 批梯度下降會獲得全域性最優解,缺點是在更新每個引數的時候需要遍歷所有的資料,計算量會很大,並且會有很多的冗餘計算,導致的結果是當資料量大的時候,每個引數的更新都會很慢。
  • 隨機梯度下降是以高方差頻繁更新,優點是使得sgd會跳到新的和潛在更好的區域性最優解,缺點是使得收斂到區域性最優解的過程更加的複雜。
  • 小批量梯度下降結合了sgd和batch gd的優點,每次更新的時候使用n個樣本。減少了引數更新的次數,可以達到更加穩定收斂結果,一般在深度學習當中我們採用這種方法。

加分項,看你了不瞭解諸如Adam,動量法等優化方法(在這就不展開了,以後有時間的話專門寫一篇關於優化方法的)。因為上述方法其實還有兩個致命的問題:

  • 第一個是如何對模型選擇合適的學習率。自始至終保持同樣的學習率其實不太合適。因為一開始引數剛剛開始學習的時候,此時的引數和最優解隔的比較遠,需要保持一個較大的學習率儘快逼近最優解。但是學習到後面的時候,引數和最優解已經隔的比較近了,你還保持最初的學習率,容易越過最優點,在最優點附近來回振盪,通俗一點說,就很容易學過頭了,跑偏了。
  • 第二個是如何對引數選擇合適的學習率。在實踐中,對每個引數都保持的同樣的學習率也是很不合理的。有些引數更新頻繁,那麼學習率可以適當小一點。有些引數更新緩慢,那麼學習率就應該大一點。

有關梯度下降原理以及優化演算法詳情見我的部落格:

3種類型的梯度下降演算法總結

李巨集毅機器學習筆記2:Gradient Descent(附帶詳細的原理推導過程)


 

任何模型都會面臨過擬合問題,所以我們也要對邏輯迴歸模型進行正則化考慮。常見的有L1正則化和L2正則化。

L1 正則化

LASSO 迴歸,相當於為模型添加了這樣一個先驗知識:w 服從零均值拉普拉斯分佈。 首先看看拉普拉斯分佈長什麼樣子:

由於引入了先驗知識,所以似然函式這樣寫:

取 log 再取負,得到目標函式:

等價於原始損失函式的後面加上了 L1 正則,因此 L1 正則的本質其實是為模型增加了“模型引數服從零均值拉普拉斯分佈”這一先驗知識。

L2 正則化

Ridge 迴歸,相當於為模型添加了這樣一個先驗知識:w 服從零均值正態分佈。

首先看看正態分佈長什麼樣子:

由於引入了先驗知識,所以似然函式這樣寫:

取 ln 再取負,得到目標函式:

等價於原始的損失函式後面加上了 L2 正則,因此 L2 正則的本質其實是為模型增加了“模型引數服從零均值正態分佈”這一先驗知識。

其餘有關正則化的內容詳見:L0、L1、L2範數正則化

五、邏輯迴歸的目的

 該函式的目的便是將資料二分類,提高準確率。

六、邏輯迴歸如何分類

這個在上面的時候提到了,要設定一個閾值,判斷正類概率是否大於該閾值,一般閾值是0.5,所以只用判斷正類概率是否大於0.5即可。

七、為什麼LR不使用平方誤差(MSE)當作損失函式?

1.  平方誤差損失函式加上sigmoid的函式將會是一個非凸的函式,不易求解,會得到區域性解,用對數似然函式得到高階連續可導凸函式,可以得到最優解。

2.  其次,是因為對數損失函式更新起來很快,因為只和x,y有關,和sigmoid本身的梯度無關。如果你使用平方損失函式,你會發現梯度更新的速度和sigmod函式本身的梯度是很相關的。sigmod函式在它在定義域內的梯度都不大於0.25。這樣訓練會非常的慢。

八、邏輯迴歸的優缺點

優點:

  • 形式簡單,模型的可解釋性非常好。從特徵的權重可以看到不同的特徵對最後結果的影響,某個特徵的權重值比較高,那麼這個特徵最後對結果的影響會比較大。
  • 模型效果不錯。在工程上是可以接受的(作為baseline),如果特徵工程做的好,效果不會太差,並且特徵工程可以大家並行開發,大大加快開發的速度。
  • 訓練速度較快。分類的時候,計算量僅僅只和特徵的數目相關。並且邏輯迴歸的分散式優化sgd發展比較成熟,訓練的速度可以通過堆機器進一步提高,這樣我們可以在短時間內迭代好幾個版本的模型。
  • 資源佔用小,尤其是記憶體。因為只需要儲存各個維度的特徵值。
  • 方便輸出結果調整。邏輯迴歸可以很方便的得到最後的分類結果,因為輸出的是每個樣本的概率分數,我們可以很容易的對這些概率分數進行cut off,也就是劃分閾值(大於某個閾值的是一類,小於某個閾值的是一類)。

缺點:

  • 準確率並不是很高。因為形式非常的簡單(非常類似線性模型),很難去擬合數據的真實分佈。
  • 很難處理資料不平衡的問題。舉個例子:如果我們對於一個正負樣本非常不平衡的問題比如正負樣本比 10000:1.我們把所有樣本都預測為正也能使損失函式的值比較小。但是作為一個分類器,它對正負樣本的區分能力不會很好。
  • 處理非線性資料較麻煩。邏輯迴歸在不引入其他方法的情況下,只能處理線性可分的資料,或者進一步說,處理二分類的問題 。
  • 邏輯迴歸本身無法篩選特徵。有時候,我們會用gbdt來篩選特徵,然後再上邏輯迴歸。

 


 

西瓜書中提到了如何解決LR缺點中的藍色字型所示的缺點:

 

 

 

九、與其他模型的對比

與SVM

相同點

1. 都是線性分類器。本質上都是求一個最佳分類超平面。都是監督學習演算法。
2. 都是判別模型。通過決策函式,判別輸入特徵之間的差別來進行分類。

  • 常見的判別模型有:KNN、SVM、LR。
  • 常見的生成模型有:樸素貝葉斯,隱馬爾可夫模型。

不同點

(1). 本質上是損失函式不同
LR的損失函式是交叉熵:

SVM的目標函式:

  • 邏輯迴歸基於概率理論,假設樣本為正樣本的概率可以用sigmoid函式(S型函式)來表示,然後通過極大似然估計的方法估計出引數的值。
  • 支援向量機基於幾何間隔最大化原理,認為存在最大幾何間隔的分類面為最優分類面。

(2). 兩個模型對資料和引數的敏感程度不同

  • SVM考慮分類邊界線附近的樣本(決定分類超平面的樣本)。在支援向量外新增或減少任何樣本點對分類決策面沒有任何影響;
  • LR受所有資料點的影響。直接依賴資料分佈,每個樣本點都會影響決策面的結果。如果訓練資料不同類別嚴重不平衡,則一般需要先對資料做平衡處理,讓不同類別的樣本儘量平衡。
  • LR 是引數模型,SVM 是非引數模型,引數模型的前提是假設資料服從某一分佈,該分佈由一些引數確定(比如正太分佈由均值和方差確定),在此基礎上構建的模型稱為引數模型;非引數模型對於總體的分佈不做任何假設,只是知道總體是一個隨機變數,其分佈是存在的(分佈中也可能存在引數),但是無法知道其分佈的形式,更不知道分佈的相關引數,只有在給定一些樣本的條件下,能夠依據非引數統計的方法進行推斷。

(3). SVM 基於距離分類,LR 基於概率分類。

  • SVM依賴資料表達的距離測度,所以需要對資料先做 normalization;LR不受其影響。

(4). 在解決非線性問題時,支援向量機採用核函式的機制,而LR通常不採用核函式的方法。

  • SVM演算法裡,只有少數幾個代表支援向量的樣本參與分類決策計算,也就是隻有少數幾個樣本需要參與核函式的計算。
  • LR演算法裡,每個樣本點都必須參與分類決策的計算過程,也就是說,假設我們在LR裡也運用核函式的原理,那麼每個樣本點都必須參與核計算,這帶來的計算複雜度是相當高的。尤其是資料量很大時,我們無法承受。所以,在具體應用時,LR很少運用核函式機制。

(5). 在小規模資料集上,Linear SVM要略好於LR,但差別也不是特別大,而且Linear SVM的計算複雜度受資料量限制,對海量資料LR使用更加廣泛。

(6). SVM的損失函式就自帶正則,而 LR 必須另外在損失函式之外新增正則項。

紅框內就是L2正則。

與樸素貝葉斯

相同點

樸素貝葉斯和邏輯迴歸都屬於分類模型,當樸素貝葉斯的條件概率  服從高斯分佈時,它計算出來的 P(Y=1|X) 形式跟邏輯迴歸是一樣的。

不同點

  • 邏輯迴歸是判別式模型 p(y|x),樸素貝葉斯是生成式模型 p(x,y):判別式模型估計的是條件概率分佈,給定觀測變數 x 和目標變數 y 的條件模型,由資料直接學習決策函式 y=f(x) 或者條件概率分佈 P(y|x) 作為預測的模型。判別方法關心的是對於給定的輸入 x,應該預測什麼樣的輸出 y;而生成式模型估計的是聯合概率分佈,基本思想是首先建立樣本的聯合概率概率密度模型 P(x,y),然後再得到後驗概率 P(y|x),再利用它進行分類,生成式更關心的是對於給定輸入 x 和輸出 y 的生成關係;
  • 樸素貝葉斯的前提是條件獨立,每個特徵權重獨立,所以如果資料不符合這個情況,樸素貝葉斯的分類表現就沒邏輯會好了。

十、多分類問題

參考西瓜書!!!

現實中我們經常遇到不只兩個類別的分類問題,即多分類問題,在這種情形下,我們常常運用“拆分”的策略,通過多個二分類學習器來解決多分類問題,即將多分類問題拆解為多個二分類問題,訓練出多個二分類學習器,最後將多個分類結果進行整合得出結論。最為經典的拆分策略有三種:“一對一”(OvO)、“一對其餘”(OvR)和“多對多”(MvM),核心思想與示意圖如下所示。

  • OvO:給定資料集D,假定其中有N個真實類別,將這N個類別進行兩兩配對(一個正類/一個反類),從而產生N(N-1)/2個二分類學習器,在測試階段,將新樣本放入所有的二分類學習器中測試,得出N(N-1)個結果,最終通過投票產生最終的分類結果。

  • OvM:給定資料集D,假定其中有N個真實類別,每次取出一個類作為正類,剩餘的所有類別作為一個新的反類,從而產生N個二分類學習器,在測試階段,得出N個結果,若僅有一個學習器預測為正類,則對應的類標作為最終分類結果。

  • MvM:給定資料集D,假定其中有N個真實類別,每次取若干個類作為正類,若干個類作為反類(通過ECOC碼給出,編碼),若進行了M次劃分,則生成了M個二分類學習器,在測試階段(解碼),得出M個結果組成一個新的碼,最終通過計算海明/歐式距離選擇距離最小的類別作為最終分類結果。