2017-02-26 4 views
4

der xgboost plotting API heißt es:XGBoost Grundstück Bedeutung hat keine Eigenschaft max_num_features

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)¶ 

Grundstück Bedeutung basierend auf Einbau Bäumen.

Parameter: aber

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. 

In meiner Implementierung, Laufen:

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) 

Returns:

AttributeError: Unknown property max_num_features 

Während des Laufens ohne den Parameter max_num_features Plots korrekt das gesamte Feature-Set (was in meinem Fall gigantisch ist, ~ 10k Features). Irgendwelche Ideen von was ist los?

Vielen Dank im Voraus.

Details:

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

Antwort

5

Versuchen Sie, Ihre xgboost Bibliothek ein Upgrade auf:

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

> pip freeze | grep xgboost 
    xgboost==0.4a30 
+0

Yep! XGboost hat nicht die nettesten Dokumente, aber nachdem ich herausgefunden hatte, dass es funktionierte. Ich akzeptiere deine Antwort, da sie jetzt relevanter ist (irgendwie habe ich vergessen, diese Frage gestellt zu haben). –

1

Bis auf weiteres ich das Problem (zumindest teilweise) mit diesem Skript gelöst haben 0.6. Es sollte das Problem lösen. Um das Paket zu aktualisieren, versuchen Sie dies:

$ pip install -U xgboost 

Wenn Sie eine Fehlermeldung erhalten, dies versuchen:

$ brew install [email protected] 
$ pip install -U xgboost 

(Siehe diese https://github.com/dmlc/xgboost/issues/1501)

+0

Mit XGBRegressor, bekomme ich 'feature_importances_' nicht gefunden Fehler. – xgdgsc

+0

@xgdgsc müssen Sie möglicherweise xgboost aktualisieren. feature_importances_ ist eindeutig Teil ihrer neuesten API. Siehe diesen Beitrag für weitere Informationen: http://stackoverflow.com/questions/38212649/feature-importance-with-xgbclassifier –

2

Trotz des Titels der Dokumentation webpage ("Python-API-Referenz - xgboost 0.6-Dokumentation"), es enthält nicht die Dokumentation für die Version 0.6 von xgboost. Stattdessen scheint es zu sein, um die Dokumentation für den spätesten Gitmeisterzweig zu enthalten.

Als weitere Prüfung, lassen Sie uns überprüfen Sie die 0.60 Release-Tarball:

This is a stable release of 0.6 version 

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

Der dass hinzugefügt plot_importance() ‚s max_num_features wurde am Jan 16 2017 gemacht begehen:

Die 0,6 Freisetzung von xgboost wurde am Jul 29 2016 gemacht:

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. 

Daher scheint dies ein Dokumentationsfehler mit t zu sein er xgboost Projekt.

1

Nur etwas hinzuzufügen. Ich habe immer noch diesen Fehler und ich glaube, andere haben es auch.Also, bis dieses Problem behoben ist hier eine andere Art und Weise das Gleiche zu erreichen:

max = 50 
xgboost.plot_importance(dict(sorted(bst.get_fscore().items(), reverse = True, key=lambda x:x[1])[:max]), ax = ax, height = 0.8) 

wie Sie können auch ein dict zum Grundstück passieren, erhalten Sie im Grunde die fscore, sortieren Sie die Elemente in umgekehrter Reihenfolge, wählen Sie die gewünschte Anzahl der Top-Features dann wieder in dict konvertieren.

Ich hoffe, dass dies hilft jedem anderen mit dem gleichen Problem zu versuchen, nur eine bestimmte Anzahl von Features von ihrer Bedeutung ausgehend von der Top-Funktion zu plotten, anstatt sie alle zu plotten.

Verwandte Themen