邏輯回歸模型是針對線性可分問題的一種易於實現而且性能優異的分類模型。
它假設數據服從伯努利分布,通過極大化似然函數的方法,運用梯度下降法來求解參數,來達到將數據二分類的目的。
算法推導
- 引入幾率比(odds):指一個事件發生的概率與不發生概率的比值。對其求log,可得:
將對數幾率記為輸入特征值的線性表達式,可得
對於某一樣本屬於特定類別的概率,為\(logit\)函數的反函數,稱為\(logistic\)函數,即\(sigmoid\)函數:
邏輯斯蒂回歸采用sigmoid函數作為激勵函數
- 邏輯斯蒂回歸模型定義:
可知,輸出\(Y=1\)的對數幾率是輸入\(x\)的線性函數。
- 對於給定的訓練數據集\(T\),可以應用極大似然估計法估計模型參數,假設模型概率分布是:
似然函數為:
對數似然函數為:
公式推導
我們使用梯度下降的思想來求解此問題,變換的表達式如下:
因為我們要使用當前的\(\theta\)值通過更新得到新的\(\theta\)值,所以我們需要知道\(\theta\)更新的方向(即當前\(\theta\)是加上一個數還是減去一個數離最終結果近),所以得到\(J(\theta)\)后對其求導便可得到更新方向,求導過程如下:
得到更新方向后便可使用下面的式子不斷迭代更新得到最終結果:
優缺點
-
邏輯斯蒂回歸模型的優點有:
- 形式簡單,模型的可解釋性非常好。從特征的權重可以看到不同的特征對最后結果的影響,某個特征的權重值比較高,那么這個特征最后對結果的影響會比較大。
- 模型效果不錯。在工程上是可以接受的(作為baseline),如果特征工程做的好,效果不會太差,並且特征工程可以大家並行開發,大大加快開發的速度。
- 訓練速度較快。分類的時候,計算量僅僅只和特征的數目相關。並且邏輯回歸的分布式優化\(sgd\)發展比較成熟,訓練的速度可以通過堆機器進一步提高,這樣我們可以在短時間內迭代好幾個版本的模型。
- 資源占用小,尤其是內存。因為只需要存儲各個維度的特征值,。
- 方便輸出結果調整。邏輯回歸可以很方便的得到最后的分類結果,因為輸出的是每個樣本的概率分數,我們可以很容易的對這些概率分數進行cutoff,也就是划分閾值(大於某個閾值的是一類,小於某個閾值的是一類)。
-
邏輯斯蒂回歸模型的缺點有:
- 准確率並不是很高。因為形式非常的簡單(非常類似線性模型),很難去擬合數據的真實分布。
- 很難處理數據不平衡的問題。舉個例子:如果我們對於一個正負樣本非常不平衡的問題比如正負樣本比 10000:1.我們把所有樣本都預測為正也能使損失函數的值比較小。但是作為一個分類器,它對正負樣本的區分能力不會很好。
- 處理非線性數據較麻煩。邏輯回歸在不引入其他方法的情況下,只能處理線性可分的數據,或者進一步說,處理二分類的問題
- 邏輯回歸本身無法篩選特征。有時候,我們會用GBDT來篩選特征,然后再上邏輯回歸。
相關問題
邏輯回歸與線性回歸區別?
本質上來說,兩者都屬於廣義線性模型,但他們兩個要解決的問題不一樣,邏輯回歸解決的是分類問題,輸出的是離散值,線性回歸解決的是回歸問題,輸出的連續值。另外,損失函數方面:線性模型是平方損失函數,而邏輯回歸則是似然函數。
LR的損失函數為什么要使用極大似然函數作為損失函數?
將極大似然函數取對數以后等同於對數損失函數。在邏輯回歸這個模型下,對數損失函數的訓練求解參數的速度是比較快的。
梯度更新速度只和\(x_{ij}\),\(y_{i}\)相關。和\(sigmod\)函數本身的梯度是無關的。這樣更新的速度是可以自始至終都比較的穩定。
為什么不選平方損失函數呢?其一是因為如果你使用平方損失函數,你會發現梯度更新的速度和\(sigmod\)函數本身的梯度是很相關的。\(sigmod\)函數在它在定義域內的梯度都不大於0.25。這樣訓練會非常的慢。另外,在使用\(sigmod\)函數作為正樣本的概率時,同時將平方損失作為損失函數,這時所構造出來的損失函數是非凸的,不容易求解,容易得到其局部最優解。
LR的損失函數為什么要使用\(sigmoid\)函數,背后的數學原理是什么?
LR假設數據服從伯努利分布,所以我們只需要知道 \(P(Y|X)\);其次我們需要一個線性模型,所以 \(P(Y|X) = f(wx)\)。接下來我們就只需要知道 \(f\) 是什么就行了。而我們可以通過最大熵原則推出的這個\(f\),就是\(sigmoid\)。
\(sigmoid\)是在伯努利分布和廣義線性模型的假設推導出來的。
為什么可以用梯度下降法?
因為邏輯回歸的損失函數\(L\)是一個連續的凸函數(conveniently convex)。這樣的函數的特征是,它只會有一個全局最優的點,不存在局部最優。對於GD跟SGD最大的潛在問題就是它們可能會陷入局部最優。然而這個問題在邏輯回歸里面就不存在了,因為它的損失函數的良好特性,導致它並不會有好幾個局部最優。當我們的GD跟SGD收斂以后,我們得到的極值點一定就是全局最優的點,因此我們可以放心地用GD跟SGD來求解。
邏輯回歸在訓練的過程當中,如果有很多的特征高度相關或者說有一個特征重復了很多遍,會造成怎樣的影響
如果在損失函數最終收斂的情況下,其實就算有很多特征高度相關也不會影響分類器的效果。 但是對特征本身來說的話,假設只有一個特征,在不考慮采樣的情況下,你現在將它重復 N 遍。訓練以后完以后,數據還是這么多,但是這個特征本身重復了 N 遍,實質上將原來的特征分成了 N 份,每一個特征都是原來特征權重值的百分之一。
為什么LR的輸入特征一般是離散的而不是連續的?
在工業界,很少直接將連續值作為邏輯回歸模型的特征輸入,而是將連續特征離散化為一系列0、1特征交給邏輯回歸模型,這樣做的優勢有以下幾點:
- 離散特征的增加和減少都很容易,易於模型的快速迭代;
- 稀疏向量內積乘法運算速度快,計算結果方便存儲,容易擴展;
- 離散化后的特征對異常數據有很強的魯棒性:比如一個特征是年齡>30是1,否則0。如果特征沒有離散化,一個異常數據“年齡300歲”會給模型造成很大的干擾;
- 邏輯回歸屬於廣義線性模型,表達能力受限;單變量離散化為N個后,每個變量有單獨的權重,相當於為模型引入了非線性,能夠提升模型表達能力,加大擬合;
- 離散化后可以進行特征交叉,由M+N個變量變為M*N個變量,進一步引入非線性,提升表達能力;
- 特征離散化后,模型會更穩定,比如如果對用戶年齡離散化,20-30作為一個區間,不會因為一個用戶年齡長了一歲就變成一個完全不同的人。當然處於區間相鄰處的樣本會剛好相反,所以怎么划分區間是門學問;
- 特征離散化以后,起到了簡化了邏輯回歸模型的作用,降低了模型過擬合的風險。
代碼見:github
sklearn源碼:sklearn
參考:
邏輯回歸 logistics regression 公式推導
邏輯回歸算法面經