首頁 >後端開發 >Python教學 >Python實作LR經典演算法

Python實作LR經典演算法

零到壹度
零到壹度原創
2018-04-19 16:55:445684瀏覽

本文實例講述了Python實作LR經典演算法。分享給大家供大家參考,如下:

(一)認識Logistic回歸(LR)分類器

首先,Logistic迴歸雖然名字裡帶“迴歸”,但它其實是一種分類方法,主要用於兩分類問題,利用Logistic函數(或稱為Sigmoid函數),自變數取值範圍為( -INF, INF),自變數的取值範圍為(0,1),函數形式為:


由於sigmoid函數的定義域是(-INF, INF),而值域為(0, 1)。因此最基本的LR分類器適合將兩分類(類別0,類別1)目標進行分類。 Sigmoid 函數是個很漂亮的「S」形,如下圖:


LR分類器( Logistic Regression Classifier)目的就是從訓練資料特徵學習出一個0/1分類模型--這個模型以樣本特徵的線性組合作為自變量,使用logistic函數將自變量映射到(0,1)。因此LR分類器的求解就是解一組權值是是名目變數--dummy,為常數,實際工程中常另x0=1.0。不管常數項有沒有意義,最好保留),並代入Logistic函數建構出一個預測函數:

#函數的值表示結果為1的機率,就是特徵屬於y=1的機率。因此對於輸入x分類結果為類別1和類別0的機率分別為:


當我們要判別一個新來的特徵屬於哪個類別時,按照下式求出一個z值:

(x1,x2,...,xn是某樣本資料的各個特徵,維度為n)

進而求出###---若大於0.5就是y=1的類,反之屬於y=0類。 (注意:這裡依然假設統計樣本是均勻分佈的,所以設閾值為0.5)。 LR分類器的這一組權值如何求得的呢?這就需要涉及到極大似然估計MLE和最佳化演算法的概念了,數學中最優化演算法常用的就是梯度上升(下降)演算法。 ######

Logistic迴歸可以也可以用於多分類的,但是二分類的更為常用也更容易解釋。所以實際上最常用的就是二分類的Logistic迴歸。 LR分類器適用資料型態:數值型和標稱型資料。其優點是計算代價不高,易於理解和實現;其缺點是容易欠擬合,分類精度可能不高。

(二)Logistic迴歸數學推導

#1,梯度下降法求解Logistic迴歸

首先,要理解下述數學推導過程需要較多的導數解公式,可以參考「常用基本初等函數求導公式積分公式」。

假設有n個觀測樣本,觀測值分別為為給定條件下得到yi=1的機率。在同樣條件下得到yi=0的條件機率為。於是,得到一個觀測值的機率為

-----此公式其實是綜合公式(1)得出

因為各項觀測獨立,所以它們的聯合分佈可表示為各邊際分佈的乘積:

(m表統計樣本數目)             

#上式稱為n個觀測的似然函數。我們的目標是能夠求出使這一似然函數的值最大的參數估計。於是,最大似然估計的關鍵就是求出參數

,使上式取得最大值。

對上述函數求對數:


##最大似然估計就是求使上式取最大值時的θ,這裡可以使用梯度上升法求解,求得的θ就是要求的最佳參數。在Andrew Ng的課程中將J(θ)取為下式,即:J(θ)=-(1/m)l(θ),J(θ)最小值時的θ則為要求的最佳參數。透過梯度下降法求最小值。 θ的初始值可以全部為1.0,更新過程為:

(j表樣本第j個屬性,共n個;a表示步長--每次移動量大小,可自由指定)



因此,θ(可以設初始值全部為1.0)的更新過程可以寫成:


#

 (i表示第i個統計樣本,j表樣本第j個屬性;a表示步長)

該公式將一直被迭代執行,直至達到收斂(在每一步迭代中都減​​小,如果某一步減少的值少於某個很小的值(小於0.001), 則其判定收斂)或某個停止條件為止(例如迭代次數達到某個指定值或演算法達到某個可以允許的誤差範圍)。

2,向量化Vectorization求解

#Vectorization是使用矩陣運算來取代for循環,以簡化計算過程,提高效率。如上式,Σ(...)是一個求和的過程,顯然需要一個for語句循環m次,所以根本沒有完整的實作vectorization。以下介紹向量化的過程:

約定訓練資料的矩陣形式如下,x的每一行為一條訓練樣本,而每一列為不同的特稱取值:


#g(A)的參數A為一列向量,所以實現g函數時要支援列向量作為參數,並傳回列向量。由上式可知hθ(x)-y可由g(A)-y一次計算求得。

θ更新過程可以改為:



綜上所述,Vectorization後θ更新的步驟如下:

(1)求A=X*θ(此處為矩陣乘法,X是(m,n 1)維向量,θ是(n 1,1)維列向量,A就是(m,1)維向量)

(2)求E=g(A)-y(E、y是(m,1)維度向量)

