我在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等从原始训练数据(未经预处理,带有列名)映射到生成的特征重要性图,以便在图表中标出了实际的功能名称,对此表示任何帮助。
答案 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
方法,该方法应该已经采用更新的名称并将其显示在图上plot_importance(model).set_yticklabels(orig_feature_names)
修改标签(但您必须设置正确的功能顺序)model.feature_importances_
与您自己的原始特征名称结合起来(即自己绘制)DMatrix
并在使用 train_data = xgb.DMatrix(X, label=Y, feature_names=orig_feature_names)
创建数据集(缩放后)期间指定您的特征名称(但我对这种方式没有太多经验培训,因为我通常使用 Scikit-Learn API)