關於lightgbm處理category特征的理解


轉自:https://www.jianshu.com/p/d07f0b0726da

 

之前一直使用的集成回歸樹模型都是RF,Xgboost,GBDT這三個,其中RF是bagging思想,Xgboost和GBDT是boosting思想。但是在嘗試了微軟開源的Lightgbm之后,感覺再也回不去了。這款橫空出世的輕量級tree boost模型,在不損失精度的情況下,大大提升了計算效率。同時也做出了一些改進。在這里先聊一聊它對‘category’’這種類別型數據的處理的支持。

如果你對算法有一定的了解,你會知道是無法直接處理類別型數據的,即離散特征。我們需要對類別型數據做一個one-hot,將類別型數據稀疏化。例如用鞋子品牌這一特征維度對鞋子進行分類:耐克鞋,阿迪鞋,李寧鞋。你不能將他們編碼成(0,1,2),因為這樣你就已經不公平的定義了三者之間的距離,阿迪和耐克的距離是1,而李寧和耐克的距離是2,我們不能這樣貿然定義,不能做一個莽夫。眾生平等,所以我們要一視同仁,采取one-encode編碼將三者轉換為(1,0,0),(0,1,0),(0,0,1)。讓距離的計算變得更加合理。

而Lightgbm可以直接支持category特征的處理,在用pandas結構使用LGB時可以指定哪一列是類別型數據,省去one-hot的步驟。如果類別過多,如商品ID,在one-hot處理后數據會變得過於稀疏,大大增加了訓練集的大小,浪費計算資源。而LGB則會采用一種直方圖式的方法去處理,max bin的默認值是256,對於category類型的feature,則是每一種取值放入一個bin,且當取值的個數大於max bin數時,會忽略那些很少出現的category值。在求split時,對於category類型的feature,算的是"按是否屬於某個category值划分"的gain,它的實際效果就是類似one-hot的編碼方法。

在最近的一個項目中,我第一直覺認為商品ID應該是和商品銷量高度相關的特征,對商品ID進行one-hot后,在輸出的feature importance中該特征得分非常高,也符合我的直覺。但是最終結果卻變差了。針對這一問題,我個人的理解是,在過於稀疏化后,相當於變相減少了數據量,在學習能力很強的模型下,很容易導致過擬合的現象,若不能獲取更多的數據,可以考慮放棄該列特征或者將商品ID按照其他的方法進行重新分成各大類,降低稀疏化程度,也可以獲得不錯的效果。



作者:_從前從前_
鏈接:https://www.jianshu.com/p/d07f0b0726da
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM