從零開始利用Python建立邏輯迴歸分類模型

人工智慧頻道發表於2018-10-26

假設申請人向你提供成績,你根據成績對其進行分類,目標是根據分數將申請人分為兩類,如果申請人可以進入大學,則分為1級,如果申請人不能被錄取,則分為0級。使用線性迴歸可以解決這個問題嗎?讓我們一起來看看。

注意:閱讀本文的前提是瞭解線性迴歸!

目錄

  • 什麼是邏輯迴歸?

  • 資料集視覺化

  • 假設和成本函式

  • 從頭開始訓練模型

  • 模型評估

  • Scikit-learn實現

什麼是邏輯迴歸?

回想一下線性迴歸,它被用於確定一個連續因變數的值。邏輯迴歸通常用於分類目的。與線性迴歸不同,因變數只能採用有限數量的值,即因變數是分類的。當可能結果的數量只有兩個時,它被稱為二元邏輯迴歸。

讓我們看看邏輯迴歸如何被用於分類任務。

線上性迴歸中,輸出是輸入的加權和。邏輯迴歸是廣義線性迴歸,在某種意義上,我們不直接輸出輸入的加權和,但我們通過一個函式來傳遞它,該函式可以對映0到1之間的任何實數值。

如果我們將輸入的加權和作為輸出,就像我們線上性迴歸中做的那樣,那麼該值可以大於1,但我們想要一個介於0和1之間的值。這也是為什麼線性迴歸不能用於分類任務的原因。

從下圖可以看出,線性迴歸的輸出通過一個啟用函式傳遞,該函式可以對映0到1之間的任何實數值。

從零開始利用Python建立邏輯迴歸分類模型


所使用的啟用函式稱為sigmoid函式。sigmoid函式的曲線如下圖所示

從零開始利用Python建立邏輯迴歸分類模型


我們可以看到sigmoid函式的值總是介於0和1之間。在X = 0時,該值恰好為0.5。我們可以使用0.5作為概率閾值來確定類。如果概率大於0.5,我們將其分類為Class-1(Y = 1)或者歸類為Class-0(Y = 0)。

在我們構建模型之前,讓我們看一下邏輯迴歸所做的假設

  • 因變數必須是絕對的

  • 自變數(特徵)必須是獨立的(以避免多重共線性)

資料集

