1. 程式人生 > >預測概率的邏輯迴歸演算法

預測概率的邏輯迴歸演算法

原創: wk  Refinitiv創新實驗室ARGO  10月1日

"本篇文章包含部分數學公式,閱讀時間約10分鐘"

曾有報道說,性感女神安吉麗娜朱莉因確認攜帶致癌基因,患乳腺癌概率為87%,所以她選擇主動切除乳腺。當時這篇報道給我的震驚在於女神的果斷,因為我們常人懷有僥倖心理,不到萬不得已絕捨不得給自己來一刀。 不過,如今我們學習機器學習,那視角就得小小切換一下:女神這 87%的患病概率是怎麼計算得來的?如果以機器學習方法來預測,該選用什麼樣的演算法? 說到概率預測,必然免不了提及今天要介紹的邏輯迴歸演算法。而事實上,邏輯迴歸演算法在醫療健康領域使用的確十分廣泛。

以一個預測心臟病的例子來開始,假設我們收集了以下資料(事實上,我們應該蒐集的正反例以及資料維度要比下圖所示的多很多。且這個例子也以心理學中A型人格的發現聞名)

 

通過這些資料,建立一個邏輯迴歸演算法預測模型。模型在通過學習完以上資料後,就能對某個未知心臟病的人員進行概率預測。比如,老張的各項指數如下

 

模型在輸入老張的各項引數以後,將預測出: 老張同志,心臟病可能性75%。是不是聽上去還有點靠譜? 那我們就來看看這個演算法是什麼原理,如何訓練並使用python實戰吧。

一  初識邏輯迴歸

邏輯迴歸是一種比較簡單的演算法。一般認為, 邏輯迴歸模型=線性迴歸+Sigmoid函式

。 所以,我們先從線性迴歸和Sigmoid函式說起,當兩者組合,就得到了邏輯迴歸的預測函式。

a 線性迴歸

先看最簡單的單變數線性迴歸預測函式,對於任意輸入的變數X, 假定Y輸出符合公式如下:

這就是我們所熟知的針對單個變數的線性迴歸模型的預測函式。如果將單變數模型擴充套件到多變數模型, 就得到多變數的線性模型預測函式:

通過訓練樣本訓練出其中的引數和b,將得到一個線性迴歸模型。但線性迴歸缺點比較明顯,比如,不適宜用於二分類問題。

那怎麼樣讓線性迴歸應用於二分類問題呢? 由此,Sigmoid函式隆重登場。

b Sigmoid函式

Sigmoid函式在機器學習中應用廣泛,除了邏輯迴歸(在邏輯迴歸裡,它叫logistic函式)以外,它還用作神經網路的激發函式。它的數學表示如下

Sigmoid函式之所以叫做Sigmoid函式,是因為它的形狀函式圖形如下圖所示,是一個苗條的'S'型。它最初被用來描述人口的增長。

它有三個典型特點:定義域;值域(0,1),符合概率的範圍 ; 函式連續且滿足,便於運算。此外,比較重要的一點是,它的函式圖形跟階躍函式相似,但又比階躍函式光滑。

c 組裝邏輯迴歸預測函式

就機器學習的常規套路而言,一個機器學習的演算法核心是定義預測函式。 通過前面介紹的線性模型和Sigmoid函式,就可以組裝得到邏輯迴歸的預測函式。 假定樣本標籤為0或1,邏輯迴歸將預測某個樣本為1(或者0)的概率, 其預測函式如下:

設 ,

由於這個函式相對簡單,複雜度低,在特徵資料維度極大、資料量極多的情形下,其他許多機器學習模型在工程效率上已經無能為力時,這個演算法還能發揮巨大的作用。所以,邏輯迴歸在CTR(廣告點選預估)以及打車價格測算上有非常大的優勢,應用也比較多。

通過以上的介紹,相信讀者對邏輯迴歸的模型有了一個初步的認識。 但是,周志華教授的西瓜書將邏輯迴歸稱之為“對數機率迴歸模型”,李航講邏輯迴歸時,又引入了“最大熵的學習模型”。這又是怎麼回事?為了更詳細的瞭解邏輯迴歸模型,我們將對邏輯迴歸進行認知升級並介紹它的代價(損失)函式。

二 邏輯迴歸認知升級

一般認為邏輯迴歸是廣義線性模型,其決策邊界(或者對於資料區域的劃分邊界,NG的圖幫我們理解決策邊界這一概念)是線性函式。


