基於python的在線學習logistic迴歸

在和導師第一次交流後,導師建議我們先從機器學習中最簡單的logistic迴歸開始入手,並學習流式的機器學習算法再將其應用於spark平臺上,本文先分析logistic迴歸的理論依據,再借鑑《機器學習實戰》一書中基於python的logistic迴歸進行介紹,爲將算法移植到spark平臺上做好準備。

一、          梯度下降法logistic迴歸的理論分析

Logistic迴歸用來解決二值分類問題。訓練數據爲(x_1, y_1), (x_2,y_2)……(x_n, y_n)等n個數據對。x_i代表訓練數據的特徵,爲一個向量;y_i代表訓練數據的標籤,我們假設正樣本和負樣本的標籤爲{-1,1}。

Logistic回歸屬於廣義線性模型,對線性模型來說,訓練算法訓練的是一個與測試樣本x_j同等維度的權重w,通過計算w*x_j(w*代表w的轉置)來得到樣本x_j的“score”,然後對score進行分析,得到算法的輸出。

在Logistic迴歸中,對某個測試樣本x_j來說,算法的輸出是此樣本屬於正樣本(或負樣本)的概率,當然,這個概率是屬於[0,1]的。這個概率是和剛纔說到的score緊密相關的,這個關係就是如下的Logistic函數。

如果我們把w*x看做自變量s,它的曲線如下所示:

h(x)或θ(x)表示樣本x屬於正樣本的概率,上述曲線的意思是,當score,即w*x爲正數,則樣本屬於正樣本的概率大於1/2,即更有可能是正樣本,反之更有可能是負樣本。並且w*x爲一個更大的正數的話,其屬於正樣本的概率更大,w*x爲一個更小的負數的話,其屬於負樣本的概率更大。

在學習的過程中,對於y_i = 1的訓練數據,我們希望h(x_i)越大越好,此時h(x_i)=h(y_i*x_i),因爲y_i此時等於1;對y_i = -1的訓練數據,我們希望h(x_i)越小越好,由於函數h(x)是反向對稱的,我們也可以說希望h(-x_i)越大越好,此時也有h(-x_i) =h(y_i*x_i)。因此,對n個訓練樣本,我們希望

我們對優化的目標函數取一個-log(),則最大化問題可以變成最小化問題,連乘可以變成連加。問題變成

我們可以使用梯度下降法來求解這個問題,首先需要計算目標函數E關於w的梯度。注意這是一個n項加和的目標函數,我們可以分別對每一項求關於w的梯度,然後對n個梯度加和。容易得到,梯度等於:


梯度下降法使用如下迭代:

其中η是一個預設的步長。通過數次迭代,我們可以求得一個比較好的w。

二、隨機梯度下降法的logistic迴歸

注意到在上面的Logistic迴歸算法當中,計算梯度時我們用到了所有n個訓練數據,在大規模機器學習問題中,訓練數據量非常大,或者訓練數據是以流的形式到達,我們不能將所有的訓練數據同時進行計算,此時,我們需要使用隨機梯度下降法來解決這個問題。

隨機梯度下降法思想十分簡單:在每次計算梯度時,我們只使用1個數據點來計算,然後用這個梯度來更新w。我們可以把隨機梯度下降法總結如下:

初始化訓練參數w

對訓練集中每一個樣本

              計算此樣本的梯度

              用此樣本的梯度更新參數w

得到w

三、基於python的logistic迴歸

在《機器學習實戰》書中給出了一個具體的例子,首先利用基本的梯度上升(與梯度下降法效果一樣,符號不一樣而已)法,再利用改進的隨機梯度上升法進行分類器的訓練,下面給出算法執行過程。

在前面理論推導的基礎上,在logRegres.py中輸入如下代碼

程序讀取的數據集截圖如下圖所示

我用的是pythonxy程序自帶的IDLE運行環境

在IDLE環境中切換到logRegres.py所在的目錄

然後運行下圖所示的程序,可以得到運行梯度下降法的logistic迴歸後的權重w。

然後再畫出決策邊界。(通過plotBestFit函數,由於這個函數略長,且重要性不大,因此略去)

從圖中可以看出,綠色的爲一類,紅色的爲一類,劃分的分類線只分錯了4個點。

下面對隨機梯度上升法的執行情況做一個簡要介紹

重新寫一個stocGradAscent0函數,如下圖,每一次對一個數據進行梯度下降,而不是像前面的根據所有的數據進行梯度下降,


重新畫分類線的圖,得到下圖


我們看到效果並不是特別好,分類錯了很多樣本。但其實與前面相比,這次的代碼只是對數據集進行了一遍學習並沒有進行多次學習。

下面我們用改進的隨機梯度上升法,進行訓練,看看效果。改進的梯度學習算法主要在學習速率上做了一定的改進,隨着學習次數增多,學習速率不斷降低,但是永遠不會下降爲0.

我們看到了代碼中寫明瞭對整個數據集反覆學習150次。

得到的結果如下圖所示。

我們可以看到效果還是挺不錯的,並且計算量少了很多,而且還可以流式學習。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章