網上教程基本都是清一色的使用sklearn版本,此時的XGBClassifier有自帶屬性feature_importances_,而特征名稱可以通過model._Booster.feature_names獲取,但是對應原生版本,也就是通過DMatrix構造,通過model.train訓練的模型,如何獲取feature_importance?而且,二者獲取的feature_importance又有何不同?
1.通過閱讀官方文檔https://xgboost.readthedocs.io/en/latest/python/python_api.html,發現sklearn版本初始化時會指定一個默認參數
顯而易見,最后獲取的feature_importances_就是gain得到的
2.而原生版本初始化時沒有importance_type參數,真正獲取feature_importance時通過model.get_score(importance_type="gain")獲取,(另外一個方法get_fscore()就是get_score(importance_type="weight"),二者實現一樣。)
注意這里默認參數是"weight",就是指每個特征被用於分割的使用次數。如果對標skelearn版本需要指定“gain”,這里gain是指平均增益,另外,skelearn版本返回的importance是0-1形式,而原生版本返回的是很大的小數形式,對標的話可以通過除以總和得到,結果如圖
3.至於什么時候用weight,什么時候用gain,其實各有說法。實際上,判斷特征重要性共有三個維度,而在實際中,三個選項中的每個選項的功能重要性排序都非常不同
1. 權重。在所有樹中一個特征被用來分裂數據的次數。
2. 覆蓋。在所有樹中一個特征被用來分裂數據的次數,並且有多少數據點通過這個分裂點。
3. 增益。使用特征分裂時平均訓練損失的減少量
是什么使得衡量特征重要性的度量好或者壞?
如何比較一種特征歸因方法與另一種特征歸因方法並不容易。我們可以度量每種方法的最終用戶性能,例如數據清理、偏差檢測等。但這些只是對特征歸因方法好壞的間接測量。在這里,我們將定義兩個屬性,我們認為任何好的特征歸因方法應該遵循:
1. 一致性。每當我們更改模型以使其更依賴於某個特征時,該特征的歸因重要性不應該降低。
2. 准確性。所有特征重要性的總和應該等於模型的總重要性。(例如,如果重要性由R²值測量,那么每個特征的屬性應該與完整模型的R²相等)
如果一致性不成立,那么我們不能比較任意兩個模型之間的歸因重要性,因為具有較高分配歸因特征,並不意味着模型實際上更多地依賴於該特征。
如果精度未能保持,那么我們不知道每個特征的屬性如何組合以表示整個模型的輸出。我們不能在方法完成后對歸因進行規范化,因為這可能會破壞方法的一致性
這里推薦使用shap,可以全面的判斷特征重要性,而且對xgboost和lightgbm都有集成,可視化也相當不錯。詳細可看https://github.com/slundberg/shap
附:lightgbm和xgboost類似,https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.Booster.html?highlight=importance#lightgbm.Booster.feature_importance