XGBoost图重要性没有属性max_num_features

时间:2017-02-26 00:54:53

标签: python feature-selection xgboost

xgboost的plotting API州:

xgboost.plot_importance(booster, ax=None, height=0.2, xlim=None, ylim=None, title='Feature importance', xlabel='F score', ylabel='Features', importance_type='weight', max_num_features=None, grid=True, **kwargs)¶

根据拟合的树木绘制重要性。

参数:

booster (Booster, XGBModel or dict) – Booster or XGBModel instance, or dict taken by Booster.get_fscore()
...
max_num_features (int, default None) – Maximum number of top features displayed on plot. If None, all features will be displayed.

然而,在我的实现中,运行:

booster_ = XGBClassifier(learning_rate=0.1, max_depth=3, n_estimators=100, 
                      silent=False, objective='binary:logistic', nthread=-1, 
                      gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, 
                      colsample_bytree=1, colsample_bylevel=1, reg_alpha=0,
                      reg_lambda=1, scale_pos_weight=1, base_score=0.5, seed=0)

booster_.fit(X_train, y_train)

from xgboost import plot_importance
plot_importance(booster_, max_num_features=10)

返回:

AttributeError: Unknown property max_num_features

在没有参数max_num_features的情况下运行它时,正确绘制了整个功能集(在我的情况下是巨大的,~10k功能)。 对于发生了什么的任何想法?

提前致谢。

详细说明:

> python -V
  Python 2.7.12 :: Anaconda custom (x86_64)

> pip freeze | grep xgboost
  xgboost==0.4a30

4 个答案:

答案 0 :(得分:6)

尝试将xgboost库升级到0.6。它应该解决问题。 要升级软件包,请尝试以下方法:

$ pip install -U xgboost

如果您收到错误,请尝试以下操作:

$ brew install gcc@5
$ pip install -U xgboost

(请参阅此https://github.com/dmlc/xgboost/issues/1501

答案 1 :(得分:2)

尽管文档标题为webpage(" Python API参考 - xgboost 0.6文档"),但它不包含xgboost的0.6版本的文档。相反,似乎包含最新git master分支的文档。

xgboost的0.6版本是在Jul 29 2016上发布的:

This is a stable release of 0.6 version

@tqchen tqchen released this on Jul 29 2016 · 245 commits to master since this release

Jan 16 2017上添加了plot_importance()' max_num_features的提交:

作为进一步检查,让我们检查0.60版本的tarball:

pushd /tmp
curl -SLO https://github.com/dmlc/xgboost/archive/v0.60.tar.gz
tar -xf v0.60.tar.gz 
grep num_features xgboost-0.60/python-package/xgboost/plotting.py
# .. silence.

因此,这似乎是xgboost项目的文档错误。

答案 2 :(得分:1)

直到另行通知我已用此脚本解决了问题(至少部分):

def feat_imp(df, model, n_features):

    d = dict(zip(df.columns, model.feature_importances_))
    ss = sorted(d, key=d.get, reverse=True)
    top_names = ss[0:n_features]

    plt.figure(figsize=(15,15))
    plt.title("Feature importances")
    plt.bar(range(n_features), [d[i] for i in top_names], color="r", align="center")
    plt.xlim(-1, n_features)
    plt.xticks(range(n_features), top_names, rotation='vertical')

 feat_imp(filled_train_full, booster_, 20)

enter image description here

答案 3 :(得分:1)

在这里添加一些内容。我仍然有这个错误,我相信其他人也有。所以在这个问题得到解决之前,这是另一种实现相同目标的方法:

objectInformation.Skip(2).Take(3)

因为你也可以将一个字典传递到情节,你基本上得到了fscore,按相反顺序对项目进行排序,选择所需数量的顶级特征然后转换回dict。

我希望这可以帮助其他任何有同样问题的人尝试从顶部特征开始,仅根据其重要性绘制一个certian数字特征,而不是将它们全部绘制出来。