XGBoost plot_importance不显示要素名称

时间:2017-10-25 23:01:15

标签: python pandas machine-learning xgboost

我正在使用XGBoost和Python,并使用名为train()数据的XGBoost DMatrix函数成功训练了一个模型。矩阵是从Pandas数据框创建的,该数据框具有列的特征名称。

Xtrain, Xval, ytrain, yval = train_test_split(df[feature_names], y, \
                                    test_size=0.2, random_state=42)
dtrain = xgb.DMatrix(Xtrain, label=ytrain)

model = xgb.train(xgb_params, dtrain, num_boost_round=60, \
                  early_stopping_rounds=50, maximize=False, verbose_eval=10)

fig, ax = plt.subplots(1,1,figsize=(10,10))
xgb.plot_importance(model, max_num_features=5, ax=ax)

我现在想要使用xgboost.plot_importance()函数查看功能重要性,但结果图不会显示功能名称。相反,这些功能会列为f1f2f3等,如下所示。

enter image description here

我认为问题在于我将原来的Pandas数据帧转换为DMatrix。如何正确关联要素名称以使特征重要性图显示它们?

7 个答案:

答案 0 :(得分:17)

您希望在创建return this.store.findAll('panelist');

时使用feature_names参数
xgb.DMatrix

答案 1 :(得分:7)

train_test_split会将数据帧转换为numpy数组,不再有列信息。

您可以执行@piRSquared建议的操作,并将这些功能作为参数传递给DMatrix构造函数。或者,您可以将从train_test_split返回的numpy数组转换为Dataframe,然后使用您的代码。

Xtrain, Xval, ytrain, yval = train_test_split(df[feature_names], y, \
                                    test_size=0.2, random_state=42)

# See below two lines
X_train = pd.DataFrame(data=Xtrain, columns=feature_names)
Xval = pd.DataFrame(data=Xval, columns=feature_names)

dtrain = xgb.DMatrix(Xtrain, label=ytrain)

答案 2 :(得分:3)

如果您使用scikit-learn包装器,则需要访问基础XGBoost Booster并在其上设置功能名称,而不是scikit模型,如下所示:

False

答案 3 :(得分:1)

我在和feature_names一起玩时发现了另一种方法。在玩游戏时,我编写了此代码,该代码可在我当前正在运行的XGBoost v0.80上运行。

## Saving the model to disk
model.save_model('foo.model')
with open('foo_fnames.txt', 'w') as f:
    f.write('\n'.join(model.feature_names))

## Later, when you want to retrieve the model...
model2 = xgb.Booster({"nthread": nThreads})
model2.load_model("foo.model")

with open("foo_fnames.txt", "r") as f:
    feature_names2 = f.read().split("\n")

model2.feature_names = feature_names2
model2.feature_types = None
fig, ax = plt.subplots(1,1,figsize=(10,10))
xgb.plot_importance(model2, max_num_features = 5, ax=ax)

因此,这将分别保存feature_names并在以后将其重新添加。由于某些原因,feature_types也需要初始化,即使该值为None

答案 4 :(得分:0)

使用Scikit-Learn包装器接口“ XGBClassifier”,plot_importance会返回类“ matplotlib轴”。因此,我们可以使用axes.set_yticklabels。

plot_importance(model).set_yticklabels(['feature1','feature2'])

答案 5 :(得分:0)

如果接受过培训

model = XGBClassifier(
    max_depth = 8, 
    learning_rate = 0.25, 
    n_estimators = 50, 
    objective = "binary:logistic",
    n_jobs = 4
)

# x, y are pandas DataFrame
model.fit(train_data_x, train_data_y)

您可以执行model.get_booster().get_fscore()以将功能名称和功能重要性作为python字典获取

答案 6 :(得分:0)

在实例化XGBoost分类器时,应指定feature_names:

s2

请注意,如果将xgb分类器包装在对列执行任何选择的sklearn管道中(例如,VarianceThreshold),则在尝试拟合或变换时,xgb分类器将失败。