主要内容:
一、邏輯回歸的原理
二、極大似然估計
三、邏輯回歸的極大似然估計
四、Python中的邏輯回歸
預告:
本文将會帶領大家一步步理解邏輯回歸的原理,并且會用幾行代碼快速實現一個邏輯回歸模型訓練和預測的例子。
之後,我計劃專門用一篇文章來演示如何評估邏輯回歸模型的表現以及如何調優,這部分内容會更加偏重于實戰,感興趣的同學歡迎關注後續的更新!
目前來看,邏輯回歸這一經典算法的應用極為廣泛。如果要按照應用廣度來做個排名的話,它很可能就是一哥了。從垃圾郵件分類到廣告點擊預測,從商品推薦到信用欺詐檢測,到處都是它的身影。
它能得到如此廣泛的應用,除了其分類效果良好之外,最大的原因就是在輸出分類的結果時,它還能給出樣本屬于預測分類的概率,這就給了模型極好的解釋性。很多分類模型類似黑盒,我們隻能知道調整了某些參數之後分類效果可能明顯提升了或者下降了,但是并不清楚某一個樣本為什麼被分到了某一類,而邏輯回歸則不存在這一問題。今天我們就從理論到應用來扒掉邏輯回歸的外衣,嘿嘿。
一、邏輯回歸的原理首先,我們知道線性回歸的輸出值域為負無窮到正無窮,因此它不太适合直接應用于分類,一個很好的辦法就是通過一個函數,将大于0的值映射為1,小于0的值映射為0,這樣我們就可以達到分類的目的。
現在我們要對線性回歸的值做一個變換,即:
一種方法是令g(z)為單位階躍函數,即:
但是我們發現,它并不連續,也就不滿足單調可導的性質。因此我們找到了更好的替代品:對數幾率函數,即:
對數幾率函數的分布形态為:
可以看到,對數幾率函數是一種“Sigmoid”函數,它将z值轉化為一個接近0或1的y值,且當z值遠離0時,y值迅速靠近0或1。
如果我們将y視為樣本x作為正例的可能性,則1-y就是其作為反例的可能性,兩者的比值被稱作“幾率”(odds,又名發生比、優勢比等),反映了x作為正例的相對可能性。對數幾率則是對幾率取對數:
我們可以将(2)式中的y視為類後驗概率估計p(y=1|x),于是(2)可以重寫為:
從(1)中我們知道:
于是:
也就是說,線性函數(0)中z的值越接近正無窮,幾率就越大,樣本屬于正例的概率值就越接近1;反之,z的值越接近負無窮,樣本屬于正例的概率就越接近0。
二、極大似然估計我們用極大似然估計法(Maximum Likelihood Estimate)來估計邏輯回歸模型的參數,這裡我們有必要先簡單解釋一下極大似然估計。
極大似然估計的原理是找出與樣本分布最接近的概率分布模型,似然是指在已知結果的前提下,随機變量分布的最大可能。我們用經典的抛硬币例子來理解極大似然估計。
假如我們抛了10次硬币,其中6次為正,4次為反,那麼發生這一事件的概率為:
這裡等号右邊的部分就是似然函數,極大似然估計就是找到這樣一個P正,使得似然函數的值最大。我們用下圖來觀察随着P正取值的變化,似然函數大小的變化趨勢:
可以看到,當P正為0.6時,似然函數達到最大,因此我們估計的P正就是0.6。這就是極大似然估計的過程。
一般來說,對于參數θ和訓練數據集X,似然函數的一般形式為:
不過在實際的計算過程中,我們常對似然函數取對數,得到對數似然函數:
我們的數據集往往由大小為N的特征集X與目标集(分類變量)Y組成,因此(10)更常被寫作如下形式:
而極大似然估計的一般形式為:
三、邏輯回歸的極大似然估計
我們根據(10)來寫出邏輯回歸的對數似然函數:
其中,
可以看到,不管yi是0還是1,式(13)都成立(代入一下就知道了)。然後我們把(4)(5)代入(13),然後再整體代入(12),得到:
在最後一步,分别考慮yi=0和yi=1的情況即可得到。到了這一步以後,我們就可以通過梯度下降法、牛頓法等數值優化算法來對(14)式求解得到參數(w,b)了。關于數值優化算法這裡就不再贅述,接下來我們看一下如何在Python中完成邏輯回歸模型的訓練和預測。
四、Python中的邏輯回歸這裡我們仍然選擇經典的iris數據集(鸢尾花)來演示如何在Python中應用邏輯回歸模型。需要注意的是,雖然我們上邊演示的推導過程為二元邏輯回歸,但是其推導是可以推廣到多元邏輯回歸過程的。這裡的鸢尾花數據集中,目标變量有三種分類水平,就是一個多元邏輯回歸的例子,而強大的sklearn對于多元邏輯回歸提供了原生的支持。
from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split iris = load_iris() X = iris.data y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) logr = LogisticRegression(solver='newton-cg', multi_class='multinomial') logr.fit(X_train, y_train) y_pred = logr.predict(X_test) acc = sum(y_pred == y_test)/len(y_pred) print('準确率:{0:.2f}%'.format(acc * 100))
輸出為:
準确率:97.37%
表現還不錯哦!這隻是一個最簡單的例子,我計劃在後邊專門用一篇文章來演示如何評估邏輯回歸模型的表現以及如何調優,感興趣的同學歡迎關注哦!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!