如何在xgboost中获得功能重要性?

时间:2016-06-04 08:05:45

标签: python xgboost

我使用xgboost构建模型,并尝试使用get_fscore()查找每个功能的重要性,但它返回{}

我的火车代码是:

dtrain = xgb.DMatrix(X, label=Y)
watchlist = [(dtrain, 'train')]
param = {'max_depth': 6, 'learning_rate': 0.03}
num_round = 200
bst = xgb.train(param, dtrain, num_round, watchlist)

我的火车有没有错误?如何在xgboost中获得功能重要性?

12 个答案:

答案 0 :(得分:12)

在您的代码中,您可以以字典形式获取每个功能的功能重要性:

bst.get_score(importance_type='gain')

>>{'ftr_col1': 77.21064539577829,
   'ftr_col2': 10.28690566363971,
   'ftr_col3': 24.225014841466294,
   'ftr_col4': 11.234086283060112}

说明:train()API的方法get_score()定义为:

get_score(fmap ='',Important_type ='weight')

  • fmap (str(可选))–特征图文件的名称。
  • 重要类型
    • “权重”-一项功能用于将数据划分到所有树上的次数。
    • “增益”-使用该功能的所有拆分的平均增益。
    • “覆盖”-使用该功能的所有细分的平均覆盖率。
    • “ total_gain”-使用该功能的所有细分的总收益。
    • “全部覆盖”-使用该功能的所有细分的总覆盖率。

https://xgboost.readthedocs.io/en/latest/python/python_api.html

答案 1 :(得分:6)

试试这个

fscore = clf.best_estimator_.booster().get_fscore()

答案 2 :(得分:5)

我当然不知道如何获得价值,但有一种很好的方法来描绘特征的重要性:

model = xgb.train(params, d_train, 1000, watchlist)
fig, ax = plt.subplots(figsize=(12,18))
xgb.plot_importance(model, max_num_features=50, height=0.8, ax=ax)
plt.show()

答案 3 :(得分:4)

对于功能重要性试试这个:

分类

pd.DataFrame(bst.get_fscore().items(), columns=['feature','importance']).sort_values('importance', ascending=False)

回归:

xgb.plot_importance(bst)

答案 4 :(得分:4)

首先从XGboost构建模型

sorted_idx = np.argsort(model.feature_importances_)[::-1]

这会产生一个数组。所以我们可以用降序排序

for index in sorted_idx:
    print([train.columns[index], model.feature_importances_[index]]) 

然后,是时候将所有排序的重要性和列的名称一起打印为列表(我假设数据加载了Pandas)

plot_importance(model, max_num_features = 15)
pyplot.show()

此外,我们可以使用XGboost内置函数

绘制重要性
max_num_features

使用plot_importance中的Given Fred is registered And I am logged in and can delete users When I delete user Fred Then I should see Fred has been deleted 来限制功能的数量。

答案 5 :(得分:4)

使用sklearn API和XGBoost 0.81:

clf.get_booster().get_score(importance_type="gain")

regr.get_booster().get_score(importance_type="gain")

答案 6 :(得分:3)

对于在使用xgb.XGBRegressor()时遇到此问题的任何人,我使用的解决方法是将数据保存在pandas.DataFrame()numpy.array()中,而不是将数据转换为{{ 1}}。此外,我必须确保没有为XGBRegressor指定dmatrix()参数。

gamma

在拟合回归量fit = alg.fit(dtrain[ft_cols].values, dtrain['y'].values) ft_weights = pd.DataFrame(fit.feature_importances_, columns=['weights'], index=ft_cols) 之后,返回一个权重数组,我假设的顺序与pandas数据帧的要素列的顺序相同。

我目前的设置是Ubuntu 16.04,Anaconda发行版,python 3.6,xgboost 0.6和sklearn 18.1。

答案 7 :(得分:3)

获取包含得分功能名称的表格,然后进行绘制。

feature_important = model.get_score(importance_type='weight')
keys = list(feature_important.keys())
values = list(feature_important.values())

data = pd.DataFrame(data=values, index=keys, columns=["score"]).sort_values(by = "score", ascending=False)
data.plot(kind='barh')

例如:

enter image description here

答案 8 :(得分:2)

print(model.feature_importances_)

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

答案 9 :(得分:1)

如果您使用的是XGBRegressor,请尝试使用:model.get_booster().get_score()

这将返回您可以通过plot_importance命令直接可视化的结果

答案 10 :(得分:1)

根据此post,有3种不同的方法可以从Xgboost获得功能重要性:

  • 使用内置功能的重要性,
  • 使用基于排列的重要性,
  • 使用基于重要性的重要性。

内置功能的重要性

代码示例:

xgb = XGBRegressor(n_estimators=100)
xgb.fit(X_train, y_train)
sorted_idx = xgb.feature_importances_.argsort()
plt.barh(boston.feature_names[sorted_idx], xgb.feature_importances_[sorted_idx])
plt.xlabel("Xgboost Feature Importance")

请注意您正在使用哪种类型的功能。重要性有几种类型,请参见docs。像Xgboost的API这样的scikit-learn返回的是gain的重要性,而get_fscore返回的是weight的类型。

基于排列的重要性

perm_importance = permutation_importance(xgb, X_test, y_test)
sorted_idx = perm_importance.importances_mean.argsort()
plt.barh(boston.feature_names[sorted_idx], perm_importance.importances_mean[sorted_idx])
plt.xlabel("Permutation Importance")

这是我计算重要性的首选方法。但是,如果高度共线的特征会失败,所以要小心!它正在使用permutation_importance中的scikit-learn

基于SHAP的重要性

explainer = shap.TreeExplainer(xgb)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, plot_type="bar")

要使用上述代码,您需要安装shap软件包。

我正在对波士顿数据(来自scikit-learn的房价回归)进行示例分析。以下3个功能的重要性:

内置重要性

built in xgboost importance

基于排列的重要性

permutation importance

SHAP重要性

shap imp

所有地块均用于同一模型!如您所见,结果有所不同。我更喜欢基于置换的重要性,因为我可以清楚地了解哪些功能会影响模型的性能(如果没有较高的共线性)。

答案 11 :(得分:0)

使用 XGBoost https://www.kaggle.com/discussion/237792 为不同类型的特征重要性参考 kaggle 帖子链接{{3}}