0.前言
邏輯回歸(LR,Logistic Regression)是傳統機器學習中的一種分類模型,由於LR算法具有簡單、高效、易於並行且在線學習(動態擴展)的特點,在工業界具有非常廣泛的應用。
在線學習算法:LR屬於一種在線學習算法,可以利用新的數據對各個特征的權重進行更新,而不需要重新利用歷史數據訓練。
LR適用於各項廣義上的分類任務,例如:評論信息正負情感分析(二分類)、用戶點擊率(二分類)、用戶違約信息預測(二分類)、用戶等級分類(多分類 )等場景。
實際開發中,一般針對該類任務首先都會構建一個基於LR的模型作為Baseline Model,實現快速上線,然后在此基礎上結合后續業務與數據的演進,不斷的優化改進!
1.線性回歸模型(Linear Regression)
提到LR,就不得不先從線性回歸模型講起:
概念:對於多維空間中存在的樣本點,我們用特征的線性組合(特征加權)去擬合空間中點的分布和軌跡。
有監督訓練數據集(X,Y),X表示特征,Y表示標簽,w表示該某一特征對應的權重,最終的線性模型如hw(x)所示:

線性回歸模型既可以用於回歸,也可以用於分類。
- 解決回歸問題,可以用於連續目標值的預測。
- 但是針對分類問題,該方法則有點不適應,應為線性回歸的輸出值是不確定范圍的,無法很好的一一對應到我們的若干分類中。即便是一個二分類,線性回歸+閾值的方式,已經很難完成一個魯棒性很好的分類器了。

為了更好的實現分類,邏輯回歸誕生了。
[邏輯回歸是假設數據服從Bernoulli分布,因此LR屬於參數模型]
2.邏輯回歸(LR)
通過在線性回歸模型中引入Sigmoid函數,將線性回歸的不確定范圍的連續輸出值映射到(0,1)范圍內,成為一個概率預測問題。
可以把LR看作單層的神經網絡。
LR目標函數:

其中Sigmoid函數g(z)的定義如下:

Sigmoid函數的函數圖像為:

Sigmoid函數的導數形式:

整合一下,LR的單個樣本的目標函數為:

假設有n個獨立的訓練樣本{(x1, y1) ,(x2, y2),…, (xn, yn)},y={0, 1}。那每一個觀察到的樣本(xi, yi)出現的概率是:

解釋一下: 當y=1的時候,后面那一項是不是沒有了,那就只剩下x屬於1類的概率,當y=0的時候,第一項是不是沒有了,那就只剩下后面那個x屬於0的概率(1減去x屬於1的概率)。所以不管y是0還是1,上面得到的數,都是(x, y)出現的概率。

那我們的整個樣本集,也就是n個獨立的樣本出現的似然函數為(因為每個樣本都是獨立的,所以n個樣本出現的概率就是他們各自出現的概率相乘),到整個樣本的后驗概率:

其中:

通過對數進一步化簡為,最終LR的目標函數為:

2.1.如何求解模型的參數?
LR模型的數學形式確定后,剩下就是如何去求解模型中的參數。 統計學中常用的一種方法是最大似然估計(MLE),即找到一組參數,使得在這組參數下,我們的數據的似然度(概率)越大。對於該優化問題,存在多種求解方法,這里以梯度下降的為例說明。 梯度下降(Gradient Descent)又叫作最速梯度下降,是一種迭代求解的方法,通過在每一步選取使目標函數變化最快的一個方向調整參數的值來逼近最優值。

基本步驟如下:
利用鏈式法對目標函數則進行求導:

其中,一共可以分為三部分分別求導: 第一部分:

第二部分:

第三部分:

最終整體的求導形式:

模型參數的更新公式為:

沿梯度負方向選擇一個較小的步長可以保證損失函數是減小的,另一方面,邏輯回歸的損失函數是凸函數(加入正則項后是嚴格凸函數),可以保證我們找到的局部最優值同時是全局最優。

