歡迎關(guān)注本人的微信公眾號AI_Engine
LogisticRegression
算法原理
一句話概括:邏輯回歸假設(shè)數(shù)據(jù)服從伯努利分布,通過極大化似然函數(shù)(損失函數(shù))的方法,運(yùn)用梯度下降或其他優(yōu)化算法來求解參數(shù),來達(dá)到將數(shù)據(jù)二分類的目的。
定義:邏輯回歸(Logistic Regression)是一種用于解決二分類(0 or 1)問題的機(jī)器學(xué)習(xí)方法,用于估計(jì)某種事物的可能性(不是概率)。比如某用戶購買某商品的可能性,某病人患有某種疾病的可能性,以及某廣告被用戶點(diǎn)擊的可能性等。?注意,這里用的是“可能性”,而非數(shù)學(xué)上的“概率”,logisitc回歸的結(jié)果并非數(shù)學(xué)定義中的概率值,不可以直接當(dāng)做概率值來用。該結(jié)果往往用于和其他特征值加權(quán)求和,而非直接相乘。
區(qū)別:邏輯回歸(Logistic Regression)與線性回歸(Linear Regression)都是一種廣義線性模型(generalized linear model)。邏輯回歸假設(shè)因變量y服從伯努利分布,而線性回歸假設(shè)因變量y服從高斯分布。因此與線性回歸有很多相同之處,如果去除sigmoid映射函數(shù)的話,邏輯回歸算法就是一個(gè)線性回歸。可以說,邏輯回歸是以線性回歸為理論支持的,但是邏輯回歸通過sigmoid函數(shù)引入了非線性因素,因此可以輕松處理二分類問題。
函數(shù):sigmoid函數(shù)是邏輯回歸中的假設(shè)函數(shù),正是因?yàn)閟igmoid函數(shù)與線性回歸的結(jié)合才使得邏輯回歸具有二分類的作用。sigmoid表達(dá)式與曲線如下所示:

決策邊界:閾值的方程。當(dāng)閾值為0.5時(shí),對于sigmoid函數(shù)來說z=0就是該模型的決策邊界。
損失函數(shù):在邏輯回歸中,最常用的是代價(jià)函數(shù)是交叉熵(Cross Entropy)
實(shí)例

