web-dev-qa-db-fra.com

matplotlib: Importance des fonctionnalités de tracé avec les noms des fonctionnalités

Dans R, il existe des fonctions prédéfinies pour tracer l'importance des caractéristiques du modèle de forêt aléatoire. Mais en python une telle méthode semble être manquante. Je recherche une méthode dans matplotlib.

model.feature_importances me donne ce qui suit:

array([  2.32421835e-03,   7.21472336e-04,   2.70491223e-03,
         3.34521084e-03,   4.19443238e-03,   1.50108737e-03,
         3.29160540e-03,   4.82320256e-01,   3.14117333e-03])

Puis en utilisant la fonction de traçage suivante:

>> pyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)
>> pyplot.show()

J'obtiens un barplot mais j'aimerais obtenir un barplot avec des étiquettes tout en montrant l'importance horizontalement de manière triée. J'explore également seaborn et je n'ai pas pu trouver de méthode.

8
add-semi-colons

Je ne sais pas exactement ce que vous cherchez. Dérivé d'un exemple de ici . Comme mentionné dans le commentaire: vous pouvez changer indices en une liste d'étiquettes à la ligne plt.yticks(range(X.shape[1]), indices) si vous souhaitez personnaliser les étiquettes de fonction.

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import make_classification
from sklearn.ensemble import ExtraTreesClassifier

# Build a classification task using 3 informative features
X, y = make_classification(n_samples=1000,
                           n_features=10,
                           n_informative=3,
                           n_redundant=0,
                           n_repeated=0,
                           n_classes=2,
                           random_state=0,
                           shuffle=False)

# Build a forest and compute the feature importances
forest = ExtraTreesClassifier(n_estimators=250,
                              random_state=0)

forest.fit(X, y)
importances = forest.feature_importances_
std = np.std([tree.feature_importances_ for tree in forest.estimators_],
             axis=0)
indices = np.argsort(importances)

# Plot the feature importances of the forest
plt.figure()
plt.title("Feature importances")
plt.barh(range(X.shape[1]), importances[indices],
       color="r", xerr=std[indices], align="center")
# If you want to define your own labels,
# change indices to a list of labels on the following line.
plt.yticks(range(X.shape[1]), indices)
plt.ylim([-1, X.shape[1]])
plt.show()

enter image description here

8
Y. Luo

Réponse rapide pour les scientifiques des données qui n'ont pas de temps à perdre:

Chargez les importances de fonctionnalités dans une série pandas indexée par les noms de vos colonnes, puis utilisez sa méthode de tracé. Pour un classificateur model formé à l'aide de X:

feat_importances = pd.Series(model.feature_importances_, index=X.columns)
feat_importances.nlargest(20).plot(kind='barh')

Réponse légèrement plus détaillée avec un exemple complet:

En supposant que vous avez formé votre modèle avec des données contenues dans un cadre de données pandas, cela est assez indolore si vous chargez l'importance de la fonctionnalité dans la série d'un panda, vous pouvez tirer parti de son indexation pour afficher facilement les noms des variables L'argument de tracé kind='barh' Nous donne un graphique à barres horizontales, mais vous pouvez facilement substituer cet argument à kind='bar' Pour un graphique à barres traditionnel avec les noms des entités le long de l'axe des X si vous préférez.

nlargest(n) est une méthode pandas Series qui retournera un sous-ensemble de la série avec les plus grandes valeurs n. Ceci est utile si vous avez beaucoup de fonctionnalités de votre modèle et vous voulez seulement tracer le plus important.

Un exemple complet rapide utilisant le jeu de données classique Kaggle Titanic ...

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
%matplotlib inline            # don't forget this if you're using jupyter!

X = pd.read_csv("titanic_train.csv")
X = X[['Pclass', 'Age', 'Fare', 'Parch', 'SibSp', 'Survived']].dropna()
y = X.pop('Survived')

model = RandomForestClassifier()
model.fit(X, y)

(pd.Series(model.feature_importances_, index=X.columns)
   .nlargest(4)
   .plot(kind='barh'))        # some method chaining, because it's sexy!

Ce qui vous donnera ceci:

sklearn random forest feature importances

25
fordy