J'utilise scikit-learn Random Forest Classifier et je veux tracer l'importance des fonctionnalités, comme dans cet exemple .
Cependant, mon résultat est complètement différent, dans le sens où l'écart-type de l'importance des fonctionnalités est presque toujours plus important que l'importance des fonctionnalités elle-même (voir l'image jointe).
Est-il possible d'avoir un tel comportement ou est-ce que je fais des erreurs en le traçant?
Mon code est le suivant:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())
importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns,
columns=["Importance"])
importance["Std"] = np.std([tree.feature_importances_
for tree in clf.estimators_], axis=0)
x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]
plt.bar(x, y, yerr=yerr, align="center")
plt.show()
predictors
renvoie un élémentnumpy array
auquel vous faites référence à unpandas Dataframe
objet par ses colonnes, ce qui est incorrect carnumpy arrays
il n'a pas d'attributcolumns
.pandas DataFrame
de formem x n
et dem x 1
. Cela devrait être clair maintenant.tsfresh
qui m'a aidé à identifier les fonctionnalités pertinentes et à réduire mes fonctionnalités de 600+ à environ 400. ! [Mes 35 meilleures fonctionnalités ] ( i.stack.imgur.com/0MROZ.png ) Même avec cela, l'algorithme fonctionne bien pour moi. J'ai une classification binaire, succès / échec. Je n'obtiens pratiquement aucun faux succès, mais je rate un pourcentage considérable de succès. Toutes les suppositions ci-dessus semblent raisonnables. Cela pourrait être le cas, il devrait y avoir un plus grand ensemble de formation et de test. J'ai moinsRéponses:
Vous utilisez RandomForest avec le nombre d'arbres par défaut, qui est de 10. Pour environ 30 fonctionnalités, c'est trop peu. L'écart type est donc important. Essayez au moins 100 ou même 1000 arbres, comme
Pour une analyse plus précise, vous pouvez également vérifier l'ampleur de la corrélation entre vos fonctionnalités.
la source
min_samples_split
) parce que je ne peux pas divulguer les données sur lesquelles je travaille. Cependant, est-ce dû au nombre d'arbres, ainsi qu'à d'autres paramètres, ou est-ce que je fais des erreurs ici?Votre résultat n'est pas si étrange. Comme l' indique lanenok , vous devez dans un premier temps augmenter le nombre d'arbres afin de vous assurer d'obtenir un résultat «statistique» concernant les importances des fonctionnalités.
Cependant, comme cet article de Genuer et al. (2010) montre que vous pouvez réellement utiliser les écarts-types pour éliminer les fonctionnalités. Pour citer: " Nous pouvons voir que l'écart-type des variables réelles est important par rapport à celui des variables bruyantes, qui est proche de zéro. "
la source
Essayez
clf = RandomForestClassifier(max_features=None)
. Lemax_features
paramètre par défaut'auto'
est équivalent àsqrt(n_features)
.max_features
est décrit comme «le nombre de fonctionnalités à prendre en compte lors de la recherche de la meilleure répartition». Le fait de ne regarder qu’un petit nombre de caractéristiques à un moment quelconque de l’arbre de décision signifie que l’importance d’une seule caractéristique peut varier considérablement d’un arbre à l’autre. Donc, ne regardez pas un sous-ensemble aléatoire, regardez simplement toutes les fonctionnalités à chaque niveau de l'arborescence.la source
sqrt(n_features)
oulog2(n_features)
.max_features=None
ne considère plus un sous-ensemble aléatoire de fonctionnalités. Je ne sais pas si cela affecte la solution proposée ci-dessus. Une possibilité est que de nombreuses caractéristiques ont simplement une grande importance et varient donc considérablement à travers l'ensemble des arbres. Ou peut-être qu'il n'y a pas assez d'échantillons et donc toutes les fonctionnalités ne sont pas prises en compte au moment où vous touchez une feuille.Une raison courante à cela est que les paramètres que vous avez fournis (ou par défaut)
RandomForestClassifier
ne sont pas adaptés à votre ensemble de données.Une façon courante de résoudre ce problème consiste à rechercher l'espace hyperparamétrique en utilisant, par exemple
GridSearchCV
:param_grid
voici les permutations des paramètres que vous souhaitez rechercher, etmake_scorer(accuracy_score)
la mesure que vous souhaitez optimiser.Notez que cela
accuracy_score
convient aux ensembles symétriques, mais pas aux ensembles asymétriques. Choisissez une métrique appropriée pour votre objectif particulier.la source
Il peut y avoir plusieurs raisons. Le nombre d'arbres et la profondeur peuvent changer vos résultats. Si votre modèle ne fonctionne pas bien après avoir sélectionné les paramètres (validation croisée, etc.), c'est probablement parce que vos fonctionnalités ne sont pas très prédictives, donc elles sont choisies presque "au hasard", ce qui conduit à des écarts-types élevés d'arbre en arbre. Mais il existe d'autres possibilités, par exemple, il se pourrait également que vos fonctionnalités soient fortement corrélées. Un peu plus d'informations seraient utiles.
la source