在不重新训练模型的情况下,如何在XGBoost特征重要性图中获取实际的特征名称?

时间:2019-02-28 20:33:08

标签: python dataframe xgboost

我在Stackoverflow上遇到了几个问题,大众所面临的问题是,在使用例如

拟合/训练XGBoost模型之前,他们预处理训练数据,例如使用中心和比例尺等。
`

scaler = MinMaxScaler(feature_range=(0, 1))
X = scaler.fit_transform(X)
my_model_name = XGBClassifier()
my_model_name.fit(X,Y)` 

其中X和Y分别是训练数据和标签,按比例缩放将返回2D NumPy数组,从而丢失要素名称。

我已经训练了XGBoost模型,但是使用了预处理的数据(使用MinMaxScaler的中心和比例)。因此,我处于类似的情况,其中列名/功能名丢失了。因此,当我尝试使用plot_importance(my_model_name)时,它会得出特征重要性的图,但是只有特征名称为f0,f1,f2等,而没有数据集中的实际特征名称(必须如此)很明显。

SO上的大多数答案都与以不丢失要素名称的方式训练模型有关(例如,在数据框列上使用pd.get_dummies。我有一个疑问,当我使用{时,如何获取实际的要素名称{1}},而无需重新训练模型吗?有没有办法将特征名称f0,f1,f2等从原始训练数据(未经预处理,带有列名)映射到生成的特征重要性图,以便在图表中标出了实际的功能名称,对此表示任何帮助。

2 个答案:

答案 0 :(得分:10)

您可以通过以下方式获取功能名称:

model.get_booster().feature_names

答案 1 :(得分:2)

您是对的,当您将 NumPy 数组传递给 XGBoost 的 fit 方法时,您会丢失功能名称。在这种情况下,调用 model.get_booster().feature_names 没有用,因为返回的名称采用 [f0, f1, ..., fn] 形式,并且这些名称也显示在 plot_importance 方法的输出中。

但是应该有几种方法可以实现您想要的 - 假设您将原始功能名称存储在某处,例如orig_feature_names = ['f1_name', 'f2_name', ..., 'fn_name'] 或直接 orig_feature_names = X.columns 如果 X 是 Pandas DataFrame。

那么你应该能够:

  • 更改存储的特征名称 (model.get_booster().feature_names = orig_feature_names),然后使用 plot_importance 方法,该方法应该已经采用更新的名称并将其显示在图上
  • 或者由于此方法返回 matplotlib ax,您可以使用 plot_importance(model).set_yticklabels(orig_feature_names) 修改标签(但您必须设置正确的功能顺序)
  • 或者您可以将model.feature_importances_与您自己的原始特征名称结合起来(即自己绘制)
  • 或者您可以尝试使用 Learning API 和 xgboost DMatrix 并在使用 train_data = xgb.DMatrix(X, label=Y, feature_names=orig_feature_names) 创建数据集(缩放后)期间指定您的特征名称(但我对这种方式没有太多经验培训,因为我通常使用 Scikit-Learn API)