Je suis un peu pressé de terminer cette présentation de demain au propriétaire du projet. Nous sommes un petit groupe d'étudiants en économie en Allemagne essayant de comprendre l'apprentissage automatique avec python. Nous avons mis en place un classificateur de forêt aléatoire et sommes désespérés de montrer aux estimateurs les caractéristiques importantes dans un graphique soigné. En appliquant la recherche Google, nous avons trouvé la solution suivante qui fait l'affaire, mais nous laisse insatisfaits en raison du chevauchement des étiquettes sur l'axe des y. Le code que nous avons utilisé ressemble à ceci:

feature_importances = clf.best_estimator_.feature_importances_
feature_importances = 100 * (feature_importances / feature_importances.max())
sorted_idx = np.argsort(feature_importances)

pos = np.arange(sorted_idx.shape[0])
plt.barh(pos, feature_importances[sorted_idx], align='center', height=0.8)
plt.yticks(pos, df_year_four.columns[sorted_idx])
plt.show()

Pour des raisons de confidentialité, permettez-moi de dire ceci: les noms des fonctionnalités sur l'axe des y se chevauchent (il y en a environ 30). Je cherchais dans la documentation de matplotlib afin de comprendre comment faire cela par moi-même, malheureusement je n'ai rien trouvé d'utile. Il semble que la formation et le test des modèles sont plus faciles que de comprendre matplotlib et de créer des graphiques: D

Merci beaucoup pour votre aide et votre temps, je l'apprécie.

0
Vladi_98 1 juin 2020 à 23:15

3 réponses

Meilleure réponse

Je vois votre solution et je souhaite simplement ajouter ce lien ici pour expliquer pourquoi: Comment modifier l'espacement entre les graduations dans matplotlib?

L'espacement entre les graduations est exclusivement déterminé par l'espace entre les graduations sur les axes. Par conséquent, la seule façon d'obtenir plus d'espace entre des étiquettes de graduation données est d'agrandir les axes.

La question que j'ai liée montre qu'en rendant le graphique suffisamment grand, vos étiquettes d'axe seraient naturellement mieux espacées.

0
Nicholas 1 juin 2020 à 20:36

Vous utilisez np.argsort qui renverra un tableau numpy avec de nombreux indices. Et vous utilisez ce tableau comme étiquettes pour votre axe Y, il y a donc un chevauchement des étiquettes.

Ma suggestion sera d'utiliser un index pour sorted_idx comme,

plt.yticks(pos, df_year_four.columns[sorted_idx[0]])

Cela ne tracera que pour 1 étiquette.

0
Amber Bhanarkar 1 juin 2020 à 20:22

Got it les gars! «Geistesblitz» comme on dit en Allemagne! (éclaircissement spirituel) Voir la variable feature_importances dans la troisième ligne du haut? Ajouter feature_importnaces[:-15] pour afficher uniquement la moitié supérieure des entités et desserrer l'axe y. Oui!!! Cela fonctionne bien car il existe des fonctionnalités beaucoup moins importantes.

0
Vladi_98 1 juin 2020 à 20:33