【数据竞赛】可能是全网特征工程实操最通透的...
之前在我寫的特征工程方法論里面提了一嘴,用automl搜索+人工啟啟發式可以高效穩定地完成特征工程,并取得不錯的效果。
原文:可能是全網寫特征工程最通透的...
不過這篇文章最大的問題是太過于側重于是什么,和為什么了,至于怎么辦埋了一個很大的伏筆。
砍老師今天把這個思路給大家詳細的寫出了,可以實操。可以通過點擊訪問原文直達砍老師的知乎原文,作為kaggle歷史總排名12的GrandMaster還有很多干貨~
可能是全網特征工程實操最通透的...
背景
目前網上能搜到的講特征工程方法基本都是教材里的那一套:缺失值填充,歸一化,category特征one-hot,降維等等。但是指望靠這些提升模型性能是遠遠不夠的,特別是對強大的xgb/lgb上述方法幾乎是毫無意義。也有一些文章總結了特定業務的特征工程,但是對其他任務也沒有泛化能力。
包大人插一嘴,這個評論很有水平,很多回答扯那些老掉牙的預處理。這篇文章基本就是從基礎特征出發,衍生到高階的實操方法論。這個評論的人可能是量化或者金融從業者,他們在基礎因子庫+啟發式人力搜索上走了挺遠了~
畫導圖抄書唬人,但是真的沒什么水平~
砍手豪:本文探討和介紹一下我的特征工程方法論:1.類automl的暴力特征字典思路 2.基于業務理解的特征工程思路 3.基于特征重要性的特征工程思路;然后是上述三者的反復迭代螺旋上升。
要點一
1.類automl的暴力詞典搜索
暴力特征字典指的是當給定數據,能在想象力范圍能組合出盡可能多的特征,并形成Pipline,加快特征嘗試和迭代的速度,就像automl一樣。打個比方,當給你兩個類別特征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類的平均數 most:?A_most_B?在A類里出現最高的B是哪個 pivot:?A_B1_count、A_B2_count?A和B類里特定的B1、B2的聯合統計 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 再進一步?圖神經網絡deepwalk,pPRoNE如果再加上numeric、time、target特征,幾乎可以組合成無窮無盡的特征
提升方法:可以看各個數據挖掘的比賽獲勝solution,我最初(17年)就是反復看當時幾個kaggle GM plantgo&pipiu、Eureka&weiwei、Little Boat&jiwei liu的獲勝方案開源,拓寬自己對特征工程的想象力。
缺陷:這類會產生大量特征,比如給五個category特征,就能組成(2**5-1)共31個count特征 ,自然也有大量無用特征,會降低模型質量和速度。
2.基于業務理解的特征工程思路
要點二
2.基于業務理解做特征
通過內在的業務邏輯去分做特征,可以先想業務邏輯,然后數據分析驗證,也可以數據分析驗證,然后得到業務邏輯,最大的好處是可解釋性強,在此基礎上泛化能力更強,而且模型規模小。舉幾個例子:
在Instacart Market Basket Analysis比賽,預測美國用戶在線上商店的購物,我想我平時上班,買水果零食這種可買可不買的都放在周末,然后對這個數據里進行分析,發現在Instacart里,酒類商品的銷量也集中在周末,因此做了很多item 和 time 交叉的特征,對模型提升較大。
在TalkingData AdTracking Fraud Detection Challenge比賽里,任務是判斷虛假點擊,通過數據分析發現低頻IP容易是Fraud樣本,仔細想這些Fraud點擊都是自動化程序每次隨機生成的ip,因此容易是低頻ip,而正常的ip因為是運營商動態分配共享的,因此普遍頻率高。因此做了對channel,ad和ip頻次的交叉特征,對模型提升較大。
提升方法:通過努力的數據分析,以及多交流獲取業務的內在邏輯形式。在實際中就是多加幾個行業群,多看論文多交流,在比賽中就是多逛論壇,看其他人的討論。
缺陷:憑借業務邏輯做特征,容易遺漏掉強特征。很多時候并不能琢磨出全部的內在業務邏輯,甚至會主動的篩掉一些實際有價值的特征。
要點三
3.基于特征重要性表的特征工程思路
xgb/lgb可以輸出特征重要性表,比起相關性分析,通過特征重要性表我們可以迅速在大量特征中獲取強特征。在此基礎上我們可以對強特征做更深層次的挖掘。
在Two sigma Rental-Listing-Inquireies里,GM little boat提到,既然manager id是強特征,那我們就可以用各種category,numeric特征去描述它。這里涉及到一個問題,很多人說FM,深度學習因為embedding的存在而具有了向新id泛化的能力,而樹模型只會記憶。其實在我看來,特征工程就是一個人工embedding的過程,讓高維度的類別特征數值向量化,因此也提升了樹模型的泛化能力。回到這個比賽,就是特征重要性表為我們指明了特征工程努力的方向。在IJCAI2018 的比賽里,top2 solution 就是采用將特征重要性表靠前的數值特征暴力交叉,期望通過這種方法提高模型獲取更多有價值的特征。
類似的,如果看到一個數值特征特征重要性很強,我們也可以用類別特征和其交叉。如果一個統計特征很重要,我們可以增加一個時區維度,比如最近一周,最近一個月的相應統計特征。如果距離上次時間很重要,我們可以增加距離上兩次,上次三次的時間特征。等等。
進一步,特征重要性表也可以知道深度學習模型子結構的選擇,序列特征對應rnn類,交叉特征對應fm類,文本特征對應nlp類,如果特征不重要,就不用上相應的結構了,如果重要,就可以對將特定的特征輸入對應的子結構了。
提升方法:經驗的積累,如何將一個特征發散開來。
缺陷:首先得做出強特征,然后才能在強特征基礎上發散,因此依賴一個好的特征重要性表
上文講了三個我所認為最主要的特征工程思路,但是他們各有各的缺陷,因此
如何將其結合起來互補,螺旋迭代提升就是接下來能做的了。
要點四
4.類automl的暴力特征字典思路對基于業務理解的特征工程思路的協助
前文說到,基于業務理解的特征工程容易遺漏特征,不能挖掘全部可能存在的業務邏輯。那么我們可以先暴力特征字典全部羅列起來,然后在賦予其業務邏輯,看其在當前業務下是否有效。再回到第一項的暴力特征字典。我們把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:買的最多的商品的數量,std:不同商品的分散度,是專寵還是偏愛) stat2 :user_stat_item_COUNT (mean:用戶是喜歡熱門商品還是冷門商品) 序列化:初步LDA,NMF,SVD(用商品描述用戶畫像) 進一步Word2Vec,doc2vec 再進一步?圖神經網絡deepwalk,pPRoNE(刻畫商品和用戶的共現性和相似性)要點五
5.類automl的暴力特征字典思路對基于特征重要性表的特征工程思路的協助
首先我們原始 data去跑特征重要性表,知道某個category特征或numeric很重要,要進一步挖掘這個特征的時候,比如前文說的“在Two sigma Rental-Listing-Inquireies里,GM little boat提到,既然manager id是強特征,那我們就可以用各種category,numeric特征去描述它。”我們就可以基于暴力特征字典去強化這個特征,看看如何去拓展這個強特征的維度。
要點六
6.基于業務理解的特征工程思路 和 基于特征重要性表的特征工程思路 對 ?類automl的暴力特征字典思路的協助
類automl的暴力特征字典思路最大的問題是可以產生無數的特征,比如五個類別特征就能產生31種count特征,這時候我們可以基于特征重要性表,把特征重要性低的類別特征從組合中刪去,也可以基于業務理解,把一些明顯無相關性的category交叉移除。這樣就不會產生過多無用的特征變成噪音降低模型速度和精度。
要點七
7.基于業務理解的特征工程思路 和 基于特征重要性表的特征工程思路 的相互迭代
其實比起數據分析,特征重要性表是一個可以更快的理解業務邏輯的方法
如果一個特征重要性表里存在一個我們原本認為應該無關緊要的特征卻有很高的重要性,其實就可以增強我們對業務的理解,我們需要從業務角度思考為什么這個特征有好的效果,然后從業務角度上去做一個更好的特征。
比如特征重要性表里category A 和 numeric B特征都很重要,雖然無論樹模型還是深度學習模型都已經有很強的特征交叉能力了,但經過業務分析,其實是 A_mean_B特征影響結果,原始的A和B還是不如我們直接把A_mean_B做出來效果好。
因此,通過觀察特征重要性表,思考背后真正的業務邏輯,找出真正和target直接相關的特征,既能提升對業務的理解,也能夠提升模型的性能。
在Avito Demand Prediction Challenge(類似閑魚的一個app轉化預測)里,大家發現各種category_mean_price - price有很高的特征重要性,因此冠軍little boat思考出這不就是合理價格和賣家出價的差影響轉化率嘛,于是干脆先建了一個子模型,先預測出pred_price,然后用pred_price-price用于轉化率模型,取得了更好的效果,這就是基于特征重要性來理解業務,深挖特征的一個好的案例。
總之,就是三種特征工程思路相互補充,反復迭代,最后通過驗證集取得一個好的特征組合。
小結
本文從方法論角度探討和總結了我的特征工程方法,基本上毫無保留。但是要反思的就是,使用這一套方法論是無法和最好的特征工程大師(比如國內的江離、otto數據挖掘俱樂部)還是有很大差距,我猜測一下可能用以下兩種原因:
高手們還有其他角度的特征工程構造邏輯
現有的特征工程邏輯我做的還不夠好,比如即便我觀察特征重要性表知道某些特征很重要后,也經常無法真正挖掘出反應業務邏輯的深層特征,需要后續看其他人的開源才能煥然大悟。
在這里拋磚引玉,供大家參考。
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【数据竞赛】可能是全网特征工程实操最通透的...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vscode统计代码行数,前端开发配置、
- 下一篇: springBoot 通过使用log4j