可能是全網(wǎng)特征工程實操最通透的...
背景
目前網(wǎng)上能搜到的講特征工程方法基本都是教材里的那一套:缺失值填充,歸一化,category特征one-hot,降維等等。但是指望靠這些提升模型性能是遠遠不夠的,特別是對強大的xgb/lgb上述方法幾乎是毫無意義。也有一些文章總結(jié)了特定業(yè)務(wù)的特征工程,但是對其他任務(wù)也沒有泛化能力。
包大人插一嘴,這個評論很有水平,很多回答扯那些老掉牙的預(yù)處理。這篇文章基本就是從基礎(chǔ)特征出發(fā),衍生到高階的實操方法論。這個評論的人可能是量化或者金融從業(yè)者,他們在基礎(chǔ)因子庫+啟發(fā)式人力搜索上走了挺遠了~

畫導(dǎo)圖抄書唬人,但是真的沒什么水平~
砍手豪:本文探討和介紹一下我的特征工程方法論:1.類automl的暴力特征字典思路 2.基于業(yè)務(wù)理解的特征工程思路 3.基于特征重要性的特征工程思路;然后是上述三者的反復(fù)迭代螺旋上升。
要點一
1.類automl的暴力詞典搜索
暴力特征字典指的是當(dāng)給定數(shù)據(jù),能在想象力范圍能組合出盡可能多的特征,并形成Pipline,加快特征嘗試和迭代的速度,就像automl一樣。打個比方,當(dāng)給你兩個類別特征A 和B,你能制造出多少個特征用于迭代?簡單寫十個:
count:A_COUNT、B_COUNT、A_B_COUNT
nunique:?A_nunqiue_B??(按B對稱的下文省略)
ratio:?A_B_COUNT/A_COUNT?在A里各個B類所占的比例
average:A_COUNT/A_nunqiue_B?A里各個B類的平均數(shù)
most:?A_most_B?在A類里出現(xiàn)最高的B是哪個
pivot:?A_B1_count、A_B2_count?A和B類里特定的B1、B2的聯(lián)合統(tǒng)計
pivot2:?A_B1_count-A_B2_count?A的B1行為和B2行為的加減乘除
stat1:?A_stat_A_B_COUNT?基于A_B_COUNT對A的描述,
stat2 :A_stat_B_COUNT 基于B_COUNT對A的描述,
序列化:初步LDA,NMF,SVD,進一步Word2Vec,doc2vec 再進一步?圖神經(jīng)網(wǎng)絡(luò)deepwalk,pPRoNE
如果再加上numeric、time、target特征,幾乎可以組合成無窮無盡的特征
提升方法:可以看各個數(shù)據(jù)挖掘的比賽獲勝solution,我最初(17年)就是反復(fù)看當(dāng)時幾個kaggle GM plantgo&pipiu、Eureka&weiwei、Little Boat&jiwei liu的獲勝方案開源,拓寬自己對特征工程的想象力。
缺陷:這類會產(chǎn)生大量特征,比如給五個category特征,就能組成(2**5-1)共31個count特征 ,自然也有大量無用特征,會降低模型質(zhì)量和速度。
2.基于業(yè)務(wù)理解的特征工程思路
要點二
2.基于業(yè)務(wù)理解做特征
通過內(nèi)在的業(yè)務(wù)邏輯去分做特征,可以先想業(yè)務(wù)邏輯,然后數(shù)據(jù)分析驗證,也可以數(shù)據(jù)分析驗證,然后得到業(yè)務(wù)邏輯,最大的好處是可解釋性強,在此基礎(chǔ)上泛化能力更強,而且模型規(guī)模小。舉幾個例子:
在Instacart Market Basket Analysis比賽,預(yù)測美國用戶在線上商店的購物,我想我平時上班,買水果零食這種可買可不買的都放在周末,然后對這個數(shù)據(jù)里進行分析,發(fā)現(xiàn)在Instacart里,酒類商品的銷量也集中在周末,因此做了很多item 和 time 交叉的特征,對模型提升較大。
在TalkingData AdTracking Fraud Detection Challenge比賽里,任務(wù)是判斷虛假點擊,通過數(shù)據(jù)分析發(fā)現(xiàn)低頻IP容易是Fraud樣本,仔細想這些Fraud點擊都是自動化程序每次隨機生成的ip,因此容易是低頻ip,而正常的ip因為是運營商動態(tài)分配共享的,因此普遍頻率高。因此做了對channel,ad和ip頻次的交叉特征,對模型提升較大。
提升方法:通過努力的數(shù)據(jù)分析,以及多交流獲取業(yè)務(wù)的內(nèi)在邏輯形式。在實際中就是多加幾個行業(yè)群,多看論文多交流,在比賽中就是多逛論壇,看其他人的討論。
缺陷:憑借業(yè)務(wù)邏輯做特征,容易遺漏掉強特征。很多時候并不能琢磨出全部的內(nèi)在業(yè)務(wù)邏輯,甚至?xí)鲃拥暮Y掉一些實際有價值的特征。
要點三
3.基于特征重要性表的特征工程思路
xgb/lgb可以輸出特征重要性表,比起相關(guān)性分析,通過特征重要性表我們可以迅速在大量特征中獲取強特征。在此基礎(chǔ)上我們可以對強特征做更深層次的挖掘。
在Two sigma Rental-Listing-Inquireies里,GM little boat提到,既然manager id是強特征,那我們就可以用各種category,numeric特征去描述它。這里涉及到一個問題,很多人說FM,深度學(xué)習(xí)因為embedding的存在而具有了向新id泛化的能力,而樹模型只會記憶。其實在我看來,特征工程就是一個人工embedding的過程,讓高維度的類別特征數(shù)值向量化,因此也提升了樹模型的泛化能力?;氐竭@個比賽,就是特征重要性表為我們指明了特征工程努力的方向。在IJCAI2018 的比賽里,top2 solution 就是采用將特征重要性表靠前的數(shù)值特征暴力交叉,期望通過這種方法提高模型獲取更多有價值的特征。
類似的,如果看到一個數(shù)值特征特征重要性很強,我們也可以用類別特征和其交叉。如果一個統(tǒng)計特征很重要,我們可以增加一個時區(qū)維度,比如最近一周,最近一個月的相應(yīng)統(tǒng)計特征。如果距離上次時間很重要,我們可以增加距離上兩次,上次三次的時間特征。等等。
進一步,特征重要性表也可以知道深度學(xué)習(xí)模型子結(jié)構(gòu)的選擇,序列特征對應(yīng)rnn類,交叉特征對應(yīng)fm類,文本特征對應(yīng)nlp類,如果特征不重要,就不用上相應(yīng)的結(jié)構(gòu)了,如果重要,就可以對將特定的特征輸入對應(yīng)的子結(jié)構(gòu)了。
提升方法:經(jīng)驗的積累,如何將一個特征發(fā)散開來。
缺陷:首先得做出強特征,然后才能在強特征基礎(chǔ)上發(fā)散,因此依賴一個好的特征重要性表
上文講了三個我所認為最主要的特征工程思路,但是他們各有各的缺陷,因此
如何將其結(jié)合起來互補,螺旋迭代提升就是接下來能做的了。
要點四
4.類automl的暴力特征字典思路對基于業(yè)務(wù)理解的特征工程思路的協(xié)助
前文說到,基于業(yè)務(wù)理解的特征工程容易遺漏特征,不能挖掘全部可能存在的業(yè)務(wù)邏輯。那么我們可以先暴力特征字典全部羅列起來,然后在賦予其業(yè)務(wù)邏輯,看其在當(dāng)前業(yè)務(wù)下是否有效。再回到第一項的暴力特征字典。我們把category A和B替換成user ,item
count:user_COUNT(用戶活躍度)、item_COUNT(商品熱度)、user_item_COUNT(用戶對特定商品的喜愛)
nunique:?user_nunqiue_item??(一個用戶購買多少種商品)?item?nunique_user?(一個商品被多少個不同用戶購買)
ratio:?user_item_COUNT/user_COUNT?(某個商品在user購買中的比例,喜愛程度)
average:user_COUNT/user_nunqiue_item?(平均每類商品的購買量)
most:?user_most_item?(用戶最喜愛的品類)
pivot:?user_item1_count、user_item2_count?(用戶和特定商品的交互)
pivot2:?user_item1_count-user_item2_count?(用戶不同行為的差值,比如生活用品和娛樂用品的比例)
stat1: user_stat_user_item_COUNT (max:買的最多的商品的數(shù)量,std:不同商品的分散度,是專寵還是偏愛)
stat2 :user_stat_item_COUNT (mean:用戶是喜歡熱門商品還是冷門商品)
序列化:初步LDA,NMF,SVD(用商品描述用戶畫像)
進一步Word2Vec,doc2vec 再進一步?圖神經(jīng)網(wǎng)絡(luò)deepwalk,pPRoNE(刻畫商品和用戶的共現(xiàn)性和相似性)
要點五
5.類automl的暴力特征字典思路對基于特征重要性表的特征工程思路的協(xié)助
首先我們原始 data去跑特征重要性表,知道某個category特征或numeric很重要,要進一步挖掘這個特征的時候,比如前文說的“在Two sigma Rental-Listing-Inquireies里,GM little boat提到,既然manager id是強特征,那我們就可以用各種category,numeric特征去描述它。”我們就可以基于暴力特征字典去強化這個特征,看看如何去拓展這個強特征的維度。
要點六
6.基于業(yè)務(wù)理解的特征工程思路 和 基于特征重要性表的特征工程思路 對 ?類automl的暴力特征字典思路的協(xié)助
類automl的暴力特征字典思路最大的問題是可以產(chǎn)生無數(shù)的特征,比如五個類別特征就能產(chǎn)生31種count特征,這時候我們可以基于特征重要性表,把特征重要性低的類別特征從組合中刪去,也可以基于業(yè)務(wù)理解,把一些明顯無相關(guān)性的category交叉移除。這樣就不會產(chǎn)生過多無用的特征變成噪音降低模型速度和精度。
要點七
7.基于業(yè)務(wù)理解的特征工程思路 和 基于特征重要性表的特征工程思路 的相互迭代
其實比起數(shù)據(jù)分析,特征重要性表是一個可以更快的理解業(yè)務(wù)邏輯的方法
如果一個特征重要性表里存在一個我們原本認為應(yīng)該無關(guān)緊要的特征卻有很高的重要性,其實就可以增強我們對業(yè)務(wù)的理解,我們需要從業(yè)務(wù)角度思考為什么這個特征有好的效果,然后從業(yè)務(wù)角度上去做一個更好的特征。
比如特征重要性表里category A 和 numeric B特征都很重要,雖然無論樹模型還是深度學(xué)習(xí)模型都已經(jīng)有很強的特征交叉能力了,但經(jīng)過業(yè)務(wù)分析,其實是 A_mean_B特征影響結(jié)果,原始的A和B還是不如我們直接把A_mean_B做出來效果好。
因此,通過觀察特征重要性表,思考背后真正的業(yè)務(wù)邏輯,找出真正和target直接相關(guān)的特征,既能提升對業(yè)務(wù)的理解,也能夠提升模型的性能。
在Avito Demand Prediction Challenge(類似閑魚的一個app轉(zhuǎn)化預(yù)測)里,大家發(fā)現(xiàn)各種category_mean_price - price有很高的特征重要性,因此冠軍little boat思考出這不就是合理價格和賣家出價的差影響轉(zhuǎn)化率嘛,于是干脆先建了一個子模型,先預(yù)測出pred_price,然后用pred_price-price用于轉(zhuǎn)化率模型,取得了更好的效果,這就是基于特征重要性來理解業(yè)務(wù),深挖特征的一個好的案例。
總之,就是三種特征工程思路相互補充,反復(fù)迭代,最后通過驗證集取得一個好的特征組合。
小結(jié)
本文從方法論角度探討和總結(jié)了我的特征工程方法,基本上毫無保留。但是要反思的就是,使用這一套方法論是無法和最好的特征工程大師(比如國內(nèi)的江離、otto數(shù)據(jù)挖掘俱樂部)還是有很大差距,我猜測一下可能用以下兩種原因:
高手們還有其他角度的特征工程構(gòu)造邏輯
現(xiàn)有的特征工程邏輯我做的還不夠好,比如即便我觀察特征重要性表知道某些特征很重要后,也經(jīng)常無法真正挖掘出反應(yīng)業(yè)務(wù)邏輯的深層特征,需要后續(xù)看其他人的開源才能煥然大悟。
在這里拋磚引玉,供大家參考。
機??器學(xué)習(xí)算法交流群,邀您加入?。?!
入群:提問求助;認識行業(yè)內(nèi)同學(xué),交流進步;共享資源...
掃描??下方二維碼,備注“加群”
點贊三連↓