本文中使用的資料來自吳恩達在Coursera上的機器學習課程。資料可以從這裡下載。(https://www.coursera.org/learn/machine-learning)該資料包括100名申請人的兩次考試分數。目標值採用二進位制值1,0。1表示申請人被大學錄取,0表示申請人未被錄取。它目標是建立一個分類器,可以預測申請是否將被大學錄取。

讓我們使用read_csv函式將資料載入到pandas Dataframe中。我們還將資料分為錄取的和未錄取的,以使資料視覺化。

從零開始利用Python建立邏輯迴歸分類模型


從零開始利用Python建立邏輯迴歸分類模型


從零開始利用Python建立邏輯迴歸分類模型


從零開始利用Python建立邏輯迴歸分類模型


現在我們已經清楚地瞭解了問題和資料,讓我們繼續構建我們的模型。

假設和成本函式

到目前為止,我們已經瞭解瞭如何使用邏輯迴歸將例項分類到不同的類中。在本節中,我們將定義假設和成本函式。

線性迴歸模型可以用等式表示。

從零開始利用Python建立邏輯迴歸分類模型


然後,我們將sigmoid函式應用於線性迴歸的輸出

從零開始利用Python建立邏輯迴歸分類模型


sigmoid函式表示為,

從零開始利用Python建立邏輯迴歸分類模型


然後邏輯迴歸的假設為,

從零開始利用Python建立邏輯迴歸分類模型


從零開始利用Python建立邏輯迴歸分類模型


如果輸入的加權和大於零,則預測的類為1,反之亦然。因此,通過將輸入的加權和設定為0,可以找到將兩個類分開的決策邊界。

成本函式

與線性迴歸一樣,我們將為模型定義成本函式,目標是最小化成本。

單個訓練示例的成本函式可以通過以下方式給出:

從零開始利用Python建立邏輯迴歸分類模型


成本函式直覺

如果實際的類是1並且模型預測為0,我們應該懲罰它,反之亦然。從下圖中可以看出,對於h(x)接近1的情況-log(h(x)),成本為0,當h(x)接近0時,成本為無窮大(即我們對模型進行嚴重懲罰)。類似地,對於繪圖-log(1-h(x)),當實際值為0並且模型預測為0時,成本為0並且當h(x)接近1時成本變為無窮大。

從零開始利用Python建立邏輯迴歸分類模型


我們可以使用以下兩個方程組合:

從零開始利用Python建立邏輯迴歸分類模型


由J(θ)表示的所有訓練樣本的成本可以通過取所有訓練樣本的成本的平均值來計算

從零開始利用Python建立邏輯迴歸分類模型


其中m是訓練樣本的數量。

我們將使用梯度下降來最小化成本函式。梯度w.r.t任何引數都可以由該方程給出

從零開始利用Python建立邏輯迴歸分類模型


該方程類似於我們線上性迴歸中所獲得的方程,在這兩種情況下只有h(x)不同。

訓練模型

現在我們已經擁有了構建模型所需的一切。讓我們在程式碼中實現它。

讓我們首先為我們的模型準備資料。

從零開始利用Python建立邏輯迴歸分類模型


我們將定義一些將用於計算成本的函式。

從零開始利用Python建立邏輯迴歸分類模型


接下來,我們定義成本和梯度函式。

從零開始利用Python建立邏輯迴歸分類模型


從零開始利用Python建立邏輯迴歸分類模型


我們還定義擬合函式,該函式將用於查詢最小化成本函式的模型引數。在這篇文章中,我們編寫了梯度下降法來計算模型引數。 在這裡,我們將使用scipy庫中的fmin_tnc函式。它可用於計算任何函式的最小值。它將引數作為:

  • func:最小化的函式

  • x0:我們想要查詢的引數的初始值

  • fprime:'func'定義的函式的梯度

  • args:需要傳遞給函式的引數

從零開始利用Python建立邏輯迴歸分類模型


模型引數為[-25.16131856 0.20623159 0.20147149]

為了瞭解我們的模型有多好,我們將繪製決策邊界。

繪製決策邊界

由於我們的資料集中有兩個特徵,因此線性方程可以表示為,

從零開始利用Python建立邏輯迴歸分類模型


如前所述,可以通過將輸入的加權和設定為0來找到決策邊界。將h(x)等於0,

從零開始利用Python建立邏輯迴歸分類模型


我們將在我們用於視覺化資料集的圖上方繪製決策邊界。

從零開始利用Python建立邏輯迴歸分類模型


從零開始利用Python建立邏輯迴歸分類模型


看起來我們的模型在預測課程方面做得不錯。但它有多準確?讓我們來看看。

模型的準確性

從零開始利用Python建立邏輯迴歸分類模型


該模型的準確率為89%。

讓我們使用scikit-learn實現我們的分類器,並將它與我們從頭開始構建的模型進行比較。

scikit-learn實現

從零開始利用Python建立邏輯迴歸分類模型


模型引數為[[-2.85831439,0.05214733,0.04531467]],精度為91%。

為什麼模型引數與我們從頭開始實現的模型有很大不同?如果你看一下sk-learn的邏輯迴歸實現的文件,你就會發現其中考慮了正則化。基本上,正則化是用於防止模型過度擬合資料的。 在本文中,我不會深入討論正規化的細節。

此文章中使用的完整程式碼可以在此GitHub中找到。(https://github.com/animesh-agarwal/Machine-Learning/tree/master/LogisticRegression)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545819/viewspace-2217707/,如需轉載,請註明出處,否則將追究法律責任。

相關文章