邏輯回歸
1. 邏輯回歸中的條件概率
談到分類,也許沒有比邏輯回歸更簡單的方法了,受到工業界的極大的歡迎。邏輯回歸的基本概念,以及如何一步步來構建邏輯回歸中起到最核心作用的條件概率。
邏輯回歸是二分類問題的“神器”,非常簡單和實用,是在線系統中使用率最高的模型。
二分類問題
- 預測貸款違約情況(會/不會)
- 預測廣告點擊率(會/不會)
- 情感分析(正面/負面)
- 預測疾病(陽性/陰性)
基准(Baseline)
邏輯回歸是很靠譜的基准(baseline),搭建任何分類模型時首先可以考慮邏輯回歸,之后在逐步嘗試更復雜的模型。
基准(baseline)在建模過程中非常重要。簡單來講,在設計模型的階段, 首先試圖通過簡單的方法來快速把系統搭起來, 之后逐步把模塊細化, 從而不斷得到更好的解決方案。對於分類任務, 邏輯回歸 模型可以稱得上
是最好的基准,也是比較靠譜的基准。 在實際工作中,切忌一上來就使用復雜的模型,這是不可取的。
分類問題、二分類問題
假如我們有辦法表示條件概率:P( Y=0| X ) P ( Y = 1| X ) ......
可設計分類規則:
if P( Y=0| X ) > P ( Y = 1| X ) Y = 0 else Y = 1
核心問題是: 如何通過條件概率 p(y|x) 來描述x 和 y 之間的關系。
邏輯回歸實際上是基於線性回歸模型構建起來的, 所以這里也希望通過線性回歸方程一步步來構造上述的條件概率p(y∣x)。但不能把條件概率p(y∣x)表示成 p(y|x) = wT x + b,因為右邊的式子不滿足條件概率的性質。
那么是否可以改造線性回歸 wT x + b使得它的值域映射到(0, 1)區間了? 如何把正無窮到負無窮區間的值映射到(0,1)區間? 答案就是使用邏輯函數。
有效的概率需要具備的性質
假如我們有辦法表示條件概率:P( Y=0| X ) 和 P ( Y = 1| X ) ......
上述概率需要具備的性質有:
① 0 <= P( Y=0| X ) <= 1 ② P( Y=0| X ) + P ( Y = 1| X ) = 1
0 <= P( Y=1| X ) <= 1
邏輯函數
邏輯函數的應用非常廣泛, 特別是在神經網絡中處處可見, 很大程度上是源於它不可或缺的性質:
可以把任意區間的值映射到(0, 1)區間。這樣的值既可以作為概率, 也可以作為一種權重。另外, 由於大多數模型在訓練時涉及到導數 (derivative)的計算, 同時邏輯函數的導數具有極其簡單的形態, 這也使得邏輯函
數受到了很大的歡迎。
樣本的條件概率
當把線性回歸的式子和邏輯函數拼在一起的時候, 就可以得到合理的條件概率的表達式。新的條件概率如下圖:
在 邏輯回歸中我們針對的是 二分類問題 , 所以一個樣本必須要屬於其中的某一個分類。這就意味着, 條件概率 p(y=1|x) 和 p(y=0|x) 之和一定會等於1。
對於特征向量 x 和二分類標簽y ,我們可以定義如下的條件概率:
對於邏輯回歸, 它的參數是 w, b, 前者是向量, 后者是標量。在這里, 兩個條件概率的表達式是可以替換順序的。只要能保證兩個條件概率之和等於1就可以了。
2. 邏輯回歸的目標函數
如何構造邏輯回歸模型的目標函數,它是從條件概率獲得。先理解最大似然估計,之后在最大似然的框架下試着推導出邏輯回歸的目標函數。
最大似然估計
最大似然估計(Maximum Likelihood Estimation)在機器學習建模中有着舉足輕重的作用。它可以指引我們去構造模型的目標函數, 以及求出使目標函數最大或者最小的參數值。
如何理解最大似然估計呢?
一個比較抽象的解釋是: 假如有個未知的模型(看作是黑盒子), 並且它產生了很多能觀測到的樣本。這時候, 我們便可以通過最大化這些樣本的概率反過來求出模型的最優參數, 這個過程稱之為最大似然估計。
問題:投擲硬幣
假設有一枚不均勻的硬幣,出現正面或者反面的概率是不同的,我們設定出現正面的概率為θ,我們用H來表示正面,T表示反面。當我們投擲了6次之后得到了如下的結果,而且我們假定每次投擲事件都是互相
獨立的,則 θ為多少?
D = {H, T, T, H, H, H}, θ = ? 2/3
通過最大似然估計求解參數
假設未知參數為 θ,已知的樣本為D, 最大似然估計通過最大化 P( D| θ ) 來求解未知參數。 D = {H, T, T, H, H, H}, P(H) = θ, θ = ?
邏輯回歸的似然函數
每一個樣本的似然概率
假設我們擁有數據集 D = {(xi,yi)}ni=1 , xi ∈ Rd , yi ∈ {0, 1}
對於其中的任意樣本(xi,yi),我們可以定義它的似然概率:
邏輯回歸的似然函數
對於單個樣本的 條件概率 已經定義過了, 這個概率也可以看作是似然概率。下一步得把所有的樣本全部考慮進來, 這時候我們得到的就是所有樣本的似然概率。
假設我們擁有數據集 D = {(xi,yi)}ni=1 , xi ∈ Rd , yi ∈ {0, 1}
{xi}5i=1 = {x1,x2,x3,x4,x5}
對於其中的任意樣本(xi,yi),我們可以定義似然概率
對於所有樣本的似然概率,我們可以定義為:
有了所有樣本的 似然概率 之后, 我們的目標就是要求出讓這個似然概率最大化的模型的參數( 對於邏輯回歸模型就是w, b),這個過程稱之為 最大似然估計(maximum likelihood estimation)。
邏輯回歸的最大似然估計
需要最大化目標函數:
得到了邏輯回歸的目標函數之后, 首先來做一層簡化, 就是把乘積的形式改造成加法形式。這對於后續的運算有很大的幫助。 把乘積轉換成累加之和,並改成最小化問題;
我們需要最大的目標函數,上述公式推導為:
目標函數的進一步簡化
經過一系列的簡化操作之后,發現不能繼續再簡化了。剩下的工作就是要尋找讓目標函數最小化的參數w, b。那如何求出最優解呢? 一個經典的優化算法是梯度下降法!
3. 梯度下降法
優化領域的核心內容 - 梯度下降法。幾乎所有的機器學習模型我們均可以通過梯度下降法來學出最優的參數。另外,我們試着通過梯度下降法來求解邏輯回歸的最優參數。
函數優化中常見的兩種主流方法:
- 把導數設置為0;
- 循環迭代式方法比如梯度下降法;
求函數的最大值/ 最小值
對於求解函數的最優參數, 通常有兩種簡單的方法:
- 把導數設置為0
- 基於迭代式的算法來求解, 如梯度下降法
第一種方法我們也稱之為解析解(Analytic Solution)。但這里需要注意的一點是並不是所有的目標函數都可以通過把導數設置為0的方式來求解的。一個經典的例子就是邏輯回歸的目標函數。 對於這類的問題我
們不得不采用另外一種更通用的方法-迭代式的優化算法。其中最經典的無非就是梯度下降法。
梯度下降法
梯度下降法非常實用, 幾乎所有的模型都可以使用梯度下降法來訓練。這也說明此方法是具有通用性的, 不管問題有多復雜。特別是對於深度學習, 它的作用無可替代, 我們常說的反向傳播算法 (back-
propagation)其實本質上就是梯度下降法。需要注意的一點是: 梯度下降法依賴於求導, 這也是為什么對函數的求導能力如此重要!
假設有函數f(x),求是的f(x)值最小的參數x,可根據如下梯度下降法來求解最優解x:
- 初始化x1
- for t = 1, 2, ...:
- xt + 1 = xt - η∇f(xt)
案例1:求解函數f(x) = 4x2 + 5x + 1的最小值
普通解法就是: x = - b / 2a = - 5 / 8 = - 0.625
梯度下降法: f ' (x) = 8x + 5 η = 0.1;
案例2:求解函數 f(x) = x12 + x22 的最小值? x = (x1, x2)
梯度下降解法:
- 初始化x1
- for t = 1, 2, ...:
- xt + 1 = xt - η∇f(xt)
x1w = 1,x2w = 1, η = 0.1:
fx1 ' (x) = 2x1 , f'x2 (x) = 2x2
對於梯度下降法來說, 有一個重要的參數叫作學習率(learning rate), 我們可以把它看作是可調節的參數(也稱之為超參數)。學習率對於收斂以及對最終的結果起到很重要的作用。
學習率(learning rate)的影響
對於邏輯函數的求導
梯度下降法的核心是對函數的求導。 邏輯回歸的目標函數本身具有一定的復雜度, 其中就涉及到對邏輯函數的求導過程。對邏輯函數的求導:
邏輯回歸的目標函數:
邏輯回歸的梯度下降法
對於邏輯回歸, 我們有兩組參數分別為w, b, 所以求導的關鍵也就圍繞這兩組參數。這個過程中會涉及到一些 復合函數的求導法則 。
邏輯回歸的梯度下降法 - 求解w
邏輯回歸的梯度下降法 - 求解b
有了對w, b的結果之后,最終可以寫出整個邏輯回歸的梯度下降法的過程:
梯度下降法過程中, 如何判斷迭代過程是否已經收斂 ?
- 如果在相鄰兩個時間段損失函數沒有任何變化 或者變化很小, 即可以認為優化過程已收斂
- 如果在相鄰兩個時間段參數的值沒有變化 或者變化很小, 即可以認為優化過程已收斂
當我們使用梯度下降法來求解邏輯回歸的 最優解 時, 不管怎么初始化, 結果是一樣的。主要的原因是邏輯回歸的目標函數為凸函數。
如果一個函數為 凸函數 ,它只有全局最優解 , 所以不管怎么初始化, 最后收斂到的結果是同一個點。
全局最優解 VS 局部最優解
4. 隨機梯度下降法
隨機梯度下降法以及小批量梯度下降法。這兩者均是梯度下降法的變種,適合用在數據量比較大的場景。實際上,工業界中用得最廣泛的是小批量梯度下降法。
梯度下降法的缺點
當樣本很多的時候, 每一次迭代所花費的時間成本是很高的。舉個例子, 當數據集里有一百萬個樣本的時候, 每一次的參數更新就需要循環所有的樣本並把它們的梯度做累加。
隨機梯度下降法SGD
隨機梯度下降法(SGD) 可以看作是梯度下降法的極端的情況。在梯度下降法里, 每次的參數更新依賴於所有的樣本。然而, 在隨機梯度下降法里, 每一次的迭代不再依賴於所有樣本的梯度之和, 而是僅僅依賴於其
中一個樣本的梯度 。所以這種方法的優勢很明顯, 通過很“便宜”的方式獲得梯度, 並頻繁的對參數做迭代更新, 這有助於在更短的時間內得到收斂結果。
雖然SGD用很低的成本可以更新到模型的參數,但也有自身的缺點。
由於梯度的計算僅依賴於一個樣本,計算出的結果包含較大的噪聲;實際上, SGD的收斂效率通常是更高的, 而且有些時候SGD的最后找出來的解更優質。
由於在 隨機梯度下降法中, 我們用一個樣本的 梯度 來代替所有樣本的梯度之和, 計算出來的結果包含大量噪聲,並且不太穩定。為了部分解決這個問題, 我們通常會把學習率設置為較小的值, 這樣可以有效削弱梯
度計算中帶來的不穩定性。
相比梯度下降法, 當我們使用隨機梯度下降法的時候可以看到每一次迭代之后的目標函數或者損失函數會有一些波動性。有時候的更新會帶來目標值的提升, 其他時候的更新可能反而讓目標值變得更差。但只要實
現細節合理, 大的趨勢是沿着好的方向而發展的。
小批量梯度下降法
梯度下降法和隨機梯度下降法其實可以看作是兩個極端, 前者在計算梯度時考慮所有的樣本, 后者則僅僅考慮其中的一個樣本。既然這兩個極端各有各自的優缺點,那是否可以使用一個折中的方案呢?
答案是肯定的, 這個方法叫作 小批量梯度下降法 (mini-batch gradient descent)。 它每次從樣本中選擇一部分子集,並基於這些選出來的樣本計算梯度, 並做參數的更新。
下面的代碼用來實現基於梯度下降法的邏輯回歸。如何把循環的代碼寫成矩陣、向量的形式。
比較不同的算法
對於各類梯度下降法做一個總結:
- 在工業界中,最常用的方法為小批量梯度下降法
- 小批量梯度下降法也有助於更好地利用GPU的計算能力
- 小批量梯度下降法折中了梯度下降法和隨機梯度下降法各自的優缺點,更好地解決梯度噪聲的問題,更新更加穩定。
- 隨機梯度下降法或者小批量梯度下降法有助於解決鞍點(saddle point)的問題。
三者的比較
5. 預測銀行客戶是否開設賬戶
用邏輯回歸模型來解決一個分類問題 - 預測銀行客戶是否開設賬戶。在這個過程中,會涉及到數據可視化、獨熱編碼、F1-SCORE等技術。
基於用戶的相關信息(如年齡,教育程度、婚姻狀況等)來預測是否用戶未來會有開設定期存款賬戶的需求。這種問題在銀行業務上很常見,對於銀行來講,他們希望挖掘出一些潛在的客戶,並精准地提供一些相關的服
務。 這個問題是很經典的二分類問題(預測結果為會開設或者不會開設),很適合用邏輯回歸來解決。
理解數據
理解數據是解決問題的第一步,在這里我們從多方位來理解一下數據本身的一些特點比如哪些特征具有更好地預測能力,下面給出了部分數據的快照以及字段的說明。
對於二分類問題來講,一個很重要信息是標簽數據如每個標簽的占比有多少。當一類標簽的占比明顯高於另外一類的時候,我們其實要采取一些措施的,這里包括對樣本的處理,也包括評估結果上的處理。
對於每一個特征,我們也可以做一些分析,如觀察哪些特征對最后的預測產生更重要的影響。對於這些特征的分析我們可以通過一些可視化的分析即可以得到。
特征選擇
對特征本身的重要性有大概的認知之后,我們可以選擇把那些關聯度不高的特征可以從數據中剔除掉。對於特征個數很多的數據來講,這種操作還是非常有效的。但由於目前案例的數據特征並沒有特別多,在這里先保留所有的特征。關於 特征選擇 ,其實有很多不同的方法如根據 相關性 來選擇、根據 貪心算法 來選擇、根據樹模型來選擇等等,在后續的課程里會做詳細的講解。
類別變量和獨熱編碼
對於類別型變量如本科、碩士、博士,在放到模型之前我們需要做特殊的處理,因為我們都知道模型的輸入一定是數量化的信息,那如何把“本科,碩士,博士“這些字段轉換成數量化的信號呢?
如果一個特征的值為類別型變量,”本科“, ”碩士“,”博士“,每一個值如何轉換成數字呢?
碩士大於本科, 博士大於碩士, 類似於男大於女, 或者女大於男。 從這個角度考慮,我們就不能把類別型變量直接設置為某一個具體的值, 因為這些值本身是有大小關系的。
正確的做法是把變量值轉化為獨熱編碼的形態。
獨熱編碼
對於類別型變量,正確做法是使用獨熱編碼(one-hot encoding), 這也是最常用的編碼方式。 然后直接把獨熱編碼輸入到模型就可以了。 一般來講,獨熱編碼的轉換會讓特征維度上升,比如對於一個類別型變量 - “城
市”, 可能的取值為1000多個,那當我們把這個變量轉換成獨熱編碼之后就變成了1000多維的向量。
模型的評估
對於這個案例,標簽類型的占比是很不平衡的,這種數據我們也稱之為不平衡數據(imbalanced data)。 對於不平衡數據,評估標准上也需要格外地注意,因為選錯了評估標准可能導致建模本身失去了意義。
假如我們有1000個樣本,其中990個為負樣本,10個為正樣本,最后我們以准確率來評估模型的效果。
由於負樣本很多,假如把所有的樣本分類成負樣本,准確率已經高達99%,看似訓練得很好。
在數據不平衡的場景下,准確率會失去意義。我們可以不訓練任何的模型,直接把所有的樣本分類成樣本,准確率仍然高達99%,所以這個說明不了任何問題。 在這種情況下,我們傾向於使用另外一種評估標准叫作F1-SCORE。