使用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]
# 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_)
# 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)
Numpy方法显示第0个特征圆柱是最重要的。熊猫方法显示模型年份最重要。哪一个是CORRECT最重要的功能?
很难定义正确的特征重要性度量。每个都有优点和缺点。到目前为止,这是一个广泛的话题,尚无黄金法则,我个人建议阅读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
中的排序)。