原生xgboost中如何輸出feature_importance


網上教程基本都是清一色的使用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

 

 

 


免責聲明!

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



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