機器學習演算法:邏輯回歸

機器學習演算法:邏輯回歸

來自專欄機器學習理論

邏輯回歸(Logistic Regression,簡稱LR模型)是一個分類演算法,它可以處理二分類以及多分類。我們知道,線性回歸的模型是求出輸出特徵向量 Y 和輸入樣本矩陣 X 之間的線性關係係數 	heta ,滿足 Y=X	heta 。此時我們的 Y 是連續的,所以是回歸模型。如果我們想要 Y 是離散的話,怎麼辦呢?一個可以想到的辦法是,我們對於這個 Y 再做一次函數轉換,變為 g(Y) 。如果我們令 g(Y) 的值在某個實數區間的時候是類別A,在另一個實數區間的時候是類別B,以此類推,就得到了一個分類模型。邏輯回歸的出發點就是從這來的。

1. 邏輯回歸模型

我們提到對線性回歸的結果做一個在函數 g 上的轉換,可以變化為邏輯回歸。這個函數 g 在邏輯回歸中我們一般取為sigmoid函數,形式如下:

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

函數作圖如下:

z 趨於正無窮時, g(z) 趨於1,而當 z 趨於負無窮時, g(z) 趨於0,這非常適合於我們的分類概率模型。

另外,它還有一個很好的導數性質:

egin{aligned} g^{}(z) &=left(frac{1}{1+e^{-z}}
ight)^{}=frac{e^{-z}}{(1+e^{-z})^2}\ &=frac{1}{1+e^{-z}} cdot left(1-frac{1}{1+e^{-z}}
ight)\ &=g(z)(1-g(z)) end{aligned}

z=	heta^Tx ,這樣就得到了邏輯回歸模型的一般形式:

h_	heta(x)=frac{1}{1+e^{-	heta^Tx}}

 其中 x 為樣本輸入, h_	heta(x) 為模型輸出,可以理解為某一分類的概率大小,假定 h_	heta(x) 作為事件結果 y=1 的概率取值, 1-h_	heta(x) 作為事件結果 y=0 的概率取值。而 	heta 為分類模型的要求出的模型參數。

2. 邏輯回歸的目標函數

按照前面邏輯回歸的定義,假設我們的樣本輸出是0或者1兩類。那麼我們有:

p(y=1|x;	heta)=h_	heta(x)\ p(y=0|x;	heta)=1-h_	heta(x)

把這兩個式子寫成一個式子,就是:

p(y|x;	heta)=h_	heta(x)^y(1-h_	heta(x))^{1-y}

得到了 y 的概率分布函數表達式,我們就可以通過極大似然估計求解模型參數 	heta

似然函數表達式如下:

egin{aligned} L(	heta)&=p(Y|X;	heta)\ &=prod_{i=1}^{m}p(y^{(i)}|x^{(i)};	heta)\ &=prod_{i=1}^{m}left(h_	heta(x^{(i)})
ight)^{y^{(i)}}left(1-h_	heta(x^{(i)})
ight)^{1-y^{(i)}} end{aligned}

對數似然函數表達式如下:

egin{aligned} l(	heta)&=log L(	heta)\ &=sum_{i=1}^{m}{y^{(i)}log h_	heta(x^{(i)})+left(1-y^{(i)}
ight)logleft(1-h_	heta(x^{(i)})
ight)} end{aligned}

對數似然函數取反,即損失函數表達式為:

egin{aligned} J(	heta)&=-log L(	heta)\ &=-sum_{i=1}^{m}left( {y^{(i)}log h_	heta(x^{(i)})+left(1-y^{(i)}
ight)logleft(1-h_	heta(x^{(i)})
ight)}
ight) end{aligned}

3. 邏輯回歸的目標函數的優化

這裡採用梯度下降法對目標函數優化,先不考慮累加和,我們針對每一個參數 	heta_j 求偏導:

