XGB 1-weight內置的三種特征重要度計算方法
Xgb.plot_importance這是我們經常用來繪制特征重要性的函數方法。背後的貢獻度計算方法是權重。
?“權重”-壹個特征被用於在所有樹上分割數據的次數。
簡單來說就是子樹模型拆分時使用的特征數量。這裏所有的樹都計算在內。該指標在R包中也稱為頻率2。
XGB 2-Gain內置的三種特征重要性計算方法
Model.feature_importances_這是我們調用特征重要性值時的默認函數方法。背後貢獻的計算方法是增益。
?“增益”-使用該特征的所有分割的平均增益。
增益是信息增益的廣義概念。這裏指的是節點分裂時該特征帶來的信息增益(目標函數)優化的平均值。
XGB內置三種特征重要性計算方法3-COVER
定義模型時需要定義model = xgbrfclassifier(importance _ type = ' cover ')的計算方法。稍後再打電話。
model.feature_importances_得到的是基於cover的貢獻。
cover' -使用該特征的所有分割的平均覆蓋率。
覆蓋圖就是當樹模型被分割時,特征下的葉節點覆蓋的樣本數除以特征被用來分割的次數。分裂越靠近根部,覆蓋值越大。
使用場景
權重將賦予數字特征更高的值,因為它的變量越多,當樹分裂時它可以切割的空間就越大。因此,這壹指標會掩蓋重要的計數特征。
Gain使用熵增的概念,可以很容易的找出最直接的特征。也就是說,如果壹個特征下的零都是標簽下的零,那麽這個特征壹定會排在第壹位。
Cover對於枚舉特性更友好。同時,它不會過度擬合目標函數。不接受目標函數的量綱影響。
按如下方式調用它們
# available importance _ types =[' weight ',' gain ',' cover ',' total_gain ',' total_cover']
f = "增益"
XGBClassifier.get_booster()。get_score(importamce_type=f)
在實際中我們也會發現,頭尾值在增益的順序上有很大的差異,因為後續的優化在計算信息增益時可能不是壹個數量級。類似於神經網絡,在優化損失函數時,後續維度可能相差十倍,也可能相差百倍。所以綜上所述,如果有下遊業務方,更推薦使用cover的特征重要性計算方法。當然,如果是簡單的模型調優,gain可以指出最重要的特性。在某些場景中,這些特征可以總結為硬性規則。
其他重要的計算方法4 -排列
除了上述內置的重要性計算方法,還有其他的第三方計算方法。
置換:如果這個特性很重要,那麽我們就在所有樣本中把它打散,最終的優化目標就會被破壞。這裏的破壞程度就是特征的重要性。因為它的計算依賴於單個特征,所以對非線性模型更友好。同時,如果特征中有多個* * *線性,那麽* * *線性的特征重要性會非常靠後。這是因為混淆單個特征不會影響另壹個特征的貢獻。因此,即使特性很重要,它們的排名也會很低。
針對多個* * *線特征,sklearn文檔中提到了壹個解決方案:計算特征之間的Spearman秩序相關性,得到每組中的頭部特征,然後計算特征重要性。這個方法其實就是在解決特征線的問題。
其他模型特征重要性的計算方法
對於相同的樹模型,隨機森林和GBDT也具有內置的特征重要性。隨機森林使用rf.feature_importances_來獲得特征的重要性。其中,分類任務計算基尼雜質/信息熵。回歸任務計算樹的方差。實際上,這種基於平均減少雜質的方法存在兩個問題:(1)會更多地關註變量空間較大的特征,而二進制分類特征會落後。(2)結果的擬合是基於訓練集的,存在過擬合的風險,所以沒有驗證集數據進行驗證。
針對上述問題,建議采用OOB(out-of-bag)法對剩余數據進行驗證,並結合排列計算特征重要度。另外,GBDT也是基於雜質計算的特征重要性,但它是單棵樹上的回歸樹,所以不是基於基尼系數,而是基於MSE或MAE。
至於為什麽都是樹模型,而且都是基於不存在的重要性計算,結果卻不壹樣。主要有兩個,壹個是它們的樹結構不壹樣;第二是他們的優化對象不壹樣。