gbdt中,缺失值做極值填充到底有啥用lo

  • 2020 年 12 月 24 日
  • AI

在業務和比賽中經常出現對缺失值進行-9999之類的極值填充,這種填充有什麼用?

根源問題主要在於xgb、lgb(catboost內部自動對缺失值做極值填充)的稀疏感知的實現,也就是我們常說的存在缺失值的樣本分裂的時候分別進入左右枝計算gain,最終分到gain大的分支里,這種方法的問題就在當缺失的樣本比較多的時候,比如90%左右,那麼等於我們最終僅在10%的特徵取值里進行分裂和分裂後的樣本劃分,那麼顯然,如果新數據在該特徵中出現了大量的新的取值,很容易就發生過擬合了;

而極值填充的作用在於避免這種問題的發生,比如我們有10萬個樣本,當tree對於某一個feature A進行分裂的時候:[1,2,3,4…..np.nan,](取值已去重和預排序),假設1萬個樣本的這個特徵有值,剩下90000個缺失,則默認分裂是(假設在3.5這個地方分裂)【1,2,3】,【4,。。。。】,並且假設左枝的gain比右枝大,則左枝分到的結果是[1,2,3,np.nan],右枝分到的結果是[4,….],左枝的樣本明顯比右枝多,因為包含了90000個存在缺失的樣本;

整個過程等效於我們在10000個樣本上進行分裂,然後把剩下的90000個樣本直接插入最終的結果,整個tree的決策過程是在少量的子數據集上進行的,那麼過擬合的問題就和小數據集過擬合的問題是類似的,當然,缺失問題不嚴重的時候這種處理方法沒什麼問題,但缺失值比較嚴重的時候就存在問題了;

而極值填充,以上面為例子,假設填充了-9999,則原始的特徵去重預排序之後為[1,2,3,4,….-9999],此時分裂的時候gbdt的稀疏感知不發生作用(都沒有缺失值了發生啥作用啊。。。),此時我們就是在全量的數據上進行分裂的決策了,這個時候就要分情況討論了,

1、當缺失值很少的時候,當缺失值很少,比如佔比都不到1%的情況下,其實處不處理在業務上差異並不會很大(比賽中倒是有可能導致萬幾的差異),此時其實做不做缺失值填充並沒有太大的影響;

2、缺失值占非常大的時候,比如缺失值佔比99%,然後我們進行了-9999的極值填充,為了方便描述還是舉個例子吧,

【nan,nan。。。。。。。,1,2,3,4,】

假設我們有10000個樣本,不進行缺失值填充的時候,分裂之後的結果可能是這樣的

【-inf,nan,nan。。。。。。。,1,2,】,【 3,4,inf】

如果進行-9999的填充,分裂之後的結果可能是這樣的:

【-inf,-9999,-9999。。。。。。。,1,2,】,【 3,4,inf】

有什麼區別??????

其實主要原因在於,在某些特定的場景下,缺失值是存在重要意義的,舉一個極端的例子,假設一個二分類問題,10萬個缺失值的標籤都是1,100個非缺失樣本的標籤有0,有1,顯然。。。如果不做缺失處理,模型的效果相對於進行缺失值處理之後差太多了。。。。原因就是這麼簡單。。。

//www.kaggle.com/c/home-credit-default-risk/discussion/59026www.kaggle.com

相關論述可見這裡。

但是當缺失值沒有意義,屬於完全隨機缺失的話,做極值插補效果不一定好可能還更差