如何在XGBOOST中获得正确的特征重要性图?

时间:2019-11-21 22:06:21

标签: python xgboost

在XGBOOST功能重要性中使用两种不同的方法,给了我两个不同的最重要的功能,应该相信哪一个?

何时应使用哪种方法?我很困惑。

设置

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline

import seaborn as sns
import xgboost as xgb

df = sns.load_dataset('mpg')
df = df.drop(['name','origin'],axis=1)

X = df.iloc[:,1:]
y = df.iloc[:,0]

Numpy数组

# fit the model
model_xgb_numpy = xgb.XGBRegressor(n_jobs=-1,objective='reg:squarederror')
model_xgb_numpy.fit(X.to_numpy(), y.to_numpy())

plt.bar(range(len(model_xgb_numpy.feature_importances_)), model_xgb_numpy.feature_importances_)

enter image description here

熊猫数据框

# fit the model
model_xgb_pandas = xgb.XGBRegressor(n_jobs=-1,objective='reg:squarederror')
model_xgb_pandas.fit(X, y)
axsub = xgb.plot_importance(model_xgb_pandas)

enter image description here

问题

Numpy方法显示第0个特征圆柱是最重要的。熊猫方法显示模型年份最重要。正确的最重要的功能是哪一个?

参考

2 个答案:

答案 0 :(得分:1)

很难定义正确的特征重要性度量。每个都有优点和缺点。到目前为止,这是一个广泛的话题,尚无黄金法则,我个人建议阅读Christoph Molnar的这本在线书籍:https://christophm.github.io/interpretable-ml-book/。这本书很好地概述了不同的度量和不同的算法。

根据经验,如果您不能使用外部软件包,我会选择gain,因为它更能代表一个人感兴趣的内容(通常一个人对原始拆分不感兴趣)特定功能,而是这些拆分有多大帮助),请参见以下问题以获取详细摘要:https://datascience.stackexchange.com/q/12318/53060。如果您可以使用其他工具,则shap表现出很好的性能,除非计算时间受到严格限制,否则我会始终选择它而不是内置的xgb树度量。

对于您直接在问题中指出的差异,差异的根源在于以下事实:xgb.plot_importance使用weight作为默认提取的特征重要性类型,而{{1 }}本身使用XGBModel作为默认类型。如果将它们配置为使用相同的重要性类型,那么您将获得相似的分布(直到gain中的其他归一化和feature_importance_中的排序)。

答案 1 :(得分:1)

有3种方法可以使Xgboost获得功能重要性:

  • 使用内置功能重要性(我更喜欢gain类型)
  • 使用基于置换的特征重要性
  • 使用SHAP值计算特征重要性

在我的post中,我为所有3种方法编写了代码示例。就个人而言,我使用的是基于置换的功能。我认为,内置特征重要性可以在对数据进行过拟合后将特征显示为重要(这只是根据我的经验得出的观点)。 SHAP解释非常棒,但是有时计算它们可能会很耗时(并且您需要对数据进行下采样)。