绘制重要性变量 xgboost Python

Posted

技术标签:

【中文标题】绘制重要性变量 xgboost Python【英文标题】:Plot feature importance with xgboost 【发布时间】:2019-01-25 02:16:20 【问题描述】:

当我绘制特征重要性时,我得到了这个凌乱的情节。我有超过 7000 个变量。我知道内置函数只选择最重要的,尽管最终的图表是不可读的。 这是完整的代码:

import numpy as np
import pandas as pd
df = pd.read_csv('ricerice.csv')
array=df.values
X = array[:,0:7803]
Y = array[:,7804]
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
seed=0
test_size=0.30
X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=test_size, random_state=seed)
from xgboost import XGBClassifier
model = XGBClassifier()
model.fit(X, Y)
import matplotlib.pyplot as plt
from matplotlib import pyplot
from xgboost import plot_importance
fig1=plt.gcf()
plot_importance(model)
plt.draw()
fig1.savefig('xgboost.png', figsize=(50, 40), dpi=1000)

图虽大,但图难以辨认。

【问题讨论】:

【参考方案1】:

您需要先按降序对特征重要性进行排序:

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

然后使用数据框中的列名绘制它们

from matplotlib import pyplot as plt
n_top_features = 10
sorted_idx = trained_mdl.feature_importances_.argsort()[::-1]
plt.barh(X_test.columns[sorted_idx][:n_top_features ], trained_mdl.feature_importances_[sorted_idx][:n_top_features ])

【讨论】:

【参考方案2】:

您可以从具有feature_importances_ 属性的 Xgboost 模型中获取特征重要性。在您的情况下,它将是:

model.feature_imortances_

该属性是每个特征具有gain 重要性的数组。然后你可以绘制它:

from matplotlib import pyplot as plt
plt.barh(feature_names, model.feature_importances_)

feature_names 是一个包含功能名称的列表)

您可以对数组进行排序并选择您想要的特征数量(例如,10):

sorted_idx = model.feature_importances_.argsort()
plt.barh(feature_names[sorted_idx][:10], model.feature_importances_[sorted_idx][:10])
plt.xlabel("Xgboost Feature Importance")

还有两种获取特征重要性的方法:

您可以使用来自scikit-learnpermutation_importance(从版本0.22 开始) 您可以使用 SHAP 值

您可以在我的blog post 中阅读更多内容。

【讨论】:

您需要按降序排序才能正常工作。【参考方案3】:

有几点:

    为了拟合模型,您希望使用训练数据集 (X_train, y_train),而不是整个数据集 (X, y)。 您可以使用plot_importance() 函数的max_num_features 参数仅显示顶部max_num_features 功能(例如前10 个)。

对您的代码进行上述修改,加上一些随机生成的数据,代码和输出如下:

import numpy as np

# generate some random data for demonstration purpose, use your original dataset here
X = np.random.rand(1000,100)     # 1000 x 100 data
y = np.random.rand(1000).round() # 0, 1 labels

from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
seed=0
test_size=0.30
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=test_size, random_state=seed)
from xgboost import XGBClassifier
model = XGBClassifier()
model.fit(X_train, y_train)
import matplotlib.pylab as plt
from matplotlib import pyplot
from xgboost import plot_importance
plot_importance(model, max_num_features=10) # top 10 most important features
plt.show()

【讨论】:

非常感谢!我会更正代码并告诉你! 我在 conda 环境中遇到了一些问题,但在那之后我能够得到一个清晰的图表。谢谢! 我如何知道 f39 是什么? 使用model.get_booster().get_score(importance_type='weight') 获取所有功能的重要性。

以上是关于绘制重要性变量 xgboost Python的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost 功能重要性:编码后如何获取原始变量名

尽管文档中提到了,但 Python 中的 xgboost 并未返回功能的重要性

XGBoost 绘图重要性 F 值 >100

XGBoost三种特征重要性计算方法对比

Sagemaker 中 XGBoost 的功能重要性

Python计算树模型(随机森林xgboost等)的特征重要度及其波动程度:基于熵减的特征重要度计算及可视化基于特征排列的特征重要性(feature permutation)计算及可视化