Selección con RandomForestClassifier

Probablemente, más significativo es el resultado dado por Random Forest, considerando que el entrenamiento de, por ejemplo, 500 árboles va a poner de manifiesto más claramente la mejora en el modelo provocada por cada característica.

Importamos, por lo tanto, la clase RandomForestClassifier:

from sklearn.ensemble import RandomForestClassifier

E instanciamos el algoritmo, especificando una profundidad máxima de 3:

model = RandomForestClassifier(max_depth = 3, random_state = 0)

Validemos el modelo usando validación cruzada:

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

Se están clasificando correctamente el 98.4% de las muestras.

Ahora entrenamos el modelo:

model.fit(X, y)

Selección con RandomForestClassifier

Comprobemos la importancia dada a cada característica:

importances = model.feature_importances_
importances
array([0.21155707, 0.02412791, 0.01222372, 0.03080394, 0.07119242,
       0.02969107, 0.09606957, 0.00769978, 0.00751063, 0.20109894,
       0.00740945, 0.01171158, 0.28890394])

Mostremos esta información en una gráfica de barras:

indices = np.argsort(importances)
sorted_importances = importances[indices]
sorted_feature_names = feature_names[indices]
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 RandomForestClassifier

Validemos el modelo si solo lo entrenásemos con las 5 características que mayor importancia han recibido:

cross_val_score(model, X[sorted_feature_names[-5:]], y, cv = 5).mean()
0.976923076923077

Podríamos visualizar el porcentaje de aciertos considerando las n características con mayor importancia, haciendo variar n entre 1 y el número total de características, para lo que podemos entrenar 13 modelos y almacenar el porcentaje obtenido tras cada entrenamiento en la lista scores:

scores = []
for num_features in range(1, len(X.columns) + 1):
    score = cross_val_score(
                model,
                X[sorted_feature_names[-num_features:]],
                y,
                cv = 5
            ).mean()
    scores.append(score)

Por último mostremos la evolución del "score" en función del número de características en una gráfica:

Selección con RandomForestClassifier

Comprobamos que se alcanza el máximo con 7 características.