鍵.png)
使用這些基本 REST API 最佳實(shí)踐構(gòu)建出色的 API
# 生成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種:
如POLY2、引入隱向量的因子分解機(jī)(FM)可以看做是LR的基礎(chǔ)上,對(duì)所有特征進(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)練并評(píng)估模型有著較優(yōu)的分類效果:
## GBDT +LR ,公眾號(hào)閱讀原文,可訪問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對(duì)于連續(xù)性的數(shù)值特征的輸入,通常需要對(duì)特征做下max-min歸一化(x =x-min/(max-min),轉(zhuǎn)換輸出為在 0-1之間的數(shù),這樣可以加速模型計(jì)算及訓(xùn)練收斂。但其實(shí)在工業(yè)界,很少直接將連續(xù)值作為邏輯回歸模型的特征輸入,而是先將連續(xù)特征離散化(常用的有等寬、等頻、卡方分箱、決策樹分箱等方式,而分箱的差異也直接影響著模型效果),然后做(Onehot、WOE)編碼再輸入模型。
之所以這樣做,我們回到模型的原理,邏輯回歸是廣義線性模型,模型無非就是對(duì)特征線性的加權(quán)求和,在通過sigmoid歸一化為概率。這樣的特征表達(dá)是很有限的。以年齡這個(gè)特征在識(shí)別是否存款為例。在lr中,年齡作為一個(gè)特征對(duì)應(yīng)一個(gè)權(quán)重w控制,輸出值 = sigmoid(…+age * w+..),可見年齡數(shù)值大小在模型參數(shù)w的作用下只能呈線性表達(dá)。
但是對(duì)于年齡這個(gè)特征來說,不同的年齡值,對(duì)模型預(yù)測是否會(huì)存款,應(yīng)該不是線性關(guān)系,比如0-18歲可能對(duì)于存款是負(fù)相關(guān),19-55對(duì)于存款可能就正相關(guān)。這意味著不同的特征值,需要不同模型參數(shù)來更好地表達(dá)。也就是通過對(duì)特征進(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編碼是通過對(duì)當(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)為對(duì)應(yīng)WOE值); if age >44 then return 1.66;…;將這樣的分箱及編碼(對(duì)應(yīng)樹的特征劃分、葉子節(jié)點(diǎn)值)輸入LR,很類似于決策樹與LR的模型融合,而提高了模型的非線性表達(dá)。
總結(jié)下離散化編碼的優(yōu)點(diǎn):
特征選擇用于篩選出顯著特征、摒棄非顯著特征。可以降低運(yùn)算開銷,減少干擾噪聲,降低過擬合風(fēng)險(xiǎn),提升模型效果。對(duì)于邏輯回歸常用如下三種選擇方法:
過濾法:利用缺失率、單值率、方差、pearson相關(guān)系數(shù)、VIF、IV值、PSI、P值等指標(biāo)對(duì)特征進(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作為閾值)
共線性對(duì)于廣義線性模型主要影響了特征實(shí)際的顯著性及權(quán)重參數(shù)(比如,該特征業(yè)務(wù)上應(yīng)該正相關(guān),而權(quán)重值卻是負(fù)的),也會(huì)消弱模型解釋性以及模型訓(xùn)練的穩(wěn)定性。
通過設(shè)置截距項(xiàng)(偏置項(xiàng))b可以提高邏輯回歸的擬合能力。截距項(xiàng)可以簡單理解為模型多了一個(gè)參數(shù)b(也可以看作是新增一列常數(shù)項(xiàng)特征對(duì)應(yīng)的參數(shù)w0),這樣的模型復(fù)雜度更高,有更好的擬合效果。
如果沒有截距項(xiàng)b呢?我們知道邏輯回歸的決策邊界是線性的(即決策邊界為W * X + b),如果沒有截距項(xiàng)(即W * X),決策邊界就限制在必須是通過坐標(biāo)圓點(diǎn)的,這樣的限制很有可能導(dǎo)致模型收斂慢、精度差,擬合不好數(shù)據(jù),即容易欠擬合。
通過設(shè)定正則項(xiàng)可以減少模型的過擬合風(fēng)險(xiǎn),常用的正則策略有L1,L2正則化:
對(duì)帶L2目標(biāo)函數(shù)的模型參數(shù)更新權(quán)重,?學(xué)習(xí)率:
從上式可以看出,加?權(quán)重衰減后會(huì)導(dǎo)致學(xué)習(xí)規(guī)則的修改,即在每步執(zhí)?梯度更新前先收縮權(quán)重 (乘以 1 ? ?α ),有權(quán)重衰減的效果。
對(duì)帶L1目標(biāo)函數(shù)的模型參數(shù)更新權(quán)重(其中 sgn(x) 為符號(hào)函數(shù),取參數(shù)的正負(fù)號(hào)):
可見,在-αsgn(w)項(xiàng)的作用下, w各元素每步更新后的權(quán)重向量都會(huì)平穩(wěn)地向0靠攏,w的部分元素容易為0,造成稀疏性。
L1,L2都是限制解空間,減少模型容量的方法,以到達(dá)減少過擬合的效果。L2范式約束具有產(chǎn)生平滑解的效果,沒有稀疏解的能力,即參數(shù)并不會(huì)出現(xiàn)很多零。假設(shè)我們的決策結(jié)果與兩個(gè)特征有關(guān),L2正則傾向于綜合兩者的影響,給影響大的特征賦予高的權(quán)重;而L1正則傾向于選擇影響較大的參數(shù),而盡可能舍棄掉影響較小的那個(gè)(有稀疏解效果)。在實(shí)際應(yīng)用中 L2正則表現(xiàn)往往會(huì)優(yōu)于 L1正則,但 L1正則會(huì)壓縮模型,降低計(jì)算量。
當(dāng)邏輯回歸應(yīng)用于二分類任務(wù)時(shí)有兩種主要思路,
另外一種,將Sigmoid激活函數(shù)換成softmax函數(shù),相應(yīng)的模型也可以叫做多元邏輯回歸(Multinomial Logistic Regression),即可適用于多分類的場景。softmax函數(shù)簡單來說就是將多個(gè)神經(jīng)元(神經(jīng)元數(shù)目為類別數(shù))輸出的結(jié)果映射到對(duì)于總輸出的占比(范圍0~1,占比可以理解成概率值),我們通過選擇概率最大輸出類別作為預(yù)測類別。
如下softmax函數(shù)及對(duì)應(yīng)的多分類目標(biāo)函數(shù):
softmax回歸中,一般是假設(shè)多個(gè)類別是互斥的,樣本在softmax中的概率公式中計(jì)算后得到的是樣本屬于各個(gè)類別的值,各個(gè)類別的概率之和一定為1,而采用logistic回歸OVR進(jìn)行多分類時(shí),得到的是值是樣本相對(duì)于其余類別而言屬于該類別的概率,一個(gè)樣本在多個(gè)分類器上計(jì)算后得到的結(jié)果不一定為1。因而當(dāng)分類的目標(biāo)類別是互斥時(shí)(例如分辨貓、豬、狗圖片),常采用softmax回歸進(jìn)行預(yù)測,而分類目標(biāo)類別不是很互斥時(shí)(例如分辨流行音樂、搖滾、華語),可以采用邏輯回歸建立多個(gè)二分類器(也可考慮下多標(biāo)簽分類)。
邏輯回歸使用最小化交叉熵?fù)p失作為目標(biāo)函數(shù),
為什么不能用MSE均方誤差?
簡單來說,有以下幾點(diǎn):
最大似然下的邏輯回歸沒有解析解,我們常用梯度下降之類的算法迭代優(yōu)化得到局部較優(yōu)的參數(shù)解。
如果是Keras等神經(jīng)網(wǎng)絡(luò)庫建模,梯度下降算法類有SGD、Momentum、Adam等優(yōu)化算法可選。對(duì)于大多數(shù)任務(wù)而言,通常可以直接先試下Adam,然后可以繼續(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!
優(yōu)化模型閾值(cutoff點(diǎn)) :當(dāng)評(píng)估指標(biāo)是分類Precision、Recall等指標(biāo)時(shí),可以通過優(yōu)化模型閾值(默認(rèn)0.5)提高分類效果。常用可以根據(jù)不同劃分閾值下的presion與recall曲線(P-R曲線),做出權(quán)衡,選擇合適的模型閾值。
邏輯回歸模型很大的優(yōu)勢(shì)就是可解釋性,上節(jié)提到通過離散化編碼(如Onehot)可以提高擬合效果及解釋性,如下特征離散后Onehot編碼:
決策過程也就是對(duì)特征分箱Xn及其模型權(quán)重Wn的加權(quán)求和,然后sigmoid轉(zhuǎn)為概率,而通過模型權(quán)重值的大小就可以知道各特征對(duì)于決策的實(shí)際影響程度,比如特征”年齡在[18,30]”對(duì)應(yīng)學(xué)到權(quán)重值W為-0.8,也就是呈現(xiàn)負(fù)相關(guān)。
本文章轉(zhuǎn)載微信公眾號(hào)@算法進(jìn)階
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)