我在Python中使用XGBoost,并使用XGBoost train()
函数对DMatrix
数据进行了成功的训练。矩阵是从Pandas Dataframe 创建的,其中列具有特征名称。
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
等,如下所示。
我认为问题是我把原始的Pandas数据框转换成了一个DMatrix。我怎样才能正确地关联特征名称,以便特征重要性图显示它们呢?
9条答案
按热度按时间31moq8wy1#
如果你使用的是scikit-learn Package 器,你需要访问底层的XGBoost Booster并在上面设置特性名称,而不是scikit模型,如下所示:
ldxq2e6h2#
您希望在创建
xgb.DMatrix
时使用feature_names
参数yptwkmov3#
train_test_split
将 Dataframe 转换为numpy数组,该数组不再具有列信息。您可以按照@piRSquared的建议,将这些特性作为参数传递给DMatrix构造函数,也可以将从
train_test_split
返回的numpy数组转换为Dataframe,然后使用您的代码。enyaitl34#
使用Scikit-Learn Package 器接口“XGBClassifier”,plot_importance返回类“matplotlib Axes”,因此我们可以使用axes.set_yticklabels。
第一个月
55ooxyrt5#
当我在玩
feature_names
的时候,我发现了另一种方法。当我在玩它的时候,我写了这个,它可以在我现在运行的XGBoost v0.80上工作。这是单独保存
feature_names
,然后再添加回去,由于某种原因,feature_types
也需要初始化,即使值是None
。ajsxfq5m6#
示例化XGBoost分类器时,应指定feature_names:
请注意,如果您将xgb分类器 Package 在sklearn管道中,该管道对列执行任何选择(例如VarianceThreshold),则xgb分类器在尝试拟合或转换时将失败。
c9qzyr3d7#
如果接受培训
您可以执行
model.get_booster().get_fscore()
来获取特性名称和特性重要性作为python dicthkmswyz68#
你也可以不使用DMatrix来简化代码。列名被用作标签:
dpiehjr49#
使用feature_names重命名ytick标注,作为传递到matplotlib.axes.Axes.set_yticklabels的字符串列表