【Python機器學習】111:羅吉斯回歸分類器介紹及應用

Logistic Regression Classifier

張育晟 Eason Chang
展開數據人生
6 min readOct 4, 2020

--

Photo by marina on Unsplash

接下來要介紹的第三個分類器叫羅吉斯回歸分類器(Logistic Regression Classifier)。我們先來回憶一下,要如何把回歸模型中連續型的數值輸出對應到機率,再從機率對應到我們想要的分類呢?中間要經過兩個階段的轉換,第一個階段要經過激勵函數(Acitivation function)轉換成機率,第二階段則透過階段函數(Step function)將機率轉換成離散的分類標籤。

如何從連續型的輸出 𝑋𝑤 到離散型的輸出 𝑦̂?

其中 𝜎 俗稱為激勵函數(Activation function),𝐻 稱為階躍函數(Step function)

激勵函數將連續型輸出轉換為機率

階躍函數將機率輸出轉換為離散值

本章要介紹的羅吉斯回歸模型是一種使用 sigmoid 激勵函數的模型,sigmoid函數公式如下,input會放在分母exponential的指數位置。

激勵函數將連續型輸出轉換為機率,羅吉斯回歸使用 sigmoid 函數:

如果試著把sigmoid函數的外觀畫出來,長的如下圖,可以發現不管我的Xw的值為何,sigmoid函數都會將其縮小放大,把值控制在0~1之間。

注意:exponential 可以用np.exp呼叫
Sigmoid 函數的外觀

接下來就是階躍函數的運算,透過sigmoid函數算出來的值,我們會拿來和門檻機率做比較,如果值大於門檻則預測結果為1,否則為0(門檻值通常是自己定義,通常二元分類的門檻為0.5)。

將機率轉換為 𝑦̂ ∈ {0 , 1}:

拆解羅吉斯回歸分類器的步驟:

1、尋找 ℎ(𝑋)=𝑋𝑤 的 𝑤

在回歸問題中找w蠻容易的,因為解w的解法很多元,可以用正規方程式(normal equation),也可以用梯度遞減(gradient descent)。雖然看起來羅吉斯回歸模型只有3個步驟,但其實第一個步驟是很難的,羅吉斯回歸模型的w並不好找(其實分類器的w都不好找)

2、將 ℎ(𝑋)的輸出 𝑧 作為 Sigmoid 函數的輸入,得到 𝜎(𝑧)

3、將 𝜎(𝑧) 作為 𝐻 的輸入,得到 𝑦̂

為什麼說分類問題的w不好找呢?還記得在迴歸問題中我們尋找 ℎ(𝑋)=𝑋𝑤 的 𝑤 是根據一個目標:讓成本函數 MSE 最小化。

但是在分類問題中,我們尋找 ℎ(𝑋)=𝑋𝑤 的 𝑤 則是依據:讓誤分類數最小化:

MSE函數的目標是 𝑦̂ 與 y之間的數值差異越小越好,由於其函數的外觀有平方,是一個拋物線向上的函數,因此可以找到唯一的最低點。但誤分類數最小是一個離散的問題,面對這樣一個問題,我們的成本函數就不再是MSE了,它的樣子長得比較特別一點。為了讓誤分類數最小化,得在尋找 𝑤 的過程中設計成本函數 𝐽:

這個經過精心設計的成本函數 𝐽 稱為交叉熵(Cross-entropy)或 Log Loss,此成本函數設計的巧妙處在於讓錯誤分類的成本趨近無限大

  • 真實的 y 為 1,𝜎(𝑧) 若離 0 比較近(誤分類),則成本將趨近無限大
  • 真實的 y 為 0,𝜎(𝑧) 若離 1 比較近(正確分類),則成本將趨近無限大

上述說明可以用以下圖形解釋:x軸是最後透過階躍函數分類的結果(0~1),左圖中在真實 y 為1的時候搭配,如果sigmoid函數的輸出為1,則它的成本函數就會趨近0;相反,真實 y 為1,但預測結果卻是0的時候,成本函數就會往無限大的方向趨近。

利用這兩個函數,-log(x) 和 -log(1-x) 便設計出了真實資料分別為 0 跟 1 的時候各自應該採納的成本函數。

自訂 get_cross_entropy() 函數:

注意:epsilon的設計是為了使分母不要為0

欲使用梯度遞減找到一組 𝑤 讓 𝐽(𝑤) 最小化,得先計算梯度:

對J函數偏微分過程有點辛苦,所以這裡直接把答案修出來

自訂 get_grad() 函數:

注意1:在每一個w都會有一個gradient的計算

注意2:這裡都有用到一些y_reshaped,原因是我們習慣傳進來的y都不是矩陣,而是一維的array,所以函數要使用的時候要先轉換外觀,否則無法dot

自訂 gradient_descent() 函數:

如何操作羅吉斯回歸分類器利用 Age 來預測乘客的生存與否?

使用階躍函數將機率轉換為 𝑦̂ ∈ { 0 , 1 }:

利用 DataFrame 觀察,大家比較會知道我們一系列操作到底在幹嘛:

每一個 X 都會對應到一個 w,而 X0乘w0 + X1乘w1 會得到z,z經過 sigmoid 函數運算會得到h,h再透過階躍函數判斷輸出應該是0還是1。

感謝你閱讀完這篇文章,如果你覺得這些文章對你有幫助請在底下幫我拍個手(長按最多可以拍50下手)。

上一章:【Python機器學習】110:簡單貝氏分類器講解及其應用

下一章待續

Sources:

--

--

張育晟 Eason Chang
展開數據人生

在不斷變動中努力思索自己的定位,想做的事情很多,但最希望的是不要變成無趣的人。 Linkedin: https://www.linkedin.com/in/stareason1997