scikit learn – cálculo de importancia de características en árboles de decisión

Estoy tratando de entender cómo se calcula la importancia de la característica para los árboles de decisión en el sci-kit learn. Esta pregunta se ha hecho antes, pero no puedo reproducir los resultados que proporciona el algoritmo.

Por ejemplo:

from StringIO import StringIO from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.tree.export import export_graphviz from sklearn.feature_selection import mutual_info_classif X = [[1,0,0], [0,0,0], [0,0,1], [0,1,0]] y = [1,0,1,1] clf = DecisionTreeClassifier() clf.fit(X, y) feat_importance = clf.tree_.compute_feature_importances(normalize=False) print("feat importance = " + str(feat_importance)) out = StringIO() out = export_graphviz(clf, out_file='test/tree.dot') 

resultados en importancia de la característica:

 feat importance = [0.25 0.08333333 0.04166667] 

Y da el siguiente árbol de decisión:

árbol de decisión

Ahora, esta respuesta a una pregunta similar sugiere que la importancia se calcula como

formula_a

Donde G es la impureza del nodo, en este caso la impureza del gini. Esta es la reducción de la impureza por lo que yo entendí. Sin embargo, para la característica 1 esto debería ser:

formula_b

Esta respuesta sugiere que la importancia es ponderada por la probabilidad de alcanzar el nodo (que se aproxima por la proporción de muestras que llegan a ese nodo). De nuevo, para la característica 1, esto debería ser:

formula_c

Ambas fórmulas proporcionan el resultado equivocado. ¿Cómo se calcula correctamente la importancia de la característica?

Creo que la importancia de la función depende de la implementación, por lo que debemos consultar la documentación de scikit-learn.

La importancia de la característica. Cuanto más alto, más importante es la característica. La importancia de una característica se calcula como la reducción total (normalizada) del criterio presentado por esa característica. También es conocida como la importancia de Gini.

Esa reducción o ganancia de información ponderada se define como:

La ecuación de disminución de impureza ponderada es la siguiente:

N_t / N * (impurity - N_t_R / N_t * right_impurity - N_t_L / N_t * left_impurity)

donde N es el número total de muestras, N_t es el número de muestras en el nodo actual, N_t_L es el número de muestras en el elemento secundario izquierdo y N_t_R es el número de muestras en el elemento secundario derecho.

http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier

Dado que cada función se usa una vez en su caso, la información de la función debe ser igual a la ecuación anterior.

Para X [2]:

feature_importance = (4 / 4) * (0.375 - (0.75 * 0.444)) = 0.042

Para X [1]:

feature_importance = (3 / 4) * (0.444 - (2/3 * 0.5)) = 0.083

Para X [0]:

feature_importance = (2 / 4) * (0.5) = 0.25