參數(shù)
penalty:正則項(xiàng),str類型,用于指定懲罰項(xiàng)中使用的規(guī)范??蛇x參數(shù)為L1和L2,默認(rèn)為L2。L1規(guī)范假設(shè)的是模型的參數(shù)滿足拉普拉斯分布,L2假設(shè)的模型參數(shù)滿足高斯分布。所謂的范式就是加上對參數(shù)的約束,使得模型更不會(huì)過擬合(overfit),理論上可以提高模型的泛化能力。在調(diào)參時(shí)如果我們主要的目的只是為了解決過擬合,一般penalty選擇L2正則化就夠了。但是如果選擇L2正則化發(fā)現(xiàn)還是過擬合,即預(yù)測效果差的時(shí)候,就可以考慮L1正則化。另外,如果模型的特征非常多,我們希望一些不重要的特征系數(shù)歸零,從而讓模型系數(shù)稀疏化的話,也可以使用L1正則化。如果penalty是L1正則化的話,就只能選擇liblinear了。這是因?yàn)長1正則化的損失函數(shù)不是連續(xù)可導(dǎo)的,而newton-cg,lbfgs,sag這三種優(yōu)化算法時(shí)都需要損失函數(shù)的一階或者二階連續(xù)導(dǎo)數(shù)。而liblinear并沒有這個(gè)依賴。
c:正則化系數(shù)λ的倒數(shù),也就是說數(shù)值越小表示正則化程度越強(qiáng)。float類型,默認(rèn)為1.0,且必須是正浮點(diǎn)型數(shù)。
solver:優(yōu)化算法選擇參數(shù),只有五個(gè)可選參數(shù)。newton-cg,lbfgs,liblinear,sag,saga,默認(rèn)為liblinear。solver參數(shù)決定了我們對邏輯回歸損失函數(shù)的優(yōu)化方法.有5種算法可以選擇,分別是:
1. liblinear:使用了開源的liblinear庫實(shí)現(xiàn),內(nèi)部使用了坐標(biāo)軸下降法來迭代優(yōu)化損失函數(shù)。
2. lbfgs:擬牛頓法的一種,利用損失函數(shù)二階導(dǎo)數(shù)矩陣即海森矩陣來迭代優(yōu)化損失函數(shù)。
3. newton-cg:也是牛頓法家族的一種,利用損失函數(shù)二階導(dǎo)數(shù)矩陣即海森矩陣來迭代優(yōu)化損失函數(shù)。
4. sag:即隨機(jī)平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區(qū)別是每次迭代僅僅用一部分的樣本來計(jì)算梯度,適合于樣本數(shù)據(jù)多的時(shí)候。
5. saga:線性收斂的隨機(jī)優(yōu)化算法的的變種。
總結(jié):
liblinear適用于小數(shù)據(jù)集,而sag和saga適用于大數(shù)據(jù)集因?yàn)樗俣雀臁?/p>
對于多分類問題,只有newton-cg,sag,saga和lbfgs能夠處理多項(xiàng)損失,而liblinear得先把一種類別作為一個(gè)類別,剩余的所有類別作為另外一個(gè)類別。依次遍歷所有類別進(jìn)行分類。
newton-cg、sag、lbfgs這三種優(yōu)化算法時(shí)都需要損失函數(shù)的一階或者二階連續(xù)導(dǎo)數(shù),因此不能用于沒有連續(xù)導(dǎo)數(shù)的L1正則化,只能用于L2正則化。而liblinear和saga通吃L1正則化和L2正則化。
sag每次僅僅使用了部分樣本進(jìn)行梯度迭代,所以當(dāng)樣本量少的時(shí)候不要選擇它,而如果樣本量非常大,比如大于10萬,sag是第一選擇。但是sag不能用于L1正則化,所以當(dāng)你有大量的樣本,又需要L1正則化的話就要自己做取舍了。要么通過對樣本采樣來降低樣本量,要么回到L2正則化。
從上面的描述,大家可能覺得,既然newton-cg, lbfgs和sag這么多限制,如果不是大樣本,我們選擇liblinear不就行了嘛!錯(cuò),因?yàn)閘iblinear也有自己的弱點(diǎn)!我們知道,邏輯回歸有二元邏輯回歸和多元邏輯回歸。對于多元邏輯回歸常見的有one-vs-rest(OvR)和many-vs-many(MvM)兩種。而MvM一般比OvR分類相對準(zhǔn)確一些。郁悶的是liblinear只支持OvR,不支持MvM,這樣如果我們需要相對精確的多元邏輯回歸時(shí),就不能選擇liblinear了。也意味著如果我們需要相對精確的多元邏輯回歸不能使用L1正則化了
class_weight參數(shù)用于標(biāo)示分類模型中各種類型的權(quán)重,可以不輸入,即不考慮權(quán)重,或者說所有類型的權(quán)重一樣。如果選擇輸入的話,可以選擇balanced讓類庫自己計(jì)算類型權(quán)重,或者我們自己輸入各個(gè)類型的權(quán)重,比如對于0,1的二元模型,我們可以定義class_weight={0:0.9, 1:0.1},這樣類型0的權(quán)重為90%,而類型1的權(quán)重為10%。如果class_weight選擇balanced,那么類庫會(huì)根據(jù)訓(xùn)練樣本量來計(jì)算權(quán)重。某種類型樣本量越多,則權(quán)重越低,樣本量越少,則權(quán)重越高。那么class_weight有什么作用呢?在分類模型中,我們經(jīng)常會(huì)遇到兩類問題:第一種是誤分類的代價(jià)很高。比如對合法用戶和非法用戶進(jìn)行分類,將非法用戶分類為合法用戶的代價(jià)很高,我們寧愿將合法用戶分類為非法用戶,這時(shí)可以人工再甄別,但是卻不愿將非法用戶分類為合法用戶。這時(shí),我們可以適當(dāng)提高非法用戶的權(quán)重。第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數(shù)據(jù)10000條,里面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權(quán)重,則我們可以將所有的測試集都預(yù)測為合法用戶,這樣預(yù)測準(zhǔn)確率理論上有99.95%,但是卻沒有任何意義。這時(shí),我們可以選擇balanced,讓類庫自動(dòng)提高非法用戶樣本的權(quán)重。提高了某種分類的權(quán)重,相比不考慮權(quán)重,會(huì)有更多的樣本分類劃分到高權(quán)重的類別,從而可以解決上面兩類問題。當(dāng)然,對于第二種樣本失衡的情況,我們還可以考慮用下一節(jié)講到的樣本權(quán)重參數(shù):sample_weight,不使用class_weight。
sample_weight:在調(diào)用fit函數(shù)時(shí)來自己調(diào)節(jié)每個(gè)樣本權(quán)重。
max_iter:算法收斂最大迭代次數(shù)。int類型,默認(rèn)為10。僅在正則化優(yōu)化算法為newton-cg, sag和lbfgs才有用,算法收斂的最大迭代次數(shù)。
multi_class:分類方式選擇參數(shù),str類型,可選參數(shù)為ovr和multinomial,默認(rèn)為ovr。ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元邏輯回歸,ovr和multinomial并沒有任何區(qū)別,區(qū)別主要在多元邏輯回歸上。
OvR和MvM的不同: OvR的思想很簡單,無論你是多少元邏輯回歸,我們都可以看做二元邏輯回歸。具體做法是,對于第K類的分類決策,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負(fù)例。然后在上面做二元邏輯回歸,得到第K類的分類模型,其他類的分類模型獲得以此類推。而MvM則相對復(fù)雜,這里舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類,我們每次在所有的T類樣本里面選擇兩類樣本出來,不妨記為T1類和T2類,把所有的輸出為T1和T2的樣本放在一起,把T1作為正例,T2作為負(fù)例,進(jìn)行二元邏輯回歸,得到模型參數(shù)。我們一共需要T(T-1)/2次分類??梢钥闯鯫vR相對簡單,但分類效果相對略差(這里指大多數(shù)樣本分布情況,某些樣本分布下OvR可能更好)。而MvM分類相對精確,但是分類速度沒有OvR快。如果選擇了ovr,則4種損失函數(shù)的優(yōu)化方法liblinear,newton-cg,lbfgs和sag都可以選擇。但是如果選擇了multinomial,則只能選擇newton-cg, lbfgs和sag了。
面試總結(jié)
?
1.邏輯回歸的求解
由于該極大似然函數(shù)無法直接求解,我們一般通過對該函數(shù)進(jìn)行梯度下降來不斷逼急最優(yōu)解。梯度下降分為隨機(jī)梯度下降,批梯度下降,small batch梯度下降三種方式,批梯度下降會(huì)獲得全局最優(yōu)解,缺點(diǎn)是在更新每個(gè)參數(shù)的時(shí)候需要遍歷所有的數(shù)據(jù),計(jì)算量會(huì)很大,并且會(huì)有很多的冗余計(jì)算,導(dǎo)致的結(jié)果是當(dāng)數(shù)據(jù)量大的時(shí)候,每個(gè)參數(shù)的更新都會(huì)很慢。隨機(jī)梯度下降是以高方差頻繁更新,優(yōu)點(diǎn)是使得sgd會(huì)跳到新的和潛在更好的局部最優(yōu)解,缺點(diǎn)是使得收斂到局部最優(yōu)解的過程更加的復(fù)雜。小批量梯度下降結(jié)合了sgd和batch gd的優(yōu)點(diǎn),每次更新的時(shí)候使用n個(gè)樣本。減少了參數(shù)更新的次數(shù),可以達(dá)到更加穩(wěn)定收斂結(jié)果,一般在深度學(xué)習(xí)當(dāng)中我們采用這種方法。另外,對于學(xué)習(xí)率問題中的Adam,動(dòng)量法等優(yōu)化方法是衍生的考點(diǎn)。第一個(gè)考點(diǎn)是如何對模型選擇合適的學(xué)習(xí)率,因?yàn)楸3滞瑯拥膶W(xué)習(xí)率其實(shí)不太合適。一開始參數(shù)剛剛開始學(xué)習(xí)的時(shí)候,此時(shí)的參數(shù)和最優(yōu)解隔的比較遠(yuǎn),需要保持一個(gè)較大的學(xué)習(xí)率盡快逼近最優(yōu)解。但是學(xué)習(xí)到后面的時(shí)候,參數(shù)和最優(yōu)解已經(jīng)隔的比較近了,若保持最初的大學(xué)習(xí)率,容易越過最優(yōu)點(diǎn),在最優(yōu)點(diǎn)附近來回振蕩。第二個(gè)考點(diǎn)是如何對參數(shù)選擇合適的學(xué)習(xí)率。在實(shí)踐中,對每個(gè)參數(shù)都保持的同樣的學(xué)習(xí)率也是很不合理的。有些參數(shù)更新頻繁,那么學(xué)習(xí)率可以適當(dāng)小一點(diǎn)。有些參數(shù)更新緩慢,那么學(xué)習(xí)率就應(yīng)該大一點(diǎn)。
2.邏輯回歸在訓(xùn)練的過程當(dāng)中,如果有很多的特征高度相關(guān)或者說有一個(gè)特征重復(fù)了100遍,會(huì)造成怎樣的影響?
對特征本身來說的話,假設(shè)只有一個(gè)特征,在不考慮采樣的情況下,你現(xiàn)在將它重復(fù)100遍。訓(xùn)練時(shí)這個(gè)特征重復(fù)使用了100遍,實(shí)質(zhì)上是將原來的特征分成了100份,每一個(gè)特征都是原來特征權(quán)重值的百分之一。如果在隨機(jī)采樣的情況下,其實(shí)訓(xùn)練收斂完以后,還是可以認(rèn)為這100個(gè)特征和原來那一個(gè)特征扮演的效果一樣,只是可能中間很多特征的值正負(fù)相消了。所以,如果在損失函數(shù)最終收斂的情況下,其實(shí)就算有很多特征高度相關(guān)也不會(huì)影響分類器的效果。
3.為什么我們還是會(huì)在訓(xùn)練的過程當(dāng)中將高度相關(guān)的特征去掉?
去掉高度相關(guān)的特征會(huì)讓模型的可解釋性更好,且提高訓(xùn)練的速度。如果模型當(dāng)中有很多特征高度相關(guān)的話,就算損失函數(shù)本身收斂了,但實(shí)際上參數(shù)是沒有收斂的,這樣會(huì)拉低訓(xùn)練的速度。其次是特征多了,本身也會(huì)增大訓(xùn)練的時(shí)間。