邏輯迴歸是“對數機率迴歸模型”,是廣義線性模型。雖名為迴歸,但實質上是分類,而凡是分類預測概率模型,又遵循的是“最大熵原理”。

i) 廣義線性模型

前面提到,線性模型不能很好的解決二分類問題,實際上不光是二分類問題,很多現實情況都要求輸入空間到輸出空間是非線性對映。這個時候,就需要線上性迴歸模型的預測值和真實的標記間建立一個聯絡函式(link function) g(.) 。對線性模型的輸出加上這個聯絡函式,就可以得到了一個廣義線性模型,數學表示式如下:

例如,使用“對數線性迴歸”,聯絡函式取ln(.),能看到其線性預測值與真實標記關係如下圖所示,實現了從輸入輸出的非線性轉換。

 

圖片來源:周志華的《機器學習》

因此,讀者朋友們也能想到,邏輯迴歸也屬於廣義線性模型。 但是其聯絡函式是什麼,其線性迴歸的輸出預測的又是什麼?

ii) 對數機率迴歸模型

對於二分類任務,其輸出值只有0 或者 1,我們更希望找到一個函式(g(.)的逆),將線性模型的輸入空間到輸出空間的轉換變得能像階躍函式一樣,線上性模型輸出小於0時為0,大於0時為1。是的,Sigmoid函式就十分符合這一特徵,將其帶入線性模型中,就得到了我們之前介紹的邏輯迴歸預測函式。通過將該預測函式適當的變換,得到如下公式:

對等式左邊稍做解釋:y為預測值為正樣本的概率 ,1-y為結果為負樣本的概率。預測正的概率和預測負的概率的相對比值y/(1-y),我們稱之為“機率”(odds),機率取對數稱之為“對數機率”,這就是邏輯迴歸被稱為對數機率迴歸的由來。 由此可知,對數機率函式也就是該廣義線性模型的聯絡函式。

值得一提的是,“對數機率”函式有很多良好的數學性質,尤其它是任意階可導的凸函式,在最優化演算法裡可以直接用於求解最優解。

接下來的問題便是它的代價(損失)函式和對應的引數估計求解了。我們使用最大似然估計方法作為其代價函式,其背後又離不開最大熵原理的支撐。對於一個二分類到多分類的擴充套件,我們也稍稍提及。

三 代數、引數估計和多分類問題

在對邏輯迴歸進行訓練時,一般採用“最大似然估計”對模型進行引數估計。也就是,我們認為每個樣本屬於真實標籤的概率越大越好。假定二分類有:

那麼,代價函式為對數似然函式:

引數估計於是化為對該函式求極大值問題。 因為這個函式求極值在數學上可被證明是一個凸優化問題,所以通過梯度下降或者是牛頓法一定可以取得最優解。這部分我們不詳細展開,以後會有專門的數學篇,來集中闡述凸優化問題和極值問題的求解方法。

那問題來了,為什麼在使用線性迴歸時,用最小二乘做代價函式,而在概率預測模型中,我們使用最大似然方法來做引數估計呢?除去最大似然估計的數學極值求解更容易以外,機器學習大師李航在《統計學習方法》中也提到了最大熵原理。

最大熵原理

李航說,"最大熵原理是概率模型學習的一個準則。最大熵原理認為,學習概率模型時,在所有可能的概率分佈中,熵最大的模型是最好的模型” 。通俗的講,假定一個模型預測結果是某概率函式,那麼,對其樣本按該概率函式求條件熵,條件熵最大的概率函式才是最好的函式。而李航在他的書中證明了熵公式的極大化模型等價於模型的最大似然估計。

代價函式的正則化項

邏輯迴歸也會面臨過擬合的問題,所以在訓練時,代價函式一般會加上正則項。強調正則化項的另一目的在於在本文之後介紹的sklearn引數部分,會介紹到正則項的選擇引數。對於邏輯迴歸的正則項,一般選擇L1正則項或者是L2正則項。其中,L1正則項使用絕對值,是一個不連續的函式:

L2正則項連續且加上正則項不僅連續,而且該函式求極值依然滿足凸優化條件:

此外,在介紹sklearn引數時,還會涉及到如何將一個二分類問題轉化為多分類問題,一般常見的方法的思想都是生成多個二分類器,由多個二分類器對資料進行判斷。這些方法我們不展開。同時,對應邏輯迴歸的多分類模型還有一種另外一種機器學習演算法叫Softmax演算法,邏輯迴歸模型算是該演算法二分類的特例。有興趣的讀者可以自己瞭解一下,本公眾號也會在之後推出多分類的專題文章。

