對數幾率回歸——Logistic Regression
1 原理
1.1 引入
首先,在引入LR(Logistic Regression)模型之前,非常重要的一個概念是,該模型在設計之初是用來解決0/1二分類問題,雖然它的名字中有回歸二字,但只是在其線性部分隱含地做了一個回歸,最終目標還是以解決分類問題為主。
為了較好地掌握 logistic regression 模型,有必要先了解線性回歸模型和梯度下降法兩個部分的內容,可參考以下兩篇文章:
線性回歸 —— Liner Regression
梯度下降法 —— 經典的優化方法
先回想一下線性回歸,線性回歸模型幫助我們用最簡單的線性方程實現了對數據的擬合,然而,這隻能完成回歸任務,無法完成分類任務,那麼 logistics regression 就是在線性回歸的基礎上添磚加瓦,構建出了一種分類模型。
如果在線性模型 () 的基礎上做分類,比如二分類任務,即
,直覺上我們會怎麼做?最直觀的,可以將線性模型的輸出值再套上一個函數,最簡單的就是「單位階躍函數」(unit-step function),如下圖中紅色線段所示。
也就是把看作為一個分割線,大於 z的判定為類別0,小於 z的判定為類別1。
但是,這樣的分段函數數學性質不太好,它既不連續也不可微。我們知道,通常在做優化任務時,目標函數最好是連續可微的。那麼如何改進呢?
這裡就用到了對數幾率函數 (形狀如圖中黑色曲線所示):
單位階躍函數與對數幾率函數(來源於周志華《機器學習》)
它是一種「Sigmoid」函數,Sigmoid 函數這個名詞是表示形式S形的函數,對數幾率函數就是其中最重要的代表。這個函數相比前面的分段函數,具有非常好的數學性質,其主要優勢如下:
使用該函數做分類問題時,不僅可以預測出類別,還能夠得到近似概率預測。這點對很多需要利用概率輔助決策的任務很有用。
對數幾率函數是任意階可導函數,它有著很好的數學性質,很多數值優化演算法都可以直接用於求取最優解。
總的來說,模型的完全形式如下:
其實,LR 模型就是在擬合這條直線,使得這條直線儘可能地將原始數據中的兩個類別正確的劃分開。
1.2 損失函數
對於任何機器學習問題,都需要先明確損失函數,LR模型也不例外,在遇到回歸問題時,通常我們會直接想到如下的損失函數形式 (平均誤差平方損失 MSE):
但在 LR 模型要解決的二分類問題中,損失函數式什麼樣的呢?先給出這個損失函數的形式,可以看一看思考一下,然後再做解釋。
這個損失函數通常稱作為對數損失 (logloss),這裡的對數底為自然對數 e,其中真實值 y是有 0/1 兩種情況,而推測值由於藉助對數幾率函數,其輸出是介於0~1之間連續概率值。仔細查看,不難發現,當真實值 y=0時,第一項為0,當真實值 y=1時,第二項為0,所以,這個損失函數其實在每次計算時永遠都只有一項在發揮作用,那這不就可以轉換為分段函數了嗎,分段的形式如下:
不難發現,當真實值 y為1時,輸出值越接近1,則 L越小,當真實值 y為 0 時,輸出值越接近於0,則 L越小 (可自己手畫一下
函數的曲線)。該分段函數整合之後就是上面我們所列出的 logloss 損失函數的形式。
1.3 優化求解
現在我們已經確定了模型的損失函數,那麼接下來就是根據這個損失函數,不斷優化模型參數從而獲得擬合數據的最佳模型。
重新看一下損失函數,其本質上是 L關於模型中線性方程部分的兩個參數 w和 b的函數:
其中,
現在的學習任務轉化為數學優化的形式即為:
由於損失函數連續可微,我們就可以藉助梯度下降法進行優化求解,對於連個核心參數的更新方式如下:
計算到這裡,很有意思的事情發生了:
計算了半天原來變得如此簡單,就是推測值和真實值 Y之間的差值,其實這也是得益於對數幾率函數本身很好的數學性質。
再接再厲,求得:
2 代碼實現
下面我們開始用 python 自己實現一個簡單的 LR 模型。
完整代碼可參考:[link]
首先,建立logistic_regression.py文件,構建 LR 模型的類,內部實現了其核心的優化函數。
然後,這裡我們創建了一個 文件,單獨用於創建模擬數據,並且內部實現了訓練/測試數據的劃分功能。
最後,創建train.py文件,調用之前自己寫的 LR 類模型實現分類任務,查看分類的精度。
輸出結果圖如下:
輸出的分類結果圖
紅色直線即為 LR 模型中的線性方程,所以本質上 LR 在做的就是不斷擬合這條紅色的分割邊界使得邊界兩側的類別正確率儘可能高。因此,LR 其實是一種線性分類器,對於輸入數據的分布為非線性複雜情況時,往往需要我們採用更複雜的模型,或者繼續在特徵工程上做文章。
GIF
∞∞∞∞∞
IT派 -
持續關注互聯網、區塊鏈、人工智慧領域
邀你加入{ IT派AI機器學習群 }
TAG:IT派 |