egin{aligned} frac{partial l(	heta)}{partial 	heta_j}&=sum_{i=1}^{m}{left(frac{y^{(i)}}{h_	heta(x^{(i)})}-frac{1-y^{(i)}}{1-h_	heta(x^{(i)})}
ight)frac{partial h_	heta(x^{(i)})}{partial 	heta_j}}\ &=sum_{i=1}^{m}{left(frac{y^{(i)}}{h_	heta(x^{(i)})}-frac{1-y^{(i)}}{1-h_	heta(x^{(i)})}
ight) h_	heta(x^{(i)})(1-h_	heta(x^{(i)})) frac{partial 	heta^Tx^{(i)}}{partial 	heta_j}} \ &=sum_{i=1}^{m}{left(y^{(i)}(1-h_	heta(x^{(i)}))-(1-y^{(i)})h_	heta(x^{(i)})
ight)x_j^{(i)}} \ &=sum_{i=1}^{m}{left(y^{(i)}-h_	heta(x^{(i)})
ight)x_j^{(i)}} end{aligned}

最後,通過掃描樣本,迭代下述公式可求得參數:

	heta_j:=	heta_j+alpha left(y^{(i)}-h_	heta(x^{(i)})
ight)x_j^{(i)}

比較上面的結果和線性回歸的結果,它們具有相同的形式。

4. 分類邊界

知道如何求解參數後,我們看一下模型得到的最後結果是什麼樣的。

假設我們的決策函數為: y^*=1,  if  p(y=1|x)>0.5

選擇0.5作為閾值是一個一般的做法,實際應用時特定的情況可以選擇不同閾值,如果對正例的判別準確性要求高,可以選擇閾值大一些,對正例的召回要求高,則可以選擇閾值小一些。

很容易看出,當 	heta^Tx>0 時, y=1 ,否則 y=0	heta^Tx=0 是模型隱含的分類平面(在高維空間中,我們說是超平面)。所以說邏輯回歸本質上是一個線性模型,但是這不意味著只有線性可分的數據能通過LR求解,實際上,我們可以通過特徵變換的方式把低維空間轉換到高維空間(kernel trick),而在低維空間不可分的數據,到高維空間中線性可分的幾率會高一些。

5. 對數幾率

邏輯回歸模型還可以從對數幾率的角度來理解。

一個事件發生的幾率(odds)是指該事件發生的概率與該事件不發生的概率的比值。如果事件發生的概率是 p ,那麼該事件的幾率為 frac{p}{1-p} ,該事件的對數幾率(log odds)或logit函數是: logit  (p)=logfrac{p}{1-p}

對LR而言,根據模型表達式可以得到: logit  (p)=log frac{p}{1-p}=log frac{h_	heta(x)}{1-h_	heta(x)}=	heta^Tx

即在LR模型中,輸出 y=1 的對數幾率是輸入 x 的線性函數。或者說輸出 y=1 的對數幾率是由輸入 x 的線性函數表示的模型,即LR模型。

6. 多元邏輯回歸:Softmax回歸

如果 y 不是在 [0,1] 中取值,而是在 K 個類別中取值,這時問題就變為一個多分類問題。有兩種方式可以出處理該類問題:一種是我們對每個類別訓練一個二元分類器(One-vs-all),當 K 個類別不是互斥的時候,比如用戶會購買哪種品類,這種方法是合適的。

如果 K 個類別是互斥的,即 y=i 的時候意味著 y 不能取其他的值,比如用戶的年齡段,這種情況下 Softmax 回歸更合適一些。

Softmax 回歸是直接對邏輯回歸在多分類的推廣,相應的模型也可以叫做多元邏輯回歸(Multinomial Logistic Regression)。模型通過 softmax 函數來對概率建模, k 分類,第 k 類的參數為 	heta_k ,組成二維矩陣 	heta_{k	imes n} ,具體形式如下: p(c=k|x;	heta)=frac{e^{	heta_k^Tx}}{sum_{l=1}^{K}{e^{	heta_l^Tx}}},k=1,2,cdotcdotcdot,K

似然函數: egin{aligned} L(	heta)&=prod_{i=1}^{m}prod_{k=1}^{K}p(c=k|x^{(i)};	heta)^{y_k^{(i)}}\ &=prod_{i=1}^{m}prod_{k=1}^{K}left(frac{e^{	heta_k^Tx^{(i)}}}{sum_{l=1}^{K}{e^{	heta_l^Tx^{(i)}}}}
ight)^{y_k^{(i)}} end{aligned}

對數似然:

