機器學習演算法:從頭開始構建邏輯回歸模型
原作:Rohith Gandhi
郭一璞 編譯自 Hacher Noon
量子位 出品 | 公眾號 QbitAI
邏輯回歸是繼線性回歸之後最著名的機器學習演算法。
在很多方面,線性回歸和邏輯回歸是相似的,不過最大的區別在於它們的用途,線性回歸演算法用於預測,但邏輯回歸用於分類任務。
分類任務很常見,比如把電子郵件分為垃圾郵件和非垃圾郵件、把腫瘤分為惡性或者良性、把網站分為危險站點或正常站點,機器學習演算法就可以完成這些任務。
其中,邏輯回歸演算法就是一種分類演算法,簡單粗暴,但有用。
現在,開始深入研究邏輯回歸。
Sigmoid函數(Logistic函數)
邏輯回歸演算法使用具有獨立預測因子的線性方程來預測,預測值可以是從負無窮到正無窮之間的任何值。
我們需要讓演算法的輸出為類變數,比如用0表示非,用1表示是。
因此,我們將線性方程的輸出壓縮到[0,1]的範圍內。
為了壓縮0和1之間的預測值,我們使用sigmoid函數:
線性方程和sigmoid函數
壓縮輸出-h
我們取線性方程的輸出(z)並給出返回壓縮值h的函數g(x),h將位於0到1的範圍內。為了理解sigmoid函數如何壓縮,我們畫出了sigmoid函數的圖形:
sigmoid函數圖形
如圖可見,sigmoid函數當x>0時,y逐漸向1靠近;當x
成本函數(cost function)
由於我們試圖預測類別值,不能使用和線性回歸演算法中相同的成本函數。
所以,我們使用損失函數的對數來計算錯誤分類的成本。
考慮到計算上面這個函數的梯度實在太難了,,我們把它寫成下面這個樣子:
計算梯度
我們取相對於每個參數(θ_0,θ_1,…)的成本函數的偏導數來獲得梯度,有了這些梯度,我們可以更新θ_0,θ_1,…的值。
現在,開始召喚微積分大法:
梯度
如果看懂了,那你的微積分學得棒棒的。
不過,如果微積分大法召喚失敗……就直接照著上面的式子做吧。
寫代碼
現在方程終於搞定了,開始寫代碼。
我們用NumPy來從頭構建模型,用IRIS(鳶尾花)數據集來訓練和測試演算法。
我們用pandas來載入數據。
IRIS數據集有三個目標值,分別是弗吉尼亞鳶尾、山鳶尾、變色鳶尾。但是因為要實現的是二進位的分類演算法,所以此處先把弗吉尼亞鳶尾剔除。
變色鳶尾(左)和山鳶尾(右),圖源百度百科
現在,只剩下兩個目標值用來分類了。
之後,從數據集中提取獨立變數和因變數,現在可以繼續準備訓練集和測試集了。
我們清洗了數據,並且把它們分為了訓練集和測試集,訓練集中有90個數據,測試集中有10個數據。由於數據集中有四個預測因子,所以我們提取每個特徵並將其存儲在各個向量中。
我們用0來初始化參數(θ_0,θ_1,…)。當我們使用線性方程來計算這些值時,這些值將被壓縮到0到1的範圍內。
然後計算成本。
可以用成本函數計算每個參數的梯度,並通過將梯度與α相乘來更新它們的值,α是演算法的學習率。一萬次之後,我們的演算法會收斂到最小值。
現在,終於可以找出那10個測試集的數據,開始測試了。
提前準備好的測試集和訓練集的特徵十分相似,但是因為測試示例的數量只有10個,所以我們把θ_0,θ_1,θ_2,θ_3和θ_4的值從90×1剪切到10×1,計算了測試類別並檢查模型的精確度。
哎呦不錯
完美!模型準確度100%!
雖然邏輯回歸演算法非常強大,但我們使用的數據集並不是很複雜,所以我們的模型能夠達到100%的準確度。
我們還可以畫出一萬次訓練的成本函數圖:
您的成本函數請查收
不過,現在你可能覺得這個演算法的代碼太多了。為了縮短代碼行數,我們用上了scikit學習庫。scikit學習庫有一個內置的邏輯回歸類別,我們可以直接接入使用。
看,代碼已經被縮減到10行以內了。用scikit學習庫,我們的模型準確率依然100%。
https://hackernoon.com/introduction-to-machine-learning-algorithms-logistic-regression-cbdd82d81a36
—完—
活動報名
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復「招聘」兩個字。
※阿里AI智能音箱現在有了視覺能力,跟人交互時表情豐富
※首個香港AI實驗室成立,阿里商湯聯手,內地應用輸出
TAG:量子位 |