邏輯回歸由于其簡單高效、易于解釋,是工業(yè)應(yīng)用最為廣泛的模型之一,比如用于金融風(fēng)控領(lǐng)域的評分卡、互聯(lián)網(wǎng)的推薦系統(tǒng)。上文總結(jié)了邏輯回歸的原理及其實(shí)現(xiàn)【全面解析并實(shí)現(xiàn)邏輯回歸(Python)】 。
本文從實(shí)際應(yīng)用出發(fā),以數(shù)據(jù)特征、優(yōu)化算法、模型優(yōu)化等方面,全面地歸納了邏輯回歸(LR)優(yōu)化技巧。
一、LR的特征生成 邏輯回歸是簡單的廣義線性模型,模型的擬合能力很有限,無法學(xué)習(xí)到特征間交互的非線性信息:一個(gè)經(jīng)典的示例是LR無法正確分類非線性的XOR數(shù)據(jù),而通過引入非線性的特征(特征生成),可在更高維特征空間實(shí)現(xiàn)XOR線性可分,如下示例代碼:
# 生成xor數(shù)據(jù) import pandas as pd xor_dataset = pd.DataFrame([[1,1,0],[1,0,1],[0,1,1],[0,0,0]],columns=['x0' ,'x1' ,'label' ]) x,y = xor_dataset[['x0' ,'x1' ]], xor_dataset['label' ] xor_dataset.head()# keras實(shí)現(xiàn)邏輯回歸 from keras.layers import * from keras.models import Sequential, Model from tensorflow import random np.random.seed(5) # 固定隨機(jī)種子 random.set_seed(5) model = Sequential() model.add(Dense(1, input_dim=3, activation='sigmoid' )) model.summary() model.compile(optimizer='adam' , loss='binary_crossentropy' ) xor_dataset['x2' ] = xor_dataset['x0' ] * xor_dataset['x1' ] # 加入非線性特征 x,y = xor_dataset[['x0' ,'x1' ,'x2' ]], xor_dataset['label' ] model.fit(x, y, epochs=10000,verbose=False)print ('正確標(biāo)簽:' ,y.values)print ('模型預(yù)測:' ,model.predict(x).round())# 正確標(biāo)簽: [0 1 1 0] 模型預(yù)測: [0 1 1 0]
業(yè)界常說“數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個(gè)上限而已”。由于LR是簡單模型,其特征質(zhì)量基本決定了其最終效果(也就是簡單模型要比較折騰特征工程)。
LR常用特征生成(提取)的方式主要有3種:
人工結(jié)合業(yè)務(wù)衍生特征: 人工特征的好處是加工出的特征比較有業(yè)務(wù)解釋性,更貼近實(shí)際業(yè)務(wù)。缺點(diǎn)是很依賴業(yè)務(wù)知識,耗時(shí)。
特征衍生工具 :如通過featuretools暴力衍生特征(相關(guān)代碼可以參考【特征生成方法】 ),ft生成特征的常用方法有聚合(求平均值、最大值最小值)、轉(zhuǎn)換(特征間加減乘除)的方式。暴力衍生特征速度較快。缺點(diǎn)是更占用計(jì)算資源,容易產(chǎn)生一些噪音,而且不太適合要求特征解釋性的場景。(需要注意的:簡單地加減做線性加工特征的方法對于LR是沒必要的,模型可以自己表達(dá))
如POLY2、引入隱向量的因子分解機(jī)(FM)可以看做是LR的基礎(chǔ)上,對所有特征進(jìn)行了兩兩交叉,生成非線性的特征組合。
但FM等方法只能夠做二階的特征交叉,更為有效的是,利用GBDT自動(dòng)進(jìn)行篩選特征并生成特征組合 。也就是提取GBDT子樹的特征劃分及組合路徑作為新的特征,再把該特征向量當(dāng)作LR模型輸入,也就是推薦系統(tǒng)經(jīng)典的GBDT +LR方法。(需要注意的,GBDT子樹深度太深的化,特征組合層次比較高,極大提高LR模型擬合能力的同時(shí),也容易引入一些噪聲,導(dǎo)致模型過擬合)
如下GBDT+LR的代碼實(shí)現(xiàn)(基于癌細(xì)胞數(shù)據(jù)集),提取GBDT特征,并與原特征拼接: 訓(xùn)練并評估模型有著較優(yōu)的分類效果:
## GBDT +LR ,公眾號閱讀原文,可訪問Github源碼 from sklearn.preprocessing import OneHotEncoder from sklearn.ensemble import GradientBoostingClassifier gbdt = GradientBoostingClassifier(n_estimators=50, random_state=10, subsample=0.8, max_depth=6, min_samples_split=20) gbdt.fit(x_train, y_train) # GBDT 訓(xùn)練集訓(xùn)練 train_new_feature = gbdt.apply(x) # 返回?cái)?shù)據(jù)在訓(xùn)練好的模型里每棵樹中所處的葉子節(jié)點(diǎn)的位置 print (train_new_feature.shape) train_new_feature = train_new_feature.reshape(-1, 50) display(train_new_feature)print (train_new_feature.shape) enc = OneHotEncoder() enc.fit(train_new_feature) train_new_feature2 = np.array(enc.transform(train_new_feature).toarray()) # onehot表示 print (train_new_feature2.shape) train_new_feature2
二、特征離散化及編碼表示 LR對于連續(xù)性的數(shù)值特征的輸入,通常需要對特征做下max-min歸一化(x =x-min/(max-min),轉(zhuǎn)換輸出為在 0-1之間的數(shù),這樣可以加速模型計(jì)算及訓(xùn)練收斂。但其實(shí)在工業(yè)界,很少直接將連續(xù)值作為邏輯回歸模型的特征輸入,而是先將連續(xù)特征離散化(常用的有等寬、等頻、卡方分箱、決策樹分箱等方式,而分箱的差異也直接影響著模型效果),然后做(Onehot、WOE)編碼再輸入模型。
之所以這樣做,我們回到模型的原理,邏輯回歸是廣義線性模型,模型無非就是對特征線性的加權(quán)求和,在通過sigmoid歸一化為概率。這樣的特征表達(dá)是很有限的。以年齡這個(gè)特征在識別是否存款為例。在lr中,年齡作為一個(gè)特征對應(yīng)一個(gè)權(quán)重w控制,輸出值 = sigmoid(...+age * w+..),可見年齡數(shù)值大小在模型參數(shù)w的作用下只能呈線性表達(dá)。
但是對于年齡這個(gè)特征來說,不同的年齡值,對模型預(yù)測是否會存款,應(yīng)該不是線性關(guān)系,比如0-18歲可能對于存款是負(fù)相關(guān),19-55對于存款可能就正相關(guān)。這意味著不同的特征值,需要不同模型參數(shù)來更好地表達(dá)。也就是通過對特征進(jìn)行離散化,比如年齡可以離散化以及啞編碼(onehot)轉(zhuǎn)換成4個(gè)特征(if_age<18, if_18<age<30,if_30<age<55,if_55<age )輸入lr模型,就可以用4個(gè)模型參數(shù)分別控制這4個(gè)離散特征的表達(dá):sigmoid(...+age1 * w1+age2 * w2..),這明顯可以增加模型的非線性表達(dá),提高了擬合能力 。
在風(fēng)控領(lǐng)域,特征離散后更常用特征表示(編碼)還不是onehot,而是WOE編碼。 woe編碼是通過對當(dāng)前分箱中正負(fù)樣本的比值Pyi與所有樣本中正負(fù)樣本比值Pni的差異(如上式),計(jì)算出各個(gè)分箱的woe值,作為該分箱的數(shù)值表示。
經(jīng)過分箱、woe編碼后的特征很像是決策樹的決策過程,以年齡特征為例:if age >18 and age<22 then return - 0.57(年齡數(shù)值轉(zhuǎn)為對應(yīng)WOE值); if age >44 then return 1.66;...;將這樣的分箱及編碼(對應(yīng)樹的特征劃分、葉子節(jié)點(diǎn)值)輸入LR,很類似于決策樹與LR的模型融合,而提高了模型的非線性表達(dá)。
總結(jié)下離散化編碼的優(yōu)點(diǎn):
邏輯回歸的擬合能力有限,當(dāng)變量離散化為N個(gè)后,每個(gè)變量有單獨(dú)的權(quán)重,相當(dāng)于為模型引入了非線性,能夠提升模型擬合能力的同時(shí),也有更好的解釋性。而且離散化后可以方便地進(jìn)行特征交叉,由M+N個(gè)變量變?yōu)镸*N個(gè)變量,可以進(jìn)一步提升表達(dá)能力。 離散化后的特征對異常數(shù)據(jù)有較強(qiáng)的魯棒性:比如一個(gè)特征是年齡>44是1,否則0。如果特征沒有離散化,一個(gè)異常數(shù)據(jù)“年齡200歲”輸入會給模型造成很大的干擾,而將其離散后歸到相應(yīng)的分箱影響就有限。 離散化后模型會更穩(wěn)定,且不容易受到噪聲影響,減少過擬合風(fēng)險(xiǎn):比如對用戶年齡離散化,18-22作為一個(gè)區(qū)間,不會因?yàn)橐粋€(gè)用戶年齡長了一歲就變成一個(gè)完全不同樣本。 三、特征選擇 特征選擇用于篩選出顯著特征、摒棄非顯著特征??梢越档瓦\(yùn)算開銷,減少干擾噪聲,降低過擬合風(fēng)險(xiǎn),提升模型效果。對于邏輯回歸常用如下三種選擇方法:
過濾法 :利用缺失率、單值率、方差、pearson相關(guān)系數(shù)、VIF、IV值、PSI、P值等指標(biāo)對特征進(jìn)行篩選;(相關(guān)介紹及代碼可見:【特征選擇】 )
嵌入法 :使用帶L1正則項(xiàng)的邏輯回歸,有特征選擇(稀疏解)的效果;
包裝法 :使用逐步邏輯回歸,雙向搜索選擇特征。
其中,過濾法提到的VIF是共線性指標(biāo),其原理是分別嘗試以各個(gè)特征作為標(biāo)簽,用其他特征去學(xué)習(xí)擬合,得到線性回歸模型擬合效果的R^2值,算出各個(gè)特征的VIF。特征的VIF為1,即無法用其他特征擬合出當(dāng)前特征,特征之間完全沒有共線性(工程上常用VIF<10作為閾值) 共線性對于廣義線性模型主要影響了特征實(shí)際的顯著性及權(quán)重參數(shù)(比如,該特征業(yè)務(wù)上應(yīng)該正相關(guān),而權(quán)重值卻是負(fù)的),也會消弱模型解釋性以及模型訓(xùn)練的穩(wěn)定性。
四、模型層面的優(yōu)化 4.1 截距項(xiàng) 通過設(shè)置截距項(xiàng)(偏置項(xiàng))b可以提高邏輯回歸的擬合能力。截距項(xiàng)可以簡單理解為模型多了一個(gè)參數(shù)b(也可以看作是新增一列常數(shù)項(xiàng)特征對應(yīng)的參數(shù)w0),這樣的模型復(fù)雜度更高,有更好的擬合效果。
如果沒有截距項(xiàng)b呢?我們知道邏輯回歸的決策邊界是線性的(即決策邊界為W * X + b),如果沒有截距項(xiàng)(即W * X),決策邊界就限制在必須是通過坐標(biāo)圓點(diǎn)的,這樣的限制很有可能導(dǎo)致模型收斂慢、精度差,擬合不好數(shù)據(jù),即容易欠擬合。
4.2 正則化策略 通過設(shè)定正則項(xiàng)可以減少模型的過擬合風(fēng)險(xiǎn),常用的正則策略有L1,L2正則化:
L2 參數(shù)正則化 (也稱為嶺回歸、Tikhonov 正則) 通常被稱為權(quán)重衰減 (weight decay),是通過向?標(biāo)函數(shù)添加?個(gè)正則項(xiàng) ?(θ) ,使權(quán)重更加接近原點(diǎn),模型更為簡單。從貝葉斯角度,L2的約束項(xiàng)可以視為模型參數(shù)引入先驗(yàn)的高斯分布約束(參見《Lazy Sparse Stochastic Gradient Descent for Regularized》 )。如下為目標(biāo)函數(shù)J再加上L2正則式: 對帶L2目標(biāo)函數(shù)的模型參數(shù)更新權(quán)重,?學(xué)習(xí)率: 從上式可以看出,加?權(quán)重衰減后會導(dǎo)致學(xué)習(xí)規(guī)則的修改,即在每步執(zhí)?梯度更新前先收縮權(quán)重 (乘以 1 ? ?α ),有權(quán)重衰減的效果。
L1 正則化(Lasso回歸)是通過向?標(biāo)函數(shù)添加?個(gè)參數(shù)懲罰項(xiàng) ?(θ),為各個(gè)參數(shù)的絕對值之和。從貝葉斯角度,L1的約束項(xiàng)也可以視為模型參數(shù)引入拉普拉斯分布約束。如下為目標(biāo)函數(shù)J再加上L1正則式: 對帶L1目標(biāo)函數(shù)的模型參數(shù)更新權(quán)重(其中 sgn(x) 為符號函數(shù),取參數(shù)的正負(fù)號): 可見,在-αsgn(w)項(xiàng)的作用下, w各元素每步更新后的權(quán)重向量都會平穩(wěn)地向0靠攏,w的部分元素容易為0,造成稀疏性。
總結(jié)下L1,L2正則項(xiàng):
L1,L2都是限制解空間,減少模型容量的方法,以到達(dá)減少過擬合的效果。L2范式約束具有產(chǎn)生平滑解的效果,沒有稀疏解的能力,即參數(shù)并不會出現(xiàn)很多零。假設(shè)我們的決策結(jié)果與兩個(gè)特征有關(guān),L2正則傾向于綜合兩者的影響,給影響大的特征賦予高的權(quán)重;而L1正則傾向于選擇影響較大的參數(shù),而盡可能舍棄掉影響較小的那個(gè)(有稀疏解效果)。在實(shí)際應(yīng)用中 L2正則表現(xiàn)往往會優(yōu)于 L1正則,但 L1正則會壓縮模型,降低計(jì)算量。
4.3 多分類任務(wù) 當(dāng)邏輯回歸應(yīng)用于二分類任務(wù)時(shí)有兩種主要思路,
沿用Sigmoid激活函數(shù)的二分類思路,把多分類變成多個(gè)二分類組合有兩種實(shí)現(xiàn)方式:OVR(one-vs-rest)的思想就是用一個(gè)類別去與其他匯總的類別進(jìn)行二分類, 進(jìn)行多次這樣的分類, 選擇概率值最大的那個(gè)類別;OVO(One vs One)每個(gè)分類器只挑兩個(gè)類別做二分類, 得出屬于哪一類,最后把所有分類器的結(jié)果放在一起, 選擇最多的那個(gè)類別,如下圖:
另外一種,將Sigmoid激活函數(shù)換成softmax函數(shù),相應(yīng)的模型也可以叫做多元邏輯回歸(Multinomial Logistic Regression),即可適用于多分類的場景。softmax函數(shù)簡單來說就是將多個(gè)神經(jīng)元(神經(jīng)元數(shù)目為類別數(shù))輸出的結(jié)果映射到對于總輸出的占比(范圍0~1,占比可以理解成概率值),我們通過選擇概率最大輸出類別作為預(yù)測類別。
如下softmax函數(shù)及對應(yīng)的多分類目標(biāo)函數(shù): softmax回歸中,一般是假設(shè)多個(gè)類別是互斥的,樣本在softmax中的概率公式中計(jì)算后得到的是樣本屬于各個(gè)類別的值,各個(gè)類別的概率之和一定為1,而采用logistic回歸OVR進(jìn)行多分類時(shí),得到的是值是樣本相對于其余類別而言屬于該類別的概率,一個(gè)樣本在多個(gè)分類器上計(jì)算后得到的結(jié)果不一定為1。因而當(dāng)分類的目標(biāo)類別是互斥時(shí)(例如分辨貓、豬、狗圖片),常采用softmax回歸進(jìn)行預(yù)測,而分類目標(biāo)類別不是很互斥時(shí)(例如分辨流行音樂、搖滾、華語),可以采用邏輯回歸建立多個(gè)二分類器(也可考慮下多標(biāo)簽分類)。
4.4 學(xué)習(xí)目標(biāo) 邏輯回歸使用最小化交叉熵?fù)p失作為目標(biāo)函數(shù),
為什么不能用MSE均方誤差? 簡單來說,有以下幾點(diǎn):
MSE 損失函數(shù)的背景假設(shè)是數(shù)據(jù)誤差遵循高斯分布,而二分類問題并不符合這個(gè)假設(shè) 。 交叉熵的損失函數(shù)只關(guān)注真實(shí)類別對應(yīng)預(yù)測誤差的差異。而MSE無差別地關(guān)注全部類別上預(yù)測概率和真實(shí)類別的誤差,除了增大正確的分類,還會讓錯(cuò)誤的分類數(shù)值變得平均。 MSE 函數(shù)對于sigmoid二分類問題來說是非凸的,且求導(dǎo)的時(shí)候都會有對sigmoid的求導(dǎo)連乘運(yùn)算,導(dǎo)數(shù)值可能很小而導(dǎo)致收斂變慢,不能保證將損失函數(shù)極小化。但mse也不是完全不能用于分類,對于分類軟標(biāo)簽就可以考慮MSE。 4.5 優(yōu)化算法 最大似然下的邏輯回歸沒有解析解,我們常用梯度下降之類的算法迭代優(yōu)化得到局部較優(yōu)的參數(shù)解。
如果是Keras等神經(jīng)網(wǎng)絡(luò)庫建模,梯度下降算法類有SGD、Momentum、Adam等優(yōu)化算法可選。對于大多數(shù)任務(wù)而言,通??梢灾苯酉仍囅翧dam,然后可以繼續(xù)在具體任務(wù)上驗(yàn)證不同優(yōu)化算法效果。
如果用的是scikitl-learn庫建模,優(yōu)化算法主要有l(wèi)iblinear(坐標(biāo)下降)、newton-cg(擬牛頓法), lbfgs(擬牛頓法)和sag(隨機(jī)平均梯度下降)。liblinear支持L1和L2,只支持OvR做多分類;“l(fā)bfgs”, “sag” “newton-cg”只支持L2,支持OvR和MvM做多分類;當(dāng)數(shù)據(jù)量特別大,優(yōu)先sag!
4.6 模型評估 優(yōu)化模型閾值(cutoff點(diǎn)) : 當(dāng)評估指標(biāo)是分類Precision、Recall等指標(biāo)時(shí),可以通過優(yōu)化模型閾值(默認(rèn)0.5)提高分類效果。常用可以根據(jù)不同劃分閾值下的presion與recall曲線(P-R曲線),做出權(quán)衡,選擇合適的模型閾值。4.7 可解釋性 邏輯回歸模型很大的優(yōu)勢就是可解釋性,上節(jié)提到通過離散化編碼(如Onehot)可以提高擬合效果及解釋性,如下特征離散后Onehot編碼: 決策過程也就是對特征分箱Xn及其模型權(quán)重Wn的加權(quán)求和,然后sigmoid轉(zhuǎn)為概率,而通過模型權(quán)重值的大小就可以知道各特征對于決策的實(shí)際影響程度,比如特征'年齡在[18,30]'對應(yīng)學(xué)到權(quán)重值W為-0.8,也就是呈現(xiàn)負(fù)相關(guān)。