在機(jī)器學(xué)習(xí)領(lǐng)域中,邏輯回歸是一個(gè)非常經(jīng)典的算法。今天小編帶來的是一片關(guān)于邏輯回歸算法的介紹與實(shí)現(xiàn),希望能給各位小伙伴帶來一些幫助。
一、題目
1.主題:邏輯回歸
2.描述:假設(shè)你是某大學(xué)招生主管,你想根據(jù)兩次考試的結(jié)果決定每個(gè)申請者的錄取
機(jī)會?,F(xiàn)有以往申請者的歷史數(shù)據(jù),可以此作為訓(xùn)練集建立邏輯回歸模型,并用
其預(yù)測某學(xué)生能否被大學(xué)錄取。
3.數(shù)據(jù)集:文件 ex2data1.txt ,第一列、第二列分別表示申請者兩次
考試的成績,第三列表示錄取結(jié)果(1 表示錄取,0 表示不錄取)。
二、目的
1.理解邏輯回歸模型
2.掌握邏輯回歸模型的參數(shù)估計(jì)算法
三、平臺
1.硬件:計(jì)算機(jī)
2.操作系統(tǒng):WINDOWS
3.編程軟件:Pycharm
4.開發(fā)語言:python
四、基本原理
注:基本原理是我們在學(xué)習(xí)邏輯回歸過程中的一些總結(jié),包括為什么要選擇對數(shù)損失函數(shù)等。
4.1 邏輯回歸
邏輯回歸就是將樣本的特征可樣本發(fā)生的概率聯(lián)合起來,概率就是一個(gè)數(shù),所以就是解決分類問題,一般解決二分類問題。
對于線性回歸中,f ( x ) = w T x + b ,這里 f ( x ) 的范圍為[ ? ∞ , + ∞ ],說明通過線性回歸中我們可以求得任意的一個(gè)值。對于邏輯回歸來說就是概率,這個(gè)概率取值需要在區(qū)間[0,1]內(nèi),通常我們使用Sigmoid函數(shù)表示。
Sigmoid函數(shù)其表達(dá)式為(2)
最終我們可以通過Sigmoid函數(shù)求出對于每組自變量使得因變量預(yù)測為1的概率P;
即:
(當(dāng)P>0.5時(shí)預(yù)測為1,小于0.5為0)
在分類情況下,經(jīng)過學(xué)習(xí)后的LR分類器其實(shí)就是一組權(quán)值θ ,當(dāng)有測試樣本輸入時(shí),這組權(quán)值與測試數(shù)據(jù)按照加權(quán)得到
之后按照Sigmoid函數(shù)的形式求出
從而去判斷每個(gè)測試樣本所屬的類別。
4.2 損失函數(shù)
實(shí)驗(yàn)一我們做線性回歸模型時(shí),給出了線性回歸的代價(jià)函數(shù)的形式(誤差平方和函數(shù)),具體形式如:
但是并不能應(yīng)用到邏輯回歸中,這是因?yàn)長R的假設(shè)函數(shù)的外層函數(shù)是Sigmoid函數(shù),Sigmoid函數(shù)是一個(gè)復(fù)雜的非線性函數(shù),這就使得我們將邏輯回歸的假設(shè)函數(shù)
帶入上式時(shí),我們得到的 是一個(gè)非凸函數(shù),如下圖:
因此,此處我們需要重新考慮損失函數(shù);
在邏輯回歸中,我們最常用的損失函數(shù)為對數(shù)損失函數(shù),對數(shù)損失函數(shù)可以為LR提供一個(gè)凸的代價(jià)函數(shù),有利于使用梯度下降對參數(shù)求解。對數(shù)函數(shù)圖像如圖:
藍(lán)色的曲線表示的是對數(shù)函數(shù)的圖像,紅色的曲線表示的是負(fù)對數(shù) 的圖像,該圖像在0-1區(qū)間上有一個(gè)很好的性質(zhì),如圖粉紅色曲線部分。在0-1區(qū)間上當(dāng)z=1時(shí),函數(shù)值為0,而z=0時(shí),函數(shù)值為無窮大。這就可以和代價(jià)函數(shù)聯(lián)系起來,在預(yù)測分類中當(dāng)算法預(yù)測正確其代價(jià)函數(shù)應(yīng)該為0;當(dāng)預(yù)測錯(cuò)誤,我們就應(yīng)該用一個(gè)很大代價(jià)(無窮大)來懲罰我們的學(xué)習(xí)算法,使其不要輕易預(yù)測錯(cuò)誤。
因此,我們重新定義邏輯回歸的代價(jià)函數(shù)為:
損失函數(shù)的求解為:
五、實(shí)驗(yàn)步驟
1.數(shù)據(jù)可視化
在python中通過文件導(dǎo)入數(shù)據(jù),并使用matlibplot工具建立對應(yīng)散點(diǎn)圖:
需要注意的是,我們的theta是三元組,θ0對應(yīng)的X特征值固定為1,因此讀取數(shù)據(jù)時(shí),如上圖最左側(cè)加入一個(gè)1;
可以看到,被錄取與不被錄取的數(shù)據(jù)有較為清晰的一個(gè)界限,接下來我們要求解的就是這條界線;
2. 將線性回歸參數(shù)初始化為0,計(jì)算代價(jià)函數(shù)(cost function)的初始值
根據(jù)基本原理中的代價(jià)計(jì)算公式,這里將sigmoid、損失公式代碼化:
將theta初始化為(0,0,0)后,直接調(diào)用cost函數(shù)求值:
得到代價(jià)函數(shù)初始值:
3. 選擇一種優(yōu)化方法求解邏輯回歸參數(shù)
(1)梯度下降法
我們選擇先用梯度下降法來觀察theta參數(shù)結(jié)果;
梯度下降算法代碼實(shí)現(xiàn)如圖:
X:對于線性回歸中的常量b,我們可以將它的系數(shù)視為1,然后和變量x組成一個(gè)m行3列的矩陣,其中m是數(shù)據(jù)規(guī)模,這個(gè)矩陣就是X。
Y:一個(gè)m行1列的矩陣,對應(yīng)是否錄取。
alpha:學(xué)習(xí)率
第一步,將我們的Θ初始化為[[0][0][0]]。
第二步,對于給定的步長alpha和此時(shí)的梯度gradient,更新我們的theta。然后計(jì)算此時(shí)thrta對應(yīng)的梯度更新gradient。
第三步,重復(fù)第二步30萬次
第四步,返回theta,即為我們線性回歸的參數(shù)。
但是,對于邏輯回歸來說,這里遇到了一個(gè)問題,那就是alpha和迭代次數(shù)的取值,如果alpha過小,損失函數(shù)將收斂的非常慢,迭代次數(shù)達(dá)到40萬時(shí)才勉強(qiáng)收斂,但如果alpha過大,又會導(dǎo)致過大的步長使得準(zhǔn)確率下降;
alpha = 0.001時(shí)的收斂函數(shù),在50萬次時(shí)收斂: 0.005時(shí)在25萬次時(shí)收斂;
而如果alpha繼續(xù)增大(如0.01),將導(dǎo)致不夠準(zhǔn)確,其界限與收斂圖形如下:
(界限太差,僅80%準(zhǔn)確率,且需要20萬次迭代)
因此,我們在運(yùn)行該數(shù)據(jù)時(shí)需要運(yùn)行稍長的時(shí)間;alpha=0.005,迭代次數(shù)為30萬時(shí)可以得到一組回歸參數(shù):
它的劃分邊界如圖所示,其準(zhǔn)確率為92%:該參數(shù)的劃分準(zhǔn)確率計(jì)算方法如下:
測試準(zhǔn)確率:
比較簡單,預(yù)測正確則加一,最后除以全部樣本數(shù)。
(2)牛頓迭代法
因?yàn)樯鲜龅牡陆捣ㄋ璧螖?shù)過多,因此這里使用一種優(yōu)化方法來求解參數(shù);
方法介紹
牛頓迭代法的原理較為復(fù)雜,因此不在這里寫出來。
對比這牛頓迭代法方法與梯度下降法的參數(shù)更新公式可以發(fā)現(xiàn),兩種方法不同在于牛頓法中多了一項(xiàng)二階導(dǎo)數(shù),這項(xiàng)二階導(dǎo)數(shù)對參數(shù)更新的影響主要體現(xiàn)在 改變參數(shù)更新方向上。
如圖所示,紅色是牛頓法參數(shù)更新的方向,綠色為梯度下降法參數(shù)更新方向,因?yàn)榕nD法考慮了二階導(dǎo)數(shù),因而可以找到更優(yōu)的參數(shù)更新方向,在每次更新的步幅相同的情況下,可以比梯度下降法節(jié)省很多的迭代次數(shù)。
迭代過程:
代碼實(shí)現(xiàn)
h值為sigmoid函數(shù)求得的概率;
J為一階偏導(dǎo)數(shù)
H為Hession矩陣(海森矩陣),二階偏導(dǎo)數(shù)
牛頓迭代法得到的theta:
優(yōu)點(diǎn)
對于同樣的學(xué)習(xí)率alpha = 0.005,cost僅需要1000次迭代就差不多收斂了;
而如果放大alpha,如alpha = 0.5,那么它只需要迭代10次即可收斂。
并且準(zhǔn)確率保持在89%(數(shù)據(jù)較?。?;
3. 某學(xué)生兩次考試成績分別為 42、85,預(yù)測其被錄取的概率
這里直接使用sigmoid函數(shù)以及牛頓迭代法求得的theta來進(jìn)行其概率的計(jì)算:
得到結(jié)果:
即,y=1的概率為0.65145509,也就是被錄取的概率
4. 畫出分類邊界
在上面已經(jīng)畫出了梯度下降法的分類邊界,這里給出牛頓迭代法的邊界
到此這篇Python機(jī)器學(xué)習(xí)的邏輯回歸算法介紹就介紹到這了,更多Python機(jī)器學(xué)習(xí)的相關(guān)內(nèi)容請搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章。