使用 XGBoost 获取每个观察的特征重要性

数据挖掘 机器学习 Python xgboost
2021-09-23 19:27:52

我已经训练了一个 XGBoost 二元分类器,我想为我给模型的每个观察提取特征重要性(我已经有了全局特征重要性)。

更具体地说,我正在寻找一种方法来确定,对于给定模型的每个实例,哪些特征具有最大的影响,并使输入属于一个或另一个类。我想知道使观察结果属于某个类别的前 5 个特征,以及我应该如何修改这 5 个特征以降低或增加属于该类别的概率的指示。

例如,假设我的模型根据房屋的位置、表面和卧室数量来预测房屋的价格是否超过 100,000 美元(这是正类)。我给它以下输入:伦敦,400 平方英尺,4 间卧室,我的模型预测房子属于正类的概率为 56%。我正在寻找一个 Python 模块或一个函数,它可以为每个观察显示最有影响力的特征。

2个回答

我建议您可能正在寻找类似以下两个软件包之一的东西:

https://github.com/slundberg/shap
https://github.com/marcotcr/lime

例如,请参阅这个石灰笔记本,它显示了如何使用它来查看为什么数据中的特定样本会导致模型的预测:

https://marcotcr.github.io/lime/tutorials/Tutorial%20-%20continuous%20and%20categorical%20features.html

训练模型后,用于xgb_feature_importances_查看特征对训练的影响。请注意,计算特征重要性的方式有 3 种类型(权重是默认类型):

  • weight:一个特征用于在所有树中分割数据的次数。
  • cover:一个特征用于在所有树上拆分数据的次数,加权通过这些拆分的训练数据点的数量。
  • gain:使用特征进行拆分时获得的平均训练损失减少量。

这是一个例子:

#Available importance_types = [‘weight’, ‘gain’, ‘cover’, ‘total_gain’, ‘total_cover’]
f = 'gain'
xgb.get_booster().get_score(importance_type= f)