Logistic regression 的梯度下降解法-附python實現
Logistic regression是非常基礎、傳統和使用廣泛的二分類方法。演算法本身的優勢略去不表,本文受Andrew NG的啟發,旨在NN mindset的指導下,用梯度下降法實現邏輯回歸求解。
1. 先來回顧下logistic regression的公式:
2.1 對單個樣本(i),用loss function度量預測值(Yhat) 與真實值(y)的偏差
2.2 對整體,用平均的loss function代表該數據集的cost function
3.損失函數最小,求回歸係數w。這步也就是J(w,b)對w求導,令導數為,求w。此時,據說無法求解析解(各位大神可以自行嘗試並好心告知~),迭代法就出場了。
第3步常見的方法有:
1.梯度下降(以及優化的隨機梯度下降和mini batch梯度下降,這個以後另寫一篇說明)
2.牛頓迭代
3.擬牛頓迭代演算法(BFGS演算法和L-BFGS演算法)
為什麼說是NN mindset的梯度下降法呢,看下圖:
forward計算,backward導數求解,再迭代更新,此為精華
梯度求解的偽代碼如下:
初始化回歸係數
重複以下步驟直至停止條件{
算 dw, db
用 alpha和gradient更新回歸係數w,b
}
此處是最簡單的梯度下降,需要遍歷整個數據集,更新一輪w,b,當樣本量和特徵數很大時,這無疑是費時的。
隨機梯度下降(stochastic gradient descent)對此進行了優化,用一個樣本點來更新一輪w,b,但是會出現 cost function忽大忽小的隨機情況。再改進,就比如mini batch,用一小批樣本更新一輪,比隨機更穩健一些。
這裡還涉及到一個迭代停止條件,可以從幾方面考慮,如cost function降低幅度,迭代次數。當然,alpha的大小也決定了損失函數降低的幅度。
另外一點需要注意的是,用alpha * dw更新每個w時,對不同量綱的x採用相同的alpha,可能會造成收斂速度較慢或cost function無法達到全局最優。
以下就是具體的python實現~
本文用python自帶的iris數據集測試
參數初始化,同時保留幾個列表,存儲每次迭代的結果
主程序開始啦!
6萬多次停止了。效果如下:
本著嚴謹審慎的態度,用python自帶的包算了下邏輯回歸參數,如下:
這裡python包用的是statsmodels.api里的GLM(families.Binomial),跟梯度方法相差不多(這裡alpha和迭代次數還是調了會兒的,可以試試標準化x有什麼差別)。
另,如果用LogisticModel包,因為自帶正則項懲罰,參數結果會不太一樣。
這是後話。回看這個梯度迭代法實現起來並不難,但一開始說要寫,寶寶內心是抗拒的啊泥胃,這句話送給自己:everything will be fine 加油!
?
TAG:靜夜思舍 |