機器學習之邏輯迴歸

  我們知道,線性迴歸預測的是一個連續值或者任意實數,接下來,我們要解決的是一種0-1問題,也就是一種二分類問題。

邏輯迴歸在本質上和線性迴歸是一樣的,只是它在特徵到結果的映射加入了一層非線性映射,如下所示:
假設函數
其中g(z)函數被稱之爲sigmoid函數,也可以叫做logistic函數,它的圖形如下:sigmoid函數
我們可以看到,sigmoid函數的範圍是0~1,這是不是很像我們學習過的概率呢?
而且在0處,輸出值爲0.5,而邏輯迴歸就是當映射輸出>0.5時,將它分爲一類(1),當映射輸出<0.5時,將它分爲另一類(0)。
接下來我們要考慮的問題是,爲什麼我們要加入非線性函數呢,爲什麼我們不能用線性迴歸呢?
我們看下圖:
figure 1
figure 2
我們看第一張圖,當點的分佈是那樣的話,我們在縱軸爲0.5處,畫一條平行線,然後通過與那條綠色的線的交點作一條垂線,就可以把點分開,但是當再加入偏離比較遠的點之後(也叫作噪聲),如果我們再那麼分類的話,就會出現錯誤,也就是說,這些噪聲點對分類結果的好壞有很大的影響,所以對於這種分類問題,我們是無法用線性迴歸的。
接下來,就要討論損失函數的問題,事實上,邏輯迴歸的損失函數定義也和線性迴歸不一樣。
線性迴歸損失函數定義:
損失函數
邏輯迴歸損失函數的定義:
損失函數
這種損失函數是通過交叉熵來定義的。
爲什麼損失函數要這樣定義呢?還記得損失函數的意義是什麼嗎?我們也叫他懲罰函數啊,也就是說當模型在做判斷的時候,如果判斷失誤的話,我們就要給他很大的懲罰嗎,而當判斷準確的話,我們就不用給出懲罰啊,這樣模型才知道如何調整參數才能使結果更加準確啊。兩種損失函數
我們來看這張圖,這張圖是依據對“1”的結果的預測,對損失函數作比較,
上面的是交叉熵損失函數,下面的是平方誤差損失函數,我們從圖中看到,當我們預測把它分到0的那類(本來是1的那類,也就是分錯了),交叉熵給出的懲罰要遠大於平方誤差函數的,這也符合我們的原則,因此,用交叉熵定義損失函數更爲準確。
接下來,我們用另一種思路來解釋。還記得我們是如何計算參數的嗎?我們採用的是梯度下降算法,事實上,可以用數學方法證明交叉熵損失函數是凸函數,但是平方誤差函數卻不是,注意,在本文情況下,因爲y只能取0或1,所以不是,接下來,我用臺灣大學李宏毅教授的PPT的一部分講述原因。
figure 1
figure 2
figure 3
從李宏毅教授的PPT可以看出,當我們把損失函數定義爲平方誤差函數時,當實際分類爲1時,而預測爲0時,梯度卻爲0,這顯然是不對的,因爲沒有梯度,那麼我們就無法通過迭代而達到我們的目標點,反之也一樣,無論是什麼結果,梯度都爲0,而且我們可以從第三張圖看出,平方誤差損失函數是一個很平坦的曲面,所以我們永遠都不能或者在很長的時間內都無法達到最優解的位置。
邏輯迴歸和線性迴歸一樣,任然採用梯度下降算法。梯度下降
邏輯迴歸算法編程不能和線性迴歸一樣,使用簡單的梯度下降無法保證收斂,要加入非線性優化。
scipy中的optimize子包中提供了常用的最優化算法函數實現。我們可以直接調用這些函數完成我們的優化問題。optimize中函數最典型的特點就是能夠從函數名稱上看出是使用了什麼算法。下面optimize包中函數的概覽:
1.非線性最優化
fmin – 簡單Nelder-Mead算法
fmin_powell – 改進型Powell法
fmin_bfgs – 擬Newton法
fmin_cg – 非線性共軛梯度法
fmin_ncg – 線性搜索Newton共軛梯度法
leastsq – 最小二乘
好的,我先寫到這裏,其實還有很多知識點沒講到,比如過擬合問題,正則化,我有時間的話,以後會寫到。大家可以參考吳恩達教授,李宏毅教授的資料學習,這兩個人都講的非常好。
李宏毅教授主頁,這個主頁上有很多學習資料,如有錯誤還請見諒

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