寫在前面的話
GBDT和LR的融合在廣告點(diǎn)擊率預(yù)估中算是發(fā)展比較早的算法,為什么會(huì)在這里寫這么一篇呢?本來(lái)想嘗試寫一下阿里的深度興趣網(wǎng)絡(luò)(Deep Interest Network),發(fā)現(xiàn)阿里之前還有一個(gè)算法MLR,然后去查找相關(guān)的資料,里面提及了樹模型也就是GBDT+LR方案的缺點(diǎn),恰好之前也不太清楚GBDT+LR到底是怎么做的,所以今天我們先來(lái)了解一下GBDT和LR的融合方案。
在CTR預(yù)估問(wèn)題的發(fā)展初期,使用最多的方法就是邏輯回歸(LR),LR使用了Sigmoid變換將函數(shù)值映射到0~1區(qū)間,映射后的函數(shù)值就是CTR的預(yù)估值。
LR屬于線性模型,容易并行化,可以輕松處理上億條數(shù)據(jù),但是學(xué)習(xí)能力十分有限,需要大量的特征工程來(lái)增加模型的學(xué)習(xí)能力。但大量的特征工程耗時(shí)耗力同時(shí)并不一定會(huì)帶來(lái)效果提升。因此,如何自動(dòng)發(fā)現(xiàn)有效的特征、特征組合,彌補(bǔ)人工經(jīng)驗(yàn)不足,縮短LR特征實(shí)驗(yàn)周期,是亟需解決的問(wèn)題。
FM模型通過(guò)隱變量的方式,發(fā)現(xiàn)兩兩特征之間的組合關(guān)系,但這種特征組合僅限于兩兩特征之間,后來(lái)發(fā)展出來(lái)了使用深度神經(jīng)網(wǎng)絡(luò)去挖掘更高層次的特征組合關(guān)系。但其實(shí)在使用神經(jīng)網(wǎng)絡(luò)之前,GBDT也是一種經(jīng)常用來(lái)發(fā)現(xiàn)特征組合的有效思路。
Facebook 2014年的文章介紹了通過(guò)GBDT解決LR的特征組合問(wèn)題,隨后Kaggle競(jìng)賽也有實(shí)踐此思路,GBDT與LR融合開始引起了業(yè)界關(guān)注。
在介紹這個(gè)模型之前,我們先來(lái)介紹兩個(gè)問(wèn)題:
1)為什么要使用集成的決策樹模型,而不是單棵的決策樹模型:一棵樹的表達(dá)能力很弱,不足以表達(dá)多個(gè)有區(qū)分性的特征組合,多棵樹的表達(dá)能力更強(qiáng)一些。可以更好的發(fā)現(xiàn)有效的特征和特征組合
2)為什么建樹采用GBDT而非RF:RF也是多棵樹,但從效果上有實(shí)踐證明不如GBDT。且GBDT前面的樹,特征分裂主要體現(xiàn)對(duì)多數(shù)樣本有區(qū)分度的特征;后面的樹,主要體現(xiàn)的是經(jīng)過(guò)前N顆樹,殘差仍然較大的少數(shù)樣本。優(yōu)先選用在整體上有區(qū)分度的特征,再選用針對(duì)少數(shù)樣本有區(qū)分度的特征,思路更加合理,這應(yīng)該也是用GBDT的原因。
了解了為什么要用GBDT,我們就來(lái)看看到底二者是怎么融合的吧!
GBDT和LR的融合方案,F(xiàn)aceBook的paper中有個(gè)例子:
圖中共有兩棵樹,x為一條輸入樣本,遍歷兩棵樹后,x樣本分別落到兩顆樹的葉子節(jié)點(diǎn)上,每個(gè)葉子節(jié)點(diǎn)對(duì)應(yīng)LR一維特征,那么通過(guò)遍歷樹,就得到了該樣本對(duì)應(yīng)的所有LR特征。構(gòu)造的新特征向量是取值0/1的。舉例來(lái)說(shuō):上圖有兩棵樹,左樹有三個(gè)葉子節(jié)點(diǎn),右樹有兩個(gè)葉子節(jié)點(diǎn),最終的特征即為五維的向量。對(duì)于輸入x,假設(shè)他落在左樹第一個(gè)節(jié)點(diǎn),編碼[1,0,0],落在右樹第二個(gè)節(jié)點(diǎn)則編碼[0,1],所以整體的編碼為[1,0,0,0,1],這類編碼作為特征,輸入到LR中進(jìn)行分類。
這個(gè)方案還是很簡(jiǎn)單的吧,在繼續(xù)介紹下去之前,我們先介紹一下代碼實(shí)踐部分。
本文介紹的代碼只是一個(gè)簡(jiǎn)單的Demo,實(shí)際中大家需要根據(jù)自己的需要進(jìn)行參照或者修改。
github地址:https://github.com/princewen/tensorflow_practice/tree/master/recommendation/GBDT%2BLR-Demo
訓(xùn)練GBDT模型本文使用lightgbm包來(lái)訓(xùn)練我們的GBDT模型,訓(xùn)練共100棵樹,每棵樹有64個(gè)葉子結(jié)點(diǎn)。
df_train=pd.read_csv('data/train.csv')df_test=pd.read_csv('data/test.csv')NUMERIC_COLS=["ps_reg_01","ps_reg_02","ps_reg_03","ps_car_12","ps_car_13","ps_car_14","ps_car_15",]print(df_test.head(10))y_train=df_train['target']#traininglabely_test=df_test['target']#testinglabelX_train=df_train[NUMERIC_COLS]#trainingdatasetX_test=df_test[NUMERIC_COLS]#testingdataset#createdatasetforlightgbmlgb_train=lgb.Dataset(X_train,y_train)lgb_eval=lgb.Dataset(X_test,y_test,reference=lgb_train)params={'task':'train','boosting_type':'gbdt','objective':'binary','metric':{'binary_logloss'},'num_leaves':64,'num_trees':100,'learning_rate':0.01,'feature_fraction':0.9,'bagging_fraction':0.8,'bagging_freq':5,'verbose':0}#numberofleaves,willbeusedinfeaturetransformationnum_leaf=64print('Starttraining...')#traingbm=lgb.train(params,lgb_train,num_boost_round=100,valid_sets=lgb_train)print('Savemodel...')#savemodeltofilegbm.save_model('model.txt')print('Startpredicting...')#predictandgetdataonleaves,trainingdata
特征轉(zhuǎn)換
在訓(xùn)練得到100棵樹之后,我們需要得到的不是GBDT的預(yù)測(cè)結(jié)果,而是每一條訓(xùn)練數(shù)據(jù)落在了每棵樹的哪個(gè)葉子結(jié)點(diǎn)上,因此需要使用下面的語(yǔ)句:
y_pred=gbm.predict(X_train,pred_leaf=True)
打印上面結(jié)果的輸出,可以看到shape是(8001,100),即訓(xùn)練數(shù)據(jù)量*樹的棵樹
結(jié)果為:
print(np.array(y_pred).shape)print(y_pred[0])
然后我們需要將每棵樹的特征進(jìn)行one-hot處理,如前面所說(shuō),假設(shè)第一棵樹落在43號(hào)葉子結(jié)點(diǎn)上,那我們需要建立一個(gè)64維的向量,除43維之外全部都是0。因此用于LR訓(xùn)練的特征維數(shù)共num_trees * num_leaves。
print('Writingtransformedtrainingdata')transformed_training_matrix=np.zeros([len(y_pred),len(y_pred[0])*num_leaf],dtype=np.int64)#N*num_tress*num_leafsforiinrange(0,len(y_pred)):temp=np.arange(len(y_pred[0]))*num_leaf+np.array(y_pred[I])transformed_training_matrix[i][temp]+=1
當(dāng)然,對(duì)于測(cè)試集也要進(jìn)行同樣的處理:
y_pred=gbm.predict(X_test,pred_leaf=True)print('Writingtransformedtestingdata')transformed_testing_matrix=np.zeros([len(y_pred),len(y_pred[0])*num_leaf],dtype=np.int64)foriinrange(0,len(y_pred)):temp=np.arange(len(y_pred[0]))*num_leaf+np.array(y_pred[I])transformed_testing_matrix[i][temp]+=1
LR訓(xùn)練然后我們可以用轉(zhuǎn)換后的訓(xùn)練集特征和label訓(xùn)練我們的LR模型,并對(duì)測(cè)試集進(jìn)行測(cè)試:
lm=LogisticRegression(penalty='l2',C=0.05)#logesticmodelconstructionlm.fit(transformed_training_matrix,y_train)#fittingthedatay_pred_test=lm.predict_proba(transformed_testing_matrix)#Givetheprobabiltyoneachlabel
我們這里得到的不是簡(jiǎn)單的類別,而是每個(gè)類別的概率。
效果評(píng)價(jià)在Facebook的paper中,模型使用NE(Normalized Cross-Entropy),進(jìn)行評(píng)價(jià),計(jì)算公式如下:
代碼如下:
NE=(-1)/len(y_pred_test)*sum(((1+y_test)/2*np.log(y_pred_test[:,1])+(1-y_test)/2*np.log(1-y_pred_test[:,1])))print("NormalizedCrossEntropy"+str(NE))
現(xiàn)在的GBDT和LR的融合方案真的適合現(xiàn)在的大多數(shù)業(yè)務(wù)數(shù)據(jù)么?現(xiàn)在的業(yè)務(wù)數(shù)據(jù)是什么?是大量離散特征導(dǎo)致的高維度離散數(shù)據(jù)。而樹模型對(duì)這樣的離散特征,是不能很好處理的,要說(shuō)為什么,因?yàn)檫@容易導(dǎo)致過(guò)擬合。下面的一段話來(lái)自知乎:
用蓋坤的話說(shuō),GBDT只是對(duì)歷史的一個(gè)記憶罷了,沒(méi)有推廣性,或者說(shuō)泛化能力。
但這并不是說(shuō)對(duì)于大規(guī)模的離散特征,GBDT和LR的方案不再適用,感興趣的話大家可以看一下參考文獻(xiàn)2和3,這里就不再介紹了。
剛才提到了阿里的蓋坤大神,他的團(tuán)隊(duì)在2017年提出了兩個(gè)重要的用于CTR預(yù)估的模型,MLR和DIN,之后的系列中,我們會(huì)講解這兩種模型的理論和實(shí)戰(zhàn)!歡迎大家繼續(xù)關(guān)注!
1、Facebook的paper:http://quinonero.net/Publications/predicting-clicks-facebook.pdf2、http://www.cbdio.com/BigData/2015-08/27/content_3750170.htm3、https://blog.csdn.net/shine19930820/article/details/717136804、https://www.zhihu.com/question/358215665、https://github.com/neal668/LightGBM-GBDT-LR/blob/master/GBFT%2BLR_simple.py
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4780瀏覽量
101175 -
LR
+關(guān)注
關(guān)注
1文章
8瀏覽量
10076 -
GBDT
+關(guān)注
關(guān)注
0文章
13瀏覽量
3917
原文標(biāo)題:推薦系統(tǒng)遇上深度學(xué)習(xí)(十)--GBDT+LR融合方案實(shí)戰(zhàn)
文章出處:【微信號(hào):atleadai,微信公眾號(hào):LeadAI OpenLab】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
簡(jiǎn)單了解一下各種電源端口的命名
USB顯微鏡,不想了解一下嗎?
GBDT算法原理以及實(shí)例理解
![<b class='flag-5'>GBDT</b>算法原理以及實(shí)例理解](https://file.elecfans.com/web1/M00/90/9E/pIYBAFzFabKAdx_dAAAOVeIfwVg108.png)
帶你了解一下什么是USB 3.1接口
邏輯回歸與GBDT模型各自的原理及優(yōu)缺點(diǎn)
![邏輯回歸與<b class='flag-5'>GBDT</b>模型各自的原理及優(yōu)缺點(diǎn)](https://file.elecfans.com/web1/M00/D7/8C/pIYBAF_mmq2Af8zgAACliT9HNn8921.png)
GBDT是如何用于分類的
![<b class='flag-5'>GBDT</b>是如何用于分類的](https://file.elecfans.com/web1/M00/D7/1A/o4YBAF_moIKAdQJoAAAi_eMfqRA077.png)
了解一下不同的SAR ADC可用模擬輸入類型資料下載
![<b class='flag-5'>了解</b><b class='flag-5'>一下</b>不同的SAR ADC可用模擬輸入類型資料下載](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
了解一下光纖傳輸?shù)奶攸c(diǎn)
虹科帶你來(lái)了解一下汽車以太網(wǎng)和TSN的測(cè)試標(biāo)準(zhǔn)
![虹科帶你來(lái)<b class='flag-5'>了解</b><b class='flag-5'>一下</b>汽車以太網(wǎng)和TSN的測(cè)試標(biāo)準(zhǔn)](https://file.elecfans.com/web2/M00/27/F4/poYBAGHC81CAV5JrAAA15N3feXE654.jpg)
評(píng)論