本節(jié)不僅介紹了Logistic回歸在sklearn中模型應(yīng)用,還介紹了liblinear届搁、牛頓法、擬牛頓法(DFP算法、BFGS算法咖祭、L-BFGS算法)、梯度下降蔫骂、隨機(jī)梯度下降等么翰,正文如下,歡迎圍觀喔~~(我的字跡請大家別吐槽了辽旋,已放棄治療浩嫌,捂臉~`~)
上一篇主要是學(xué)習(xí)了Logistic回歸(Logistic Regression)算法筆記(一)-Python,用基礎(chǔ)Python實(shí)現(xiàn)了Logistic回歸算法补胚。本文將利用scikit-learn中的相關(guān)模塊學(xué)習(xí)Logistic回歸算法的實(shí)現(xiàn)
在scikit-learn中码耐,主要是基于LogisticRegression模型來解決Logistic回歸算法,其中溶其,有兩種不同的代價函數(shù)(cost function):
L1:
L2:
對于L1骚腥、L2兩式子的解釋:每個式子中前面那項(xiàng)是正則化項(xiàng)(Regularizer)(包含w的范數(shù)),后面那項(xiàng)是損失函數(shù)(loss function)瓶逃,參數(shù)C控制了兩者在最終的損失函數(shù)中所占的比重束铭。求解w參數(shù)的方法根據(jù)L1/L2代價函數(shù)的不同,也存在不同的求解擬合參數(shù)的方法:
1)‘liblinear’->liblinear是一個針對線性分類場景而設(shè)計的工具包厢绝,支持線性的SVM和Logistic回歸等契沫,但是無法通過定義核函數(shù)的方式實(shí)現(xiàn)非線性分類。
備注:libSVM是一套完整的SVM模型實(shí)現(xiàn)昔汉。用戶可以在libSVM中使用核函數(shù)來訓(xùn)練非線性的分類器懈万,當(dāng)然也能使用更基礎(chǔ)的線性SVM。由于支持核函數(shù)的擴(kuò)展靶病,libSVM理論上具有比liblinear更強(qiáng)的分類能力会通,能夠處理更為復(fù)雜的問題。但是針對線性分類嫡秕,liblinear無論是在訓(xùn)練上還是在預(yù)測上渴语,都比libSVM高效得多。此外昆咽,受限于算法驾凶,libSVM往往在樣本量過萬之后速度就比較慢了,如果樣本量再上升一個數(shù)量級掷酗,那么通常的機(jī)器已經(jīng)無法處理了调违。但使用liblinear,則完全不需要有這方面的擔(dān)憂泻轰,即便百萬千萬級別的數(shù)據(jù)技肩,liblinear也可以輕松搞定,因?yàn)閘iblinear本身就是為了解決較大規(guī)模樣本的模型訓(xùn)練而設(shè)計的。關(guān)于libSVM和liblinear兩者差異虚婿,不妨看看LIBSVM與LIBLINEAR
接下來的一些求解擬合參數(shù)的方法需要先了解牛頓法以及相關(guān)的知識等旋奢,先來簡單介紹一下
牛頓法(Newton's method)又稱為牛頓-拉弗森方法(Newton-Raphson method),它是一種在實(shí)數(shù)域和復(fù)數(shù)域上近似求解方程的方法然痊。該方法使用函數(shù)f(x)的泰勒級數(shù)的前幾項(xiàng)來尋找方程f(x)=0的根至朗。
在最優(yōu)化的問題中,線性最優(yōu)化至少可以使用單純行法求解剧浸,但對于非線性優(yōu)化問題锹引,牛頓法提供了一種求解的辦法。假設(shè)任務(wù)是優(yōu)化一個目標(biāo)函數(shù)f唆香,求函數(shù)f的極大極小問題嫌变,可以轉(zhuǎn)化為求解函數(shù)f的導(dǎo)數(shù)f'=0的問題,這樣求可以把優(yōu)化問題看成方程求解問題(f'=0)躬它。剩下的問題就和第一部分提到的牛頓法求解很相似了腾啥。如果是高維情況,那么牛頓法的迭代公式見圖3:
圖3中的H表示Hessian矩陣冯吓,見圖4
在上面牛頓法公式的得出過程中碑宴,其實(shí)用到了凸優(yōu)化的知識,關(guān)于凸優(yōu)化的知識桑谍,如果時充裕延柠,建議看(Convex-optimization)凸優(yōu)化-英文版,這個電子版是免費(fèi)下載的锣披,贊贞间!
雖然牛頓法比一般的梯度下降法收斂速度快,但是在高維情況下雹仿,計算目標(biāo)函數(shù)的二階偏導(dǎo)數(shù)的復(fù)雜度很大增热,而且有時候目標(biāo)函數(shù)的海森矩陣無法保持正定,不存在逆矩陣胧辽,此時牛頓法將不再能使用峻仇。因此,人們提出了擬牛頓法邑商。這個方法的基本思想是:不用二階偏導(dǎo)數(shù)而構(gòu)造出可以近似Hessian矩陣(或Hessian矩陣的逆矩陣)的正定對稱矩陣摄咆,進(jìn)而再逐步優(yōu)化目標(biāo)函數(shù)。不同的構(gòu)造方法就產(chǎn)生了不同的擬牛頓法(Quasi-Newton Methods)人断。
介紹一下擬牛頓條件:
看到了吧吭从,此時已經(jīng)不需要求解二階倒數(shù)啦,B_k+1(x_k+1-x_k)=Δf(x_k+1)-Δf(x_k)(割線方程)恶迈。上面提到根據(jù)擬牛頓條件涩金,有不同的擬牛頓方法,具體有哪些呢:-》》DFP算法、BFGS算法步做、L-BFGS算法等副渴。接下來再分別介紹一下,嘿嘿全度。
DFP算法:該算法是以William C. Davidon佳晶、Roger Fletcher、Michael J.D.Powell三人的首字母命名讼载,最初由Davidon于1959年提出,隨后被Fletcher和Powell研究和推廣中跌,是最早的擬牛頓法咨堤。
BFGS算法:該算法是以發(fā)明者Broyden、Fletcher漩符、Goldfarb和Shanno四人名字的首字母命名的一喘,BFGS算法比DFP算法更優(yōu),目前它已經(jīng)成為求解無約束非線性優(yōu)化問題最常用的方法之一嗜暴。BFGS算法已經(jīng)有較完善的局部收斂理論凸克,對其全局收斂性的研究也取得了重要成果。
L-BFGS(Limited-memory BFGS)算法:考慮到在數(shù)據(jù)很大時闷沥,BFGS中的D_k也會占用很大的空間萎战,因此,L-BFGS對BFGS算法進(jìn)行近似:不再存儲完整的矩陣D_k舆逃,而是存儲計算過程中的向量序列{s_i},{y_i}需要矩陣D_k時蚂维,利用向量序列{s_i},{y_i}的計算來代替。而且也不是將向量序列{s_i},{y_i}全部儲存路狮,而是固定存儲最新的n個(n可以根據(jù)用戶自己機(jī)器的內(nèi)存來參考)每次計算D_k時虫啥,只利用最新的n個向量序列{s_i},{y_i}。
牛頓法和擬牛頓法先介紹到這里奄妨,繼續(xù)回來sklearn中的Logistic回歸模型涂籽。在該模型的計算參數(shù)的方法,除了liblinear方法砸抛,接著介紹其他的:
2)lbfgs-》L-BFGS算法评雌,如上所述
3)newton-cg-》牛頓法,如上所述
4)sag->Stochastic Average Gradient descent
好吧直焙,又得停下來解釋sag啦柳骄,關(guān)于梯度下降算法的知識,推薦大家看一篇英文博客An overview of gradient descent optimization algorithms? 箕般,隔空膜拜~~
(1)梯度下降算法(Gradient descent)
梯度:在向量微積分中耐薯,標(biāo)量場的梯度是一個向量場。標(biāo)量場中某一點(diǎn)的梯度指向在這點(diǎn)標(biāo)量場增長最快的方向。
圖10-圖12中曲初,關(guān)于梯度的介紹体谒,見維基百科-梯度
在一些回歸分析中,為了求解參數(shù)臼婆,構(gòu)建了類似如圖13的最優(yōu)化函數(shù)抒痒,其中,h_θ(x^i)表示基于算法預(yù)估結(jié)果颁褂,J_θ(θ)表示代價函數(shù)故响,為了求解θ使得J_θ(θ)最小,那么就要不斷對J_θ(θ)求梯度颁独,且滿足圖14的迭代形式彩届,因?yàn)槊看味际钱?dāng)前的參數(shù)減去梯度,所以叫做梯度下降法
梯度下降方法的缺點(diǎn):每一次迭代誓酒,都要使用數(shù)據(jù)集合中的全部數(shù)據(jù)樟蠕,當(dāng)數(shù)據(jù)量很大時,計算量非常大靠柑,導(dǎo)致計算速度也會很慢寨辩。因此胰蝠,出現(xiàn)了隨機(jī)梯度下降法(Stochastic gradient descent,SGD)
隨機(jī)梯度下降法SGD:SGD也是利用圖13-14的方式序芦,但是每一次迭代,他不是要利用全部的數(shù)據(jù)拘央,而是每次迭代只用一個樣本隔嫡,在樣本量很大的情況下耍攘,可能只需要部分樣本就可以求解出最好的參數(shù)了。但是也正是因?yàn)檫@樣的隨機(jī)畔勤,導(dǎo)致SGD的收斂速度要小于梯度下降法的收斂速度蕾各,也就是說為了達(dá)到同樣的精度,SGD需要的總迭代次數(shù)要大于梯度下降庆揪。因此出現(xiàn)了Stochastic Average Gradient descent(SAG)這樣的優(yōu)化算法
隨機(jī)平均梯度下降法(Stochastic Average Gradient descent,SAG):
SAG算法在內(nèi)存中為每個樣本都維護(hù)一個舊的梯度y_i式曲,隨機(jī)選擇一個樣本i來更新d,并用d來更新參數(shù)x缸榛。具體來說吝羞,更新的項(xiàng)d來自于用新的梯度f^'_i(x)替換d中的舊梯度y_i,這就是
的意思内颗。如此钧排,每次更新的時候僅僅需要計算一個樣本的梯度,而不是所有樣本的梯度均澳。計算開銷與SGD無異恨溜,但是內(nèi)存開銷要大得多符衔。已經(jīng)證明SAG是一種線性收斂算法,這個速度遠(yuǎn)比SGD快糟袁。
嗯判族,在sklearn中求解Logistic回歸中參數(shù)的方法基本就是這些,終于可以開始討論Logistic回歸模型了~~呀比~
Logistic回歸模型-LogisticRegression
classsklearn.linear_model.LogisticRegression(penalty='l2',dual=False,tol=0.0001,C=1.0,fit_intercept=True,intercept_scaling=1,class_weight=None,random_state=None,solver='liblinear',max_iter=100,multi_class='ovr',verbose=0,warm_start=False,n_jobs=1)
別暈项戴,馬上是參數(shù)分析:
1)penalty->代價函數(shù)形帮,默認(rèn)是上面提到的L2;
2)dual->默認(rèn)是false周叮。如果是true辩撑,則表示使用‘Dual formulation’,這種情況僅僅適合于penalty='l2'且solver用的是liblinear的情況仿耽;只要樣本數(shù)大于特征數(shù)值合冀,最好將dual=false
3)tol->停止條件(Tolerance for stopping criteria)。默認(rèn)為float,default: 1e-4
4)C->見T圖1-2中的C氓仲,C越大,那么表示每個式子中左部分的正則化在整個代價函數(shù)中占得比重就更小得糜,默認(rèn)為1.0敬扛,必須是正的浮點(diǎn)數(shù)(a positive float)
5)fit_intercept->bool, default: True。 Specifies if a constant (a.k.a. bias or intercept) should be added to the decision function.表示是否添加特征值朝抖,與下面的intercept_scaling有關(guān)
6)intercept_scaling->float,默認(rèn)是1.0啥箭。intercept_scaling屬性起作用的條件:solver是'liblinear' 并且fit_intercept=true。那么在這種條件下治宣,特征向量X就變?yōu)榱薣X,intercept_scaling]急侥,相當(dāng)于多了一個合成的特征值
7)class_weight->dict or ‘balanced’, default: None. 默認(rèn)None表示所有的y類別權(quán)重一致
8)max_iter->最大迭代次數(shù),默認(rèn)為100侮邀;此值僅僅當(dāng)solver是“newton-cg,sag,或者lbfgs”
9)solver->{'newton-cg','lbfgs','liblinear','sag'}坏怪,默認(rèn)取值是'liblinear'。關(guān)于這四種求解參數(shù)的方法绊茧,他們與代價函數(shù)L1,L2之間的試用關(guān)系見圖17
解釋:(1)如果數(shù)據(jù)集比較小铝宵,那么利用'liblinear'就可以啦;(2)sag在處理大數(shù)據(jù)集時速度更快华畏;(3)如果不是二分類鹏秋,而是多種y類型的區(qū)分,那么liblinear就不適合了亡笑,只能用剩下的三種了侣夷;(4)'newton-cg','lbfgs','sag'這三種solver只可以處理代價函數(shù)是L2的情形;(5)在使用 ‘sag’方法時仑乌,最好將各個特征的取值利用sklearn.preprocessing先處理為數(shù)量級是一個范圍的百拓,比如都為0-1之間的琴锭,這樣才能有效的保證sag方法在使用時具有較快的收斂速度。
10)multi_class->str, {‘ovr’, ‘multinomial’}, default: ‘ovr’耐版,這個參數(shù)是針對多元分類(二元以上祠够,所以不包括solver='linlinear')》嗌‘ovr’表示binary擬合(大概就是每一類要不是0古瓤,要不是 ? ?1);‘multinomial’表示在擬合過程中腺阳,the loss minimised is the multinomial loss fit across the entire probability distribution.(非常不熟悉多類分類落君,所以不清楚這個設(shè)置到底啥意思,請大神指點(diǎn)亭引,我也會在以后慢慢了解)
11)verbose->冗余值绎速,非負(fù)整數(shù), default: 0。僅僅在solver為linlinear或者lbfgs時焙蚓,設(shè)置該取值
12)warm_start->When set to True, reuse the solution of the previous call to fit as initialization, otherwise, just erase the previous solution. Useless for liblinear solver.
終于可以寫代碼了纹冤,好開心 · · ·
栗子:繼續(xù)以sklearn的dataset中的iris數(shù)據(jù)集來計算,取其前兩個特征:
1)準(zhǔn)備數(shù)據(jù)
2)利用數(shù)據(jù)购公,訓(xùn)練Logistic回歸模型
3)在兩個特征值的取值范圍內(nèi)萌京,構(gòu)建網(wǎng)格,產(chǎn)生一些介于最值之間的等差數(shù)據(jù)數(shù)組
4)預(yù)測網(wǎng)格內(nèi)的數(shù)據(jù)
5)繪制邊界
在上圖的繪制中,用到了pcolormesh()函數(shù)比庄,它類似于pcolor()函數(shù)求妹,也是最坐標(biāo)點(diǎn)就行著色,但是不同的是:
因?yàn)榇舜畏诸愔屑岩ぃ瑈的取值為0制恍,1,2三類神凑,所以對應(yīng)的上圖24中有三種顏色吧趣。
本來還想再寫一個sklearn中的Logistic回歸的例子,但是限于篇幅耙厚,這篇文章太長了强挫,以后深入分析的時候再舉例~`~
好噠,這篇先到這里薛躬,希望有點(diǎn)用途俯渤,也希望大神們不吝賜教,謝謝大家啦~~