Logistic回归公式推导和代码实现和Python中的sklearn.linear_model.LogisticRegression 的参数
1,引言
logistic回歸是機器學習中最常用最經典的分類方法之一,有人稱之為邏輯回歸或者邏輯斯蒂回歸。雖然他稱為回歸模型,但是卻處理的是分類問題,這主要是因為它的本質是一個線性模型加上一個映射函數Sigmoid,將線性模型得到的連續結果映射到離散型上。它常用于二分類問題,在多分類問題的推廣叫softmax。
本文首先闡述Logistic回歸的定義,然后介紹一些最優化算法,其中包括基本的梯度上升法和一個改進的隨機梯度上升法,這些最優化算法將用于分類器的訓練,最好本文將給出一個Logistic回歸的實例,預測一匹病馬是否能被治愈。
在我們的日常生活中遇到過很多最優化問題,比如如何在最短時間內從A點到達B點?如何投入最少工作量卻獲得最大的效益?如何設計發動機使得油耗最少而功率最大?可見,最優化的作用十分強大,所以此處我們介紹幾個最優化算法,并利用它們訓練出一個非線性函數用于分類。
現在假設有一些數據點,我們用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個擬合過程就稱作回歸。利用logistic回歸進行分類的主要思想是:根據現有數據對分類邊界線建立回歸公式,以此進行分類,這里的“回歸”一詞源于最佳擬合,表示要找到最佳擬合參數集。訓練分類器時的做法就是尋找最佳擬合參數,使用的是最優化算法,下面我們首先介紹一下這個二值型輸出分類器的數學原理。
那么邏輯回歸與線性回歸是什么關系呢?
邏輯回歸(Logistic Regression)與線性回歸(Linear Regression)都是一種廣義線性模型(generalized linear model)。邏輯回歸假設因變量 y 服從伯努利分布,而線性回歸假設因變量 y 服從高斯分布。 因此與線性回歸有很多相同之處,去除Sigmoid映射函數的話,邏輯回歸算法就是一個線性回歸。可以說,邏輯回歸是以線性回歸為理論支持的,但是邏輯回歸通過Sigmoid函數引入了非線性因素,因此可以輕松處理0/1分類問題。
2,Logistic回歸的一般過程
-
(1)收集數據:采用任意方法收集數據
-
(2)準備數據:由于需要進行距離計算,因此要求數據類型為數值型。另外,結構化數據格式則最佳
-
(3)分析數據:采用任意方法對數據進行分析
-
(4)訓練算法:大部分時間將用于訓練,訓練的目的是為了找到最佳的分類回歸系數
-
(5)使用算法:首先,我們需要輸入一些數據,并將其轉換成對應的結構化數值;接著,基于訓練好的回歸系數就可以對這些數值進行簡單的回歸計算,判定他們屬于哪個類別;在這之后,我們就可以在輸出的類別上做一些其他分析工作。
3,Logistic回歸的優缺點
**優點:**計算代碼不多,易于理解和實現,計算代價不高,速度快,存儲資源低
**缺點:**容易欠擬合,分類精度可能不高
**適用數據類型:**數值型和標稱型數據
4,基于Logistic回歸和Sigmoid函數的分類
**我們想要的函數應該是:能接受所有的輸入,然后預測出類型。**例如,在兩個類的情況下,上述函數輸出0或1。該函數稱為海維賽德階躍函數(Heaviside step function),或者直接稱為單位階躍函數。然而,海維賽德階躍函數的問題在于:該函數在跳躍點上從0瞬間跳躍到1,這個瞬間跳躍過程有時很難處理。幸好,另一個函數也有類似的性質(可以輸出0或者1),且數學上更易處理,這就是Sigmoid函數。Sigmoid函數具體的計算公式如下:
自變量取值為任意實數,值域[0, 1]
圖5-1給出了Sigmoid函數在不同坐標尺度下的兩條曲線圖。當x為0時,Sigmoid函數值為0.5。隨著x的增大,對應的Sigmoid值將逼近于1;而隨著x的減少,Sigmoid值將逼近于0.如果橫坐標刻度足夠大,Sigmoid函數看起來很像一個階躍函數。
**解釋Sigmoid函數:**將任意的輸入映射到了 [0, 1]區間,我們在線性回歸中可以得到一個預測值,再將該值映射到 Sigmoid函數中這樣就完成了由值到概率的轉換,也就是分類任務。
因此,為了實現Logistic回歸分類器,我們可以在每個特征上都乘以一個回歸系數,然后把所有的結果值相加,將這個總和帶入Sigmoid函數中,進而得到一個范圍在0~1之間的數值。任何大于0.5的數據被分入1類,小于0.5即被歸入0類,所以,Logistic回歸也可以被看成是一種概率估計。
確定了分類器的函數形式之后,現在的問題變成了:最佳回歸系數是多少?如何確定其大小。
5,基于最優化方法的最佳回歸系數確定
Sigmoid函數的輸入記為z,由下面公式得到:
如果采用向量的寫法,上述公式可以寫成 z = wTx ,它表示將這兩個數值向量對應元素相乘,然后全部加起來即得到z值。
其中的向量x是分類器的輸入數據,向量w也就是我們要找到的最佳參數(系數),從而使得分類器盡可能的準確,為了尋找該最佳參數,需要用到最優化理論的一些知識。
然后再看看我們的Logistic回歸模型的公式:
這里假設 W>0,Y與X各維度疊加的圖形關系,如下圖所示(x為了方便取1維):
下面首先學習梯度上升的最優化方法,我們將學習到如何使用該方法求得數據集的最佳參數,接下來,展示如何繪制梯度上升法產生的決策邊界圖,該圖將梯度上升法的分類效果可視化的呈現出來,最后我們將學習隨機梯度上升算法,以及如何對其進行修改以獲得很好地結果。
- 可能我們最常聽到的是梯度下降算法,它與這里的梯度上升算法是一樣的,只是公式中的加法需要變成減法,梯度上升算法用來求函數的最大值,而梯度下降算法是用來求函數的最小值
6,梯度上升法
梯度上升法基于的思想是:要找到某函數的最大值,最好的方法是沿著該函數的梯度方向探尋,如果梯度記為,則函數 f(x,y) 的梯度由下面式子表示:
這個梯度意味著要沿著x的方向移動
,沿著y方向移動
,其中函數f(x,y)必須要在待計算的點上有定義并且可微,一個具體的函數例子見圖5-2:
上圖中的梯度上升算法沿梯度方向移動了一步,可以看出,梯度算子總是指向函數值增長最快的方向。這里所說的移動方向,而未提到移動量的大小。該量值稱為步長,記為。用向量來表示的話,梯度算法的迭代公式如下:
該公式將一直被迭代執行,直至達到某個停止條件為止,比如迭代次數達到某個指定值或算法達到某個可以允許的誤差范圍。
基于上面的內容,我們來看一個Logistic回歸分類器的應用例子,從圖5-3可以看到我們采用的數據集。
梯度上升法的公式推導(LR 損失函數)
在LR中,應用極大似然估計法估計模型參數,由于Sigmoid函數的特性,我們可以做如下的假設:
上式即為在已知樣本X和參數θ的情況下。樣本X屬性正類(y=1)和負類(y=0)的條件概率,將兩個公式合并成一個,如下:
假定樣本與樣本之間相互獨立,那么整個樣本集生成的概率即為所有樣本生成概率的乘積(也就是n個獨立樣本出現的似然函數如下):
為了簡化問題,我們對整個表達式求對數(即為LR 損失函數):
滿足似然函數(θ)的最大的θ值即時我們需要求解的模型。
那么梯度上升法就像爬坡一樣,一點一點逼近極值,而上升這個動作用數學公式表達即為:
其中,α 為步長。
回到Logistic回歸問題,我們同樣對函數求偏導。
對這個公式進行分解,先看:
我們可以看到,對函數求偏導,分解為三部分,然后我們對這三部分分布求導。
其中:
再由:
可得:
接下來:
最后:
綜合三部分即得到:
如果上面鏈式分解不好理解的話,可以看下面直接求導(結果是一樣的):
注意上面是將梯度上升求最大值,轉換為梯度下降了,本質沒變。
因此梯度迭代公式為:
如果為梯度下降,我們注意符號的變化,如下:
7,訓練算法:使用梯度上升找到最佳參數
上圖有100個樣本點,每個點包含兩個數值型特征:X1和X2,在此數據集上,我們將通過使用梯度上升法找到最佳回歸系數,也就是擬合出Logistic回歸模型的最佳參數。
所以我們的目標:建立分類器,求解出theta參數
設定閾值,根據閾值判斷結果
8 Python中的sklearn.linear_model.LogisticRegression
sklearn.linear_model.LogisticRegression官方API:http://scikitlearn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
class sklearn.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='liblinear', max_iter=100, multi_class='ovr', verbose=0,warm_start=False, n_jobs=1)ogistic回歸(aka logit,MaxEnt)分類器。
在多類情況下,如果將“ multi_class”選項設置為“ ovr”,則訓練算法將使用“一對多休息”(OvR)方案;如果將“ multi_class”選項設置為“多項式”,則使用交叉熵損失’。(當前,只有“ lbfgs”,“ sag”,“ saga”和“ newton-cg”求解器支持“多項式”選項。)
該類使用“ liblinear”庫,“ newton-cg”,“ sag”,“ saga”和“ lbfgs”求解器實現正則邏輯回歸。請注意,默認情況下將應用正則化。它可以處理密集和稀疏輸入。使用C排序的數組或包含64位浮點數的CSR矩陣可獲得最佳性能;其他任何輸入格式將被轉換(并復制)。
“ newton-cg”,“ sag”和“ lbfgs”求解器僅支持帶有原始公式的L2正則化,不支持正則化。'liblinear’求解器支持L1和L2正則化,僅針對L2罰分采用對偶公式。僅“ saga”求解器支持Elastic-Net正則化。
筆記
底層的C實現在擬合模型時使用隨機數生成器選擇特征。因此,對于相同的輸入數據具有略微不同的結果并不罕見。如果發生這種情況,請嘗試使用較小的tol參數。
在某些情況下,預測輸出可能與獨立liblinear的輸出不匹配。請參見 敘述文檔中與liblinear的區別。
參考文獻
L-BFGS-B –大規模約束優化軟件
朱次有,理查德·伯德,豪爾赫·諾德達爾和何塞·路易斯·莫拉萊斯。 http://users.iems.northwestern.edu/~nocedal/lbfgsb.html
LIBLINEAR –大型線性分類的庫
https://www.csie.ntu.edu.tw/~cjlin/liblinear/
凹陷-馬克·施密特(Mark Schmidt),尼古拉斯·勒·魯(Nicolas Le Roux)和弗朗西斯·巴赫(Francis Bach)
用隨機平均梯度最小化有限求和 https://hal.inria.fr/hal-00860051/document
SAGA – Defazio,A.,Bach F.和Lacoste-Julien S.(2014)。
SAGA:一種支持非強凸復合物鏡的快速增量梯度方法 https://arxiv.org/abs/1407.0202
于祥富,黃芳蘭,林志仁(2011)。雙坐標下降
邏輯回歸和最大熵模型的方法。機器學習85(1-2):41-75。 https://www.csie.ntu.edu.tw/~cjlin/papers/maxent_dual.pdf
例子
>>> from sklearn.datasets import load_iris >>> from sklearn.linear_model import LogisticRegression >>> X, y = load_iris(return_X_y=True) >>> clf = LogisticRegression(random_state=0).fit(X, y) >>> clf.predict(X[:2, :]) array([0, 0]) >>> clf.predict_proba(X[:2, :]) array([[9.8...e-01, 1.8...e-02, 1.4...e-08],[9.7...e-01, 2.8...e-02, ...e-08]]) >>> clf.score(X, y) 0.97...- 使用實例sklearn.linear_model.LogisticRegression
總結
以上是生活随笔為你收集整理的Logistic回归公式推导和代码实现和Python中的sklearn.linear_model.LogisticRegression 的参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序 跳转到腾讯文档小程序
- 下一篇: 网易云音乐直链提取及下载