在训练XGBoost模型之前对训练数据进行预处理(例如居中或缩放)可能会导致特征名称丢失。大多数关于SO的答案建议以不丢失特征名称的方式训练模型(例如在数据框列上使用pd.get_dummies)。
我已经使用预处理的数据(中心和比例使用MinMaxScaler)训练了一个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数组,从而丢弃PandasDataFrame中的特征名称。
因此,当我尝试使用plot_importance(my_model_name)
时,它会导致特征重要性图,但只有f0、f1、f2等特征名称,而不是来自原始数据集的实际特征名称。是否有办法将来自原始训练数据的特征名称Map到生成的特征重要性图?以便在图形中绘制原始特性名称?在这方面的任何帮助都将受到高度赞赏。
4条答案
按热度按时间g6ll5ycj1#
您可以通过以下方式获取功能名称:
model.get_booster().feature_names
bejyjqdl2#
你是对的,当你把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是PandasDataFrame。然后,您应该能够:
model.get_booster().feature_names = orig_feature_names
),然后使用plot_importance
方法,该方法应已采用更新后的名称并将其显示在图上plot_importance(model).set_yticklabels(orig_feature_names)
修改标签(但是你必须设置正确的要素顺序)model.feature_importances_
和你原来的特性名自己合并(即自己绘制)model.get_booster().get_score()
方法,并将其与特性名称结合使用DMatrix
学习API,并在使用train_data = xgb.DMatrix(X, label=Y, feature_names=orig_feature_names)
创建数据集(缩放后)期间指定您的特征名称(但我对这种培训方式没有太多经验,因为我通常使用Scikit-Learn API)编辑:
感谢@Noob Programmer(见下面的评论),使用不同的特征重要性方法可能会有一些“不一致”。这些是最重要的:
xgboost.plot_importance
使用“权重”作为默认重要性类型(请参见plot_importance)model.get_booster().get_score()
也使用“weight”作为默认值(请参见get_score)model.feature_importances_
依赖于 importance_type 参数(model.importance_type
),似乎结果被归一化为1的和(参见此注解)有关此主题的详细信息,请参阅How to get feature importance。
ubbxdtey3#
我尝试了上面的答案,但在训练后加载模型时不起作用。因此,我的工作代码是:
它将返回要素名称的列表
ctrmrzij4#
我想,最好是把numpy数组变回PandasDataFrame。
这将显示原始名称。