【Python機器學習】111:羅吉斯回歸分類器介紹及應用
Logistic Regression Classifier
接下來要介紹的第三個分類器叫羅吉斯回歸分類器(Logistic Regression Classifier)。我們先來回憶一下,要如何把回歸模型中連續型的數值輸出對應到機率,再從機率對應到我們想要的分類呢?中間要經過兩個階段的轉換,第一個階段要經過激勵函數(Acitivation function)轉換成機率,第二階段則透過階段函數(Step function)將機率轉換成離散的分類標籤。
如何從連續型的輸出 𝑋𝑤 到離散型的輸出 𝑦̂?
其中 𝜎 俗稱為激勵函數(Activation function),𝐻 稱為階躍函數(Step function)
激勵函數將連續型輸出轉換為機率
階躍函數將機率輸出轉換為離散值
本章要介紹的羅吉斯回歸模型是一種使用 sigmoid 激勵函數的模型,sigmoid函數公式如下,input會放在分母exponential的指數位置。
激勵函數將連續型輸出轉換為機率,羅吉斯回歸使用 sigmoid 函數:
如果試著把sigmoid函數的外觀畫出來,長的如下圖,可以發現不管我的Xw的值為何,sigmoid函數都會將其縮小放大,把值控制在0~1之間。
接下來就是階躍函數的運算,透過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()
函數:
欲使用梯度遞減找到一組 𝑤 讓 𝐽(𝑤) 最小化,得先計算梯度:
自訂 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: