我正在使用XGBoost和Python,并且已经使用在DMatrix数据上调用的XGBoost train()函数成功地训练了一个模型。该矩阵是从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()函数查看特征的重要性,但结果图没有显示特征名称。相反,这些特性被列为f1、f2、f3等,如下所示。

我想问题是我把我原来的熊猫数据帧转换成了DMatrix。如何正确关联特征名称,以使特征重要性图显示它们?
发布于 2017-10-26 07:13:06
您希望在创建xgb.DMatrix时使用feature_names参数
dtrain = xgb.DMatrix(Xtrain, label=ytrain, feature_names=feature_names)发布于 2019-03-12 20:42:31
如果你使用的是scikit learn包装器,你需要访问底层的XGBoost Booster并在其上设置特性名称,而不是scikit模型,如下所示:
model = joblib.load("your_saved.model")
model.get_booster().feature_names = ["your", "feature", "name", "list"]
xgboost.plot_importance(model.get_booster())发布于 2017-10-26 21:48:15
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)https://stackoverflow.com/questions/46943314
复制相似问题