Comment sont feature_importances dans RandomForestClassifier déterminé?
J'ai une tâche de classification avec une série de temps que la saisie des données, où chaque attribut (n=23) représente un point spécifique dans le temps. En plus de l'absolu classification résultat que je voudrais savoir, quels sont les attributs, les dates de contribuer à la résultat à quel point. Donc je suis juste en utilisant le feature_importances_
, qui fonctionne bien pour moi.
Cependant, je voudrais savoir comment ils sont calculés et qui mesure/algorithme est utilisé. Malheureusement je n'ai pas trouvé de documentation sur ce sujet.
- Woah trois core devs sur un fil. Ce doit être une sorte de record ^^
Vous devez vous connecter pour publier un commentaire.
Il y a en effet plusieurs façons d'obtenir la fonctionnalité "importances". Comme souvent, il n'existe pas de consensus strict sur ce que ce mot signifie.
Dans scikit-learn, nous mettons en œuvre l'importance comme décrit dans [1] (souvent cité, mais, malheureusement, rarement lu...). Il est parfois appelé "coefficient de gini importance" ou "diminution moyenne de l'impureté" et est définie comme la diminution totale du nœud de l'impureté (pondérée par la probabilité de parvenir à ce nœud (qui est évaluée en fonction de la proportion d'échantillons d'atteindre ce nœud)) en moyenne sur tous les arbres de l'ensemble.
Dans la littérature ou dans certains autres packages, vous pouvez également trouver disposent d'importances mis en œuvre comme la "réduction moyenne de la précision". Fondamentalement, l'idée est de mesurer la diminution de la précision sur LES données lorsque vous permuter aléatoirement les valeurs de cette fonction. Si la diminution est faible, alors la fonction n'est pas importante, et vice-versa.
(À noter que les deux algorithmes sont disponibles dans la randomForest package R.)
[1]: Breiman, Friedman, "Classification and regression trees", 1984.
tree_.compute_feature_importances(normalize=False)
.La manière habituelle pour calculer la fonction de l'importance des valeurs d'un seul arbre est comme suit:
vous initialiser un tableau
feature_importances
de tous les zéros avec la taillen_features
.vous traverse l'arbre: pour chaque noeud interne qui se divise sur la fonctionnalité
i
permet de calculer la réduction d'erreur de ce nœud multiplié par le nombre d'échantillons qui ont été acheminés vers le nœud et ajouter cette quantitéfeature_importances[i]
.L'erreur réduction dépend de l'impureté critère que vous utilisez (par exemple, le coefficient de Gini, l'Entropie, MSE, ...). Sa l'impureté de l'ensemble d'exemples qui est routée vers le noeud interne, moins la somme des impuretés des deux partitions créées par la scission.
Il est important que ces valeurs sont relatives à un ensemble de données spécifique (à la fois la réduction des erreurs et le nombre d'échantillons sont dataset spécifiques) ainsi, ces valeurs ne peuvent pas être comparés entre les différents ensembles de données.
Autant que je sache, il existe différentes façons de calculer la fonction de l'importance des valeurs dans les arbres de décision. Une brève description de la méthode ci-dessus peuvent être trouvés dans les "Éléments de Statistique de l'Apprentissage" par Trevor Hastie, Robert Tibshirani, et Jérôme Friedman.
C'est le ratio entre le nombre d'échantillons acheminés vers un nœud de décision impliquant la fonction dans un des arbres de l'ensemble, le nombre total d'échantillons dans l'ensemble de la formation.
Caractéristiques qui sont impliqués dans le haut niveau des nœuds des arbres de décision ont tendance à voir plus d'exemples sont donc susceptibles d'avoir plus d'importance.
Modifier: cette description n'est que partiellement correcte: Gilles et Pierre réponses sont la bonne réponse.
Comme @GillesLouppe souligné ci-dessus, scikit-learn implémente actuellement la "diminution moyenne de l'impureté" tonnes pour les longs importances. Personnellement, je trouve la seconde méthode un peu plus intéressant, où vous permuter aléatoirement les valeurs pour chacun de vos fonctions une par une et voir combien pire de votre sac de performance est.
Depuis que vous êtes après, avec la particularité est d'une importance combien chaque fonction contribue à l'ensemble de votre modèle prédictif de la performance, la deuxième métrique en fait vous donne une mesure directe de la ce, alors que la diminution moyenne de l'impureté" est juste un bon proxy.
Si vous êtes intéressé, j'ai écrit un petit paquet qui implémente la Permutation Importance métrique et peut être utilisé pour calculer les valeurs à partir d'une instance d'un scikit-learn forêt au hasard de classe:
https://github.com/pjh2011/rf_perm_feat_import
Edit: Cela fonctionne pour Python 2.7, pas 3
Laissez-moi essayer de répondre à la question.
code:
decision_tree parcelle:
entrez la description de l'image ici
Nous pouvons obtenir compute_feature_importance:[0. ,0.01333333,0.06405596,0.92261071]
Vérifier le code source:
Essayer de calculer la fonction de l'importance:
Nous obtenons feature_importance: np.tableau([0,1.332,6.418,92.30]).
Après avoir normalisé, nous pouvons obtenir la matrice de ([0., 0.01331334, 0.06414793, 0.92253873]),ce sont les mêmes que
clf.feature_importances_
.Attention, toutes les classes sont censés avoir un poids.
Pour ceux qui recherchent une référence à la scikit-learn de la documentation sur ce sujet ou d'une référence à la réponse de @GillesLouppe:
Dans RandomForestClassifier,
estimators_
attribut est une liste de DecisionTreeClassifier (comme mentionné dans le la documentation). Afin de calculer lefeature_importances_
pour la RandomForestClassifier, dans scikit-learn code source, il est en moyenne sur toute l'estimateur (tous les DecisionTreeClassifer s)feature_importances_
attributs dans l'ensemble.Dans DecisionTreeClassifer de la documentation, il est mentionné que "L'importance d'une fonction est calculée comme le (normalisé) total de la réduction du critère introduit par cette fonctionnalité. Il est également connu comme le coefficient de Gini importance [1]."
Ici est un lien direct pour de plus amples informations sur la variable et le coefficient de Gini importance, comme prévu par la scikit-learn référence ci-dessous.
[1] L. Breiman, et A. Cutler, “Forêts Aléatoires”, http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm