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

问题描述 投票:3回答:1

使用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

Pandas数据框

# 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个特征圆柱是最重要的。熊猫方法显示模型年份最重要。哪一个是CORRECT最重要的功能?

参考

python xgboost
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.