(3)求 (a表示步長)


3,步長a的選擇

a的取值也是確保梯度下降收斂的關鍵點。值太小則收斂慢,值太大則無法保證迭代過程收斂(邁過了極小值)。要確保梯度下降演算法正確運行,需要確保 J(θ)在每一步迭代中都會減少。如果步長a取值正確,那麼J(θ)應會越來越小。所以a的取值判斷準則是:如果J(θ)變小了表示取值正確,否則減少a的值。

選擇步長a的經驗為:選取一個a值,每次約3倍於前一個數,如果迭代不能正常進行(J增大了,步長太大,邁過了碗底)則考慮使用較小的步長,若收斂較慢則考慮增大步長,a取值範例如:

…, 0.001, 0.003, 0.01, 0.03, 0.1 , 0.3, 1…。

4,特徵值歸一化

#Logistic 迴歸也是一種迴歸演算法,多維特徵的訓練數據進行迴歸採取梯度法求解時其特徵值必須做scale,確保特徵的取值範圍在相同的尺度內計算過程才會收斂(因為特徵值得取值範圍可能相差甚大,如特徵1取值為(1000- 2000),特徵2取值為(0.1-0.2))。 feature scaling的方法可自訂,常用的有:

1) mean normalization (or standardization)

(X - mean(X ))/std(X),std(X)表示樣本的標準差

2) rescaling

(X - min) / (max - min)

5,演算法最佳化--隨機梯度法

梯度上升(下降)演算法在每次更新回歸係數時都需要遍歷整個數據集, 該方法在處理100個左右的數據集時尚可,但如果有數十億樣本和成千上萬的特徵,那麼該方法的計算複雜度就太高了。一種改進方法是一次僅用一個樣本點來更新迴歸係數,該方法稱為隨機梯度演算法。由於可以在新樣本到來時對分類器進行增量式更新,它可以在新資料到來時就完成參數更新,而不需要重新讀取整個資料集來進行批次運算,因而隨機梯度演算法是一個在線學習演算法。 (與「線上學習」相對應,一次處理所有資料被稱為是「批次」)。隨機梯度演算法與梯度演算法的效果相當,但具有更高的計算效率。

(三)Python實作Logistic迴歸演算法

#上節透過Andrew Ng的課程對J(θ) =-(1/m)l(θ)採取梯度下降法求解說明了Logistic迴歸的求解過程,本節Python實作演算法的過程仍直接對J(θ)採取梯度上升法或隨機梯度上升法求解,LRTrain物件同時實現了採取梯度上升法或隨機梯度上升法求解過程。

LR分類器學習套件中包含lr.py/object_json.py/test.py三個模組。 lr模組透過物件logisticRegres實現了LR分類器,支援gradAscent('Grad') and randomGradAscent('randomGrad')兩種求解方法(二選一,classifierArray只儲存一種分類求解結果,當然你也可以定義兩個classifierArray同時支援兩種求解方法)。

test模組中是利用LR分類器根據疝氣症預測病馬死亡率的應用。該資料存在一個問題--資料由30%的遺失率,這裡採用特殊值0替代,因為0不會影響LR分類器的權值更新。

訓練資料中樣本特徵值的部分缺失是很棘手的問題,很多文獻致力於解決這個問題,因為資料直接丟掉太貴,重新取得代價也昂貴。一些可選的資料遺失處理方法包括:

□使用可用特徵的平均值來填補缺失值;

##□使用特殊值來±真補缺失值,如-1;#

□忽略有缺失值的樣本;

□使用相似樣本的平均值添補缺失值;

□使用另外的機器學習演算法預測缺失值。

LR分類器演算法學習套件下載位址是:

#machine learning Logistic regression

#(四)Logistic迴歸應用

Logistic迴歸的主要用途:

尋找危險因素:尋找某一疾病的危險因子等;

預測:根據模型,預測在不同的自變數情況下,發生某一疾病或某種情況的機率有多大;

判別:實際上跟預測有些類似,也是根據模型,判斷某人屬於某病或屬於某種情況的機率有多大,也就是看一下這個人有多大的可能性是屬於某病。

Logistic迴歸主要在流行病學中應用較多,比較常用的情形是探索某疾病的危險因素,根據危險因子預測某疾病發生的機率,等等。例如,想探討胃癌發生的危險因素,可以選擇兩組人群,一組是胃癌組,一組是非胃癌組,兩組人群肯定有不同的體徵和生活方式等。這裡的依變項就是是否胃癌,即“是”或“否”,自變數就可以包括很多了,例如年齡、性別、飲食習慣、幽門螺旋桿菌感染等。自變數既可以是連續的,也可以是分類的。


相關推薦:

邏輯迴歸之梯形下降計算最值

LR深入理解

#機器學習常用演算法(LDA,CNN,LR)原理簡述

LR推導

以上是Python實作LR經典演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn