Selección con DecisionTreeClassifier

Los árboles de decisión en Scikit-Learn (y los algoritmos basados en éstos) dan acceso a la importancia de las características a través del atributo .feature_importances_, siendo calculada la importancia de una característica como la reducción total (normalizada) del criterio de medición que se esté usando ("gini", "entropy" o "log_loss").

Por ejemplo, apliquemos el árbol de decisión implementado en la clase DecisionTreeClassifier sobre el dataset wine que hemos cargado. Importamos la clase y la instanciamos fijando como profundidad máxima, por ejemplo, 4:

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth = 4, random_state = 0)

Validemos, en primer lugar, el modelo usando validación cruzada:

cross_val_score(model, X, y, cv = 5).mean()
0.9

Se clasifican correctamente el 90% de las muestras.

Ahora entrenemos el algoritmo:

model.fit(X, y)

Selección con DecisionTreeClassifier

y mostremos la importancia relativa dada a cada característica:

importances = model.feature_importances_
importances
array([0.01889005, 0.04137821, 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.11599466,
       0.        , 0.        , 0.82373707])

Podemos mostrar estos valores en un gráfico de barras: Para ello extraemos los nombres de las características:

feature_names = X.columns

y los índices de las importancias dadas, ordenadas de mayor a menor:

indices = np.argsort(importances)
indices
array([ 2,  3,  4,  5,  6,  7,  8, 10, 11,  0,  1,  9, 12], dtype=int64)

Ahora ordenamos los nombres de las características y los valores obtenidos:

sorted_importances = importances[indices]
sorted_feature_names = feature_names[indices]

Por último, mostramos la gráfica:

fig, ax = plt.subplots()
ax.barh(y = sorted_feature_names, width = sorted_importances, zorder = 10)
ax.grid(color = "#EEEEEE", zorder = 0)
ax.set_xlabel("Feature importance")
ax.set_ylabel("Feature name")
plt.show()
Selección con DecisionTreeClassifier

Si nos quedamos solo con las características que han recibido alguna importancia:

features = list(X.columns[np.nonzero(model.feature_importances_)])
features
['alcohol', 'malic_acid', 'color_intensity', 'proline']

y validamos el modelo resultante de entrenar un árbol de decisión solo a partir de ellas:

cross_val_score(model, X[features], y, cv = 5).mean()
0.9307692307692308

comprobamos que, en este caso, el porcentaje de muestras clasificadas ha aumentado con respecto al modelo previo.