J_m(	heta)=ln L(	heta)=sum_{i=1}^{m}sum_{k=1}^{K}y_k^{(i)}left(	heta_k^Tx^{(i)}-ln sum_{l=1}^{K}{e^{	heta_l^Tx^{(i)}}}
ight)

對於單個樣本: J(	heta)=sum_{k=1}^{K}y_kleft(	heta_k^Tx-ln sum_{l=1}^{K}{e^{	heta_l^Tx}}
ight)

隨機梯度: frac{partial J(	heta)}{partial 	heta_k}=(y_k-p(y_k|x;	heta))x

7. scikit-learn邏輯回歸類庫使用方法

在scikit-learn中,與邏輯回歸有關的主要是這3個類。LogisticRegression, LogisticRegressionCV 和logistic_regression_path。其中LogisticRegression和LogisticRegressionCV的主要區別是LogisticRegressionCV使用了交叉驗證來選擇正則化係數C。而LogisticRegression需要自己每次指定一個正則化係數。除了交叉驗證,以及選擇正則化係數C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。

logistic_regression_path類則比較特殊,它擬合數據後,不能直接來做預測,只能為擬合數據選擇合適邏輯回歸的係數和正則化係數。主要是用在模型選擇的時候。一般情況用不到這個類,所以後面不再講述logistic_regression_path類。

此外,scikit-learn裡面有個容易讓人誤解的類RandomizedLogisticRegression,雖然名字里有邏輯回歸的詞,但是主要是用L1正則化的邏輯回歸來做特徵選擇的,屬於維度規約的演算法類,不屬於我們常說的分類演算法的範疇。

正則化選擇參數:penalty

LogisticRegression和LogisticRegressionCV默認就帶了正則化項。penalty參數可選擇的值為"l1"和"l2".分別對應L1的正則化和L2的正則化,默認是L2的正則化。

在調參時如果我們主要的目的只是為了解決過擬合,一般penalty選擇L2正則化就夠了。但是如果選擇L2正則化發現還是過擬合,即預測效果差的時候,就可以考慮L1正則化。另外,如果模型的特徵非常多,我們希望一些不重要的特徵係數歸零,從而讓模型係數稀疏化的話,也可以使用L1正則化。

penalty參數的選擇會影響我們損失函數優化演算法的選擇。即參數solver的選擇,如果是L2正則化,那麼4種可選的演算法{『newton-cg』, 『lbfgs』, 『liblinear』, 『sag』}都可以選擇。但是如果penalty是L1正則化的話,就只能選擇『liblinear』了。這是因為L1正則化的損失函數不是連續可導的,而{『newton-cg』, 『lbfgs』,『sag』}這三種優化演算法時都需要損失函數的一階或者二階連續導數。而『liblinear』並沒有這個依賴。

優化演算法選擇參數:solver

solver參數決定了我們對邏輯回歸損失函數的優化方法,有4種演算法可以選擇,分別是:

a) liblinear:使用了開源的liblinear庫實現,內部使用了坐標軸下降法來迭代優化損失函數。

b) lbfgs:擬牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。

c) newton-cg:也是牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來迭代優化損失函數。

d) sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合於樣本數據多的時候。

從上面的描述可以看出,newton-cg, lbfgs和sag這三種優化演算法時都需要損失函數的一階或者二階連續導數,因此不能用於沒有連續導數的L1正則化,只能用於L2正則化。而liblinear通吃L1正則化和L2正則化。

同時,sag每次僅僅使用了部分樣本進行梯度迭代,所以當樣本量少的時候不要選擇它,而如果樣本量非常大,比如大於10萬,sag是第一選擇。但是sag不能用於L1正則化,所以當你有大量的樣本,又需要L1正則化的話就要自己做取捨了。要麼通過對樣本採樣來降低樣本量,要麼回到L2正則化。

從上面的描述,大家可能覺得,既然newton-cg, lbfgs和sag這麼多限制,如果不是大樣本,我們選擇liblinear不就行了嘛!錯,因為liblinear也有自己的弱點!我們知道,邏輯回歸有二元邏輯回歸和多元邏輯回歸。對於多元邏輯回歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對準確一些。鬱悶的是liblinear只支持OvR,不支持MvM,這樣如果我們需要相對精確的多元邏輯回歸時,就不能選擇liblinear了。也意味著如果我們需要相對精確的多元邏輯回歸不能使用L1正則化了。

分類方式選擇參數:multi_class

multi_class參數決定了我們分類方式的選擇,有 ovr和multinomial兩個值可以選擇,默認是 ovr。

ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元邏輯回歸,ovr和multinomial並沒有任何區別,區別主要在多元邏輯回歸上。

OvR的思想很簡單,無論你是多少元邏輯回歸,我們都可以看做二元邏輯回歸。具體做法是,對於第K類的分類決策,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負例,然後在上面做二元邏輯回歸,得到第K類的分類模型。其他類的分類模型獲得以此類推。

而MvM則相對複雜,這裡舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類,我們每次在所有的T類樣本裡面選擇兩類樣本出來,不妨記為T1類和T2類,把所有的輸出為T1和T2的樣本放在一起,把T1作為正例,T2作為負例,進行二元邏輯回歸,得到模型參數。我們一共需要T(T-1)/2次分類。

從上面的描述可以看出OvR相對簡單,但分類效果相對略差(這裡指大多數樣本分布情況,某些樣本分布下OvR可能更好)。而MvM分類相對精確,但是分類速度沒有OvR快。

如果選擇了ovr,則4種損失函數的優化方法liblinear,newton-cg, lbfgs和sag都可以選擇。但是如果選擇了multinomial,則只能選擇newton-cg, lbfgs和sag了。

類型權重參數: class_weight

class_weight參數用於標示分類模型中各種類型的權重,可以不輸入,即不考慮權重,或者說所有類型的權重一樣。如果選擇輸入的話,可以選擇balanced讓類庫自己計算類型權重,或者我們自己輸入各個類型的權重,比如對於0,1的二元模型,我們可以定義class_weight={0:0.9, 1:0.1},這樣類型0的權重為90%,而類型1的權重為10%。

如果class_weight選擇balanced,那麼類庫會根據訓練樣本量來計算權重。某種類型樣本量越多,則權重越低,樣本量越少,則權重越高。

那麼class_weight有什麼作用呢?在分類模型中,我們經常會遇到兩類問題:

第一種是誤分類的代價很高。比如對合法用戶和非法用戶進行分類,將非法用戶分類為合法用戶的代價很高,我們寧願將合法用戶分類為非法用戶,這時可以人工再甄別,但是卻不願將非法用戶分類為合法用戶。這時,我們可以適當提高非法用戶的權重。

第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數據10000條,裡面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權重,則我們可以將所有的測試集都預測為合法用戶,這樣預測準確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced,讓類庫自動提高非法用戶樣本的權重。

提高了某種分類的權重,相比不考慮權重,會有更多的樣本分類劃分到高權重的類別,從而可以解決上面兩類問題。

當然,對於第二種樣本失衡的情況,我們還可以考慮使用樣本權重參數: sample_weight,而不使用class_weight。

樣本權重參數: sample_weight

前面我們提到了樣本不失衡的問題,由於樣本不平衡,導致樣本不是總體樣本的無偏估計,從而可能導致我們的模型預測能力下降。遇到這種情況,我們可以通過調節樣本權重來嘗試解決這個問題。調節樣本權重的方法有兩種,第一種是在class_weight使用balanced。第二種是在調用fit函數時,通過sample_weight來自己調節每個樣本權重。

在scikit-learn做邏輯回歸時,如果上面兩種方法都用到了,那麼樣本的真正權重是class_weight*sample_weight.

以上就是scikit-learn中邏輯回歸類庫調參的一個小結,還有些參數比如正則化參數C(交叉驗證就是 Cs),迭代次數max_iter等,由於和其它的演算法類庫並沒有特別不同,這裡不多累述了。

本文摘自:

1. 邏輯回歸原理小結

2. 機器學習演算法系列(3):邏輯斯諦回歸

3. scikit-learn 邏輯回歸類庫使用小結

推薦閱讀:

機器學習概述與演算法介紹
重拾基礎 - Word2Vec
【讀論文】Neural Episodic Control
集成模型之隨機森林(二)
吳恩達機器學習第三周課後感

TAG:機器學習 | 邏輯回歸 |