四 sklearn庫邏輯迴歸引數介紹

在sklearn庫中存在有LogisticRegressionCV, LogisticRegression兩種不同的建構函式。其中,LogisticRegressionCV對資料級進行交叉驗證來設定超引數C(也就是前文所說的正則化係數λ的倒數)。而LogisticRegression需要提前設定該引數。我們主要來看LogisticRegression建構函式。

建構函式引數如下:

    logreg=linear_model.LogisticRegression(penalty='l2', 
              dual=False, tol=0.0001, C=1.0, fit_intercept=True, 
              intercept_scaling=1, class_weight=None, 
              random_state=None, solver='sag', max_iter=100, 
              multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)

引數各項意義為:

[penalty] 正則項, L1還是L2。 如果L2還是會出現過擬合,可以使用L1,L1演算法可以導致特徵的稀疏化。

[tol]  停止求解的標準,float型別,預設為1e-4。就是求解到多少的時候,停止,認為已經求出最優解。

[c] 正則化係數λ的倒數,float型別,預設為1.0。必須是正浮點型數。像SVM一樣,越小的數值表示越強的正則化。

[fit_intercept] 是否存在截距或偏差,bool型別,預設為True。

[intercept_scaling] 僅在正則化項為”liblinear”,且fit_intercept設定為True時有用。float型別,預設為1。

[class_weight] 用於標示分類模型中各種型別的權重,可以是一個字典或者’balanced’字串,預設為不輸入,也就是不考慮權重,即為None。如果選擇輸入的話,可以選擇balanced讓類庫自己計算型別權重,或者自己輸入各個型別的權重。某種型別樣本量越多,則權重越低,樣本量越少,則權重越高。權重設定在樣本誤分類影響嚴重或者是樣本高度失衡條件下需要仔細權衡該值的設定。

[random_state]  隨機數種子,int型別,可選引數,預設為無,僅在正則化優化演算法為sag,liblinear時有用

[solver] 開源實現的一些優化演算法。即newton-cg, lbfgs, liblinear, sag, saga。預設為liblinear。solver引數決定了我們對邏輯迴歸損失函式的優化方法,有四種演算法可以選擇,分別是:

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

  • lbfgs:擬牛頓法。

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

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

  • saga:線性收斂的隨機優化演算法的的變種.

liblinear適用於小資料集,而sag和saga適用於大資料集因為速度更快;對於多分類問題,只有newton-cg,sag,saga和lbfgs能夠處理多項損失;newton-cg,sag和lbfgs這三種優化演算法時都需要損失函式的一階或者二階連續導數,因此不能用於沒有連續導數的L1正則化,只能用於L2正則化。而liblinear和saga 在L1正則化和L2正則化時通用。但這幾個演算法在應用到多分類時,也會有不同的限制。

[max_iter] 演算法收斂最大迭代次數,int型別,預設為10。僅在正則化優化演算法為newton-cg, sag和lbfgs才有用,演算法收斂的最大迭代次數。

[multi_class] 分類方式選擇引數,str型別,可選引數為ovr和multinomial,預設為ovr。ovr即one-vs-rest(OvR),而multinomial即many-vs-many(MvM)。這個在多分類時需要考慮的引數,在此不詳細展開。

[verbose] 日誌冗長度,int型別。預設為0。就是不輸出訓練過程,1的時候偶爾輸出結果,大於1,對於每個子模型都輸出。

[warm_start] 熱啟動引數,bool型別。預設為False。如果為True,則下一次訓練是以追加樹的形式進行(重新使用上一次的呼叫作為初始化)。

[n_jobs] 並行數,int型別,預設為1。1的時候,用CPU的一個核心執行程式,2的時候,用CPU的2個核心執行程式。為-1的時候,用所有CPU的核心執行程式

五 總結

總之,邏輯迴歸是一個分類模型,雖然叫做“迴歸”。它本質上還是線性模型,其決策邊界是線性函式。同時邏輯迴歸的代價函式極大值因為可以化為凸優化問題,所以求解還是比較方便。邏輯迴歸的優勢在於對於需要高維度大量資料的情況下的工程效率很高,可用性強。

好了,我們今天的邏輯迴歸就介紹完了。祝大家節日快樂~ 在休假之餘給我們的公眾號提提意見,附帶轉轉我們的文章,小編的節日就更快樂啦:)

歡迎大家留言提建議,並關注我們的公眾號。