此外,常用的凸優化的方法都可以用於求解該問題。例如共軛梯度下降,牛頓法,LBFGS等。
2.2.python實現LR的核心代碼片段
# coding:utf-8 ''' Created on Oct 27, 2010 Logistic Regression Working Module @author: Peter 代碼來源:機器學習實戰-第五章的源碼片段 ''' def sigmoid(inX): return 1.0/(1+exp(-inX)) def stocGradAscent(dataMatrix, classLabels, numIter=150): m,n = shape(dataMatrix) weights = ones(n) #initialize to all ones for j in range(numIter): dataIndex = range(m) for i in range(m): alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant h = sigmoid(sum(dataMatrix[randIndex]*weights)) # 標簽的真實值-預測值 error = classLabels[randIndex] - h # 模型參數更新公式(與我們推導的形式一致) weights = weights + alpha * error * dataMatrix[randIndex] del(dataIndex[randIndex]) return weights
2.3.模型的優化-引入正則化
當模型的參數過多時,很容易遇到過擬合的問題。這時就需要有一種方法來控制模型的復雜度,典型的做法在優化目標中加入正則項,通過懲罰過大的參數來防止過擬合. 引入正則項的LR目標函數:

一般情況下,取p=1或p=2,分別對應L1,L2正則化,兩者的區別可以從下圖中看出來,L1正則化(左圖)傾向於使參數變為0,因此能產生稀疏解。

實際應用時,由於我們數據的維度可能非常高,L1正則化因為能產生稀疏解,使用的更為廣泛一些。
3.LR如何解決多分類問題?
簡言之,把Sigmoid函數換成softmax函數,即可適用於多分類的場景。 Softmax 回歸是直接對邏輯回歸在多分類的推廣,相應的模型也可以叫做多元邏輯回歸(Multinomial Logistic Regression)。 softmax函數為:

整體的目標函數:

使用softmax的多分類與使用Sigmoid的二分類有什么區別與聯系?

通過上面的推導可知,當多分類的K=2時,與使用Sigmoid的二分類是一致的。
4.LR如何解決線性不可分問題?
邏輯回歸本質上是一個線性模型,但是,這不意味着只有線性可分的數據能通過LR求解,實際上,我們可以通過2種方式幫助LR實現: (1)利用特殊核函數,對特征進行變換:把低維空間轉換到高維空間,而在低維空間不可分的數據,到高維空間中線性可分的幾率會高一些。 (2)擴展LR算法,提出FM算法。
使用核函數(特征組合映射)
針對線性不可分的數據集,可以嘗試對給定的兩個feature做一個多項式特征的映射,例如:

下面兩個圖的對比說明了線性分類曲線和非線性分類曲線(通過特征映射)

左圖是一個線性可分的數據集,右圖在原始空間中線性不可分,但是利用核函數,對特征轉換 [x1,x2]=>[x1,x2,x21,x22,x1x2]
后的空間是線性可分的,對應的原始空間中分類邊界為一條類橢圓曲線。


在LR中,我們可以通過在基本線性回歸模型的基礎上引入交叉項,來實現非線性分類,如下:

但是這種直接在交叉項xixj的前面加上交叉項系數wij的方式在稀疏數據的情況下存在一個很大的缺陷,即在對於觀察樣本中未出現交互的特征分量,不能對相應的參數進行估計。 即,在數據稀疏性普遍存在的實際應用場景中,二次項參數的訓練是很困難的。其原因是,每個參數 wij的訓練需要大量xi和 xj都非零的樣本;由於樣本數據本來就比較稀疏,滿足xi 和 xj都非零”的樣本將會非常少。訓練樣本的不足,很容易導致參數 wij 不准確,最終將嚴重影響模型的性能。
為什么特征稀疏?
one-hote編碼帶來的問題
在機器學習中,尤其是計算廣告領域,特征並不總是數值型,很多時候是分類值,對於categorical feature,通常會采用one-hot encoding轉換成數值型特征,轉化過程會產生大量稀疏數據。

可以這么理解:對於每一個特征,如果它有m個可能取值,那么經過one-hot encoding之后,就變成了m個二元特征,並且,這些特征互斥,每次只有一個激活,因此,數據會變得稀疏。
one-hot編碼帶來的另一個問題是特征空間變大。同樣以上面淘寶上的item為例,將item進行one-hot編碼以后,樣本空間有一個categorical變為了百萬維的數值特征,特征空間一下子暴增一百萬。所以大廠動不動上億維度,就是這么來的。
在工業界,很少直接將連續值(eg.年齡特征)作為邏輯回歸模型的特征輸入,而是將連續特征離散化為一系列0、1特征交給LR。
LR為什么要對連續數值特征進行離散化?
- 離散特征的增加和減少都很容易,易於模型的快速迭代;
- 稀疏向量內積乘法運算速度快,計算結果方便存儲,容易擴展;
- 離散化后的特征對異常數據有很強的魯棒性:比如一個特征是年齡>30是1,否則0。如果特征沒有離散化,一個異常數據“年齡300歲”會給模型造成很大的干擾;
- 邏輯回歸屬於廣義線性模型,表達能力受限;單變量離散化為N個后,每個變量有單獨的權重,相當於為模型引入了非線性,能夠提升模型表達能力,加大擬合;
- 離散化后可以進行特征交叉,由M+N個變量變為M*N個變量,進一步引入非線性,提升表達能力;
- 特征離散化后,模型會更穩定,比如如果對用戶年齡離散化,20-30作為一個區間,不會因為一個用戶年齡長了一歲就變成一個完全不同的人。當然處於區間相鄰處的樣本會剛好相反,所以怎么划分區間是門學問;
- 特征離散化以后,起到了簡化了邏輯回歸模型的作用,降低了模型過擬合的風險。 李沐曾經說過:模型是使用離散特征還是連續特征,其實是一個“海量離散特征+簡單模型” 同 “少量連續特征+復雜模型”的權衡。既可以離散化用線性模型,也可以用連續特征加深度學習。就看是喜歡折騰特征還是折騰模型了。通常來說,前者容易,而且可以n個人一起並行做,有成功經驗;后者目前看很贊,能走多遠還須拭目以待。
使用FM模型
另一種方法是對LR進行擴展,因子分解機(Factorization Machine,FM)是對LR算法的擴展。FM模型是一種基於矩陣分解的機器學習模型,對於稀疏數據具有很好的學習能力; 對於因子分解機FM來說,最大的特點是對於稀疏的數據具有很好的學習能力。 FM解決了LR泛化能力弱的問題,其目標函數如下所示:



上面兩張精簡的PPT來自於新浪微博AI-Lab的張俊林老師的技術分享。
后續有時間繼續從FM-->FFM開始寫
5.面試常問題:
針對學生黨的福利時刻,自己記錄的幾個有關LR的面試題:
LR與SVM的聯系與區別:
聯系: 1、LR和SVM都可以處理分類問題,且一般都用於處理線性二分類問題(在改進的情況下可以處理多分類問題) 2、兩個方法都可以增加不同的正則化項,如l1、l2等等。所以在很多實驗中,兩種算法的結果是很接近的。 區別: 1、LR是參數模型[邏輯回歸是假設y服從Bernoulli分布],SVM是非參數模型,LR對異常值更敏感。 2、從目標函數來看,區別在於邏輯回歸采用的是logistical loss,SVM采用的是hinge loss,這兩個損失函數的目的都是增加對分類影響較大的數據點的權重,減少與分類關系較小的數據點的權重。 3、SVM的處理方法是只考慮support vectors,也就是和分類最相關的少數點,去學習分類器。而邏輯回歸通過非線性映射,大大減小了離分類平面較遠的點的權重,相對提升了與分類最相關的數據點的權重。 4、邏輯回歸相對來說模型更簡單,好理解,特別是大規模線性分類時比較方便。而SVM的理解和優化相對來說復雜一些,SVM轉化為對偶問題后,分類只需要計算與少數幾個支持向量的距離,這個在進行復雜核函數計算時優勢很明顯,能夠大大簡化模型和計算。 5、logic 能做的 svm能做,但可能在准確率上有問題,svm能做的logic有的做不了。
如何選擇LR與SVM?
非線性分類器,低維空間可能很多特征都跑到一起了,導致線性不可分。
- 如果Feature的數量很大,跟樣本數量差不多,這時候選用LR或者是Linear Kernel的SVM
- 如果Feature的數量比較小,樣本數量一般,不算大也不算小,選用SVM+Gaussian Kernel
- 如果Feature的數量比較小,而樣本數量很多,需要手工添加一些feature變成第一種情況。 模型復雜度:SVM支持核函數,可處理線性非線性問題;LR模型簡單,訓練速度快,適合處理線性問題;決策樹容易過擬合,需要進行剪枝 損失函數:SVM hinge loss; LR L2正則化; adaboost 指數損失 數據敏感度:SVM添加容忍度對outlier不敏感,只關心支持向量,且需要先做歸一化; LR對遠點敏感 數據量:數據量大就用LR,數據量小且特征少就用SVM非線性核
什么是參數模型(LR)與非參數模型(SVM)?
在統計學中,參數模型通常假設總體(隨機變量)服從某一個分布,該分布由一些參數確定(比如正太分布由均值和方差確定),在此基礎上構建的模型稱為參數模型;非參數模型對於總體的分布不做任何假設,只是知道總體是一個隨機變量,其分布是存在的(分布中也可能存在參數),但是無法知道其分布的形式,更不知道分布的相關參數,只有在給定一些樣本的條件下,能夠依據非參數統計的方法進行推斷。