Estoy usando el clasificador de bosque aleatorio scikit-learn y quiero trazar la importancia de la característica, como en este ejemplo .
Sin embargo, mi resultado es completamente diferente, en el sentido de que la desviación estándar de la importancia de la característica es casi siempre mayor que la importancia de la característica misma (ver imagen adjunta).
¿Es posible tener este tipo de comportamiento, o estoy cometiendo algunos errores al trazarlo?
Mi código es el siguiente:
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
devuelve un objeto al que hacenumpy array
referencia a unpandas Dataframe
objeto por sus columnas que es incorrecto yanumpy arrays
que no tiene el atributocolumns
.pandas DataFrame
con formam x n
ym x 1
. Debería estar claro ahora.tsfresh
que me ayudó a identificar características relevantes y reducir mis características de 600+ a alrededor de 400. ! [Mis 35 características principales ] ( i.stack.imgur.com/0MROZ.png ) Incluso con esto, el algoritmo está funcionando bien para mi. Tengo una clasificación binaria, éxito / fracaso. Prácticamente no obtengo falsos éxitos, pero extraño un porcentaje considerable de éxitos. Todas las conjeturas anteriores parecen razonables. Podría ser el caso de que deba haber un conjunto de capacitación y pruebas más amplio. Tengo menosRespuestas:
Está utilizando RandomForest con el número predeterminado de árboles, que es 10. Para alrededor de 30 funciones, esto es muy poco. Por lo tanto, la desviación estándar es grande. Pruebe al menos 100 o incluso 1000 árboles, como
Para un análisis más refinado, también puede verificar qué tan grande es la correlación entre sus características.
fuente
min_samples_split
) porque no puedo revelar los datos en los que estoy trabajando. Sin embargo, ¿se debe a la cantidad de árboles, más otros parámetros, o estoy cometiendo algunos errores aquí?Tu resultado no es tan raro. Como dice lanenok , en un primer paso debe aumentar el número de árboles para asegurarse de obtener un resultado 'estadístico' con respecto a las características importantes.
Sin embargo, como este artículo de Genuer et al. (2010) muestra que, en realidad, puede usar las desviaciones estándar para eliminar funciones. Para citar: " Podemos ver que las desviaciones estándar de las variables verdaderas son grandes en comparación con las variables ruidosas, que está cerca de cero " .
fuente
Tratar
clf = RandomForestClassifier(max_features=None)
. Elmax_features
parámetro predeterminado'auto'
es el equivalente asqrt(n_features)
.max_features
se describe como "El número de características a tener en cuenta al buscar la mejor división". Solo mirar una pequeña cantidad de características en cualquier punto del árbol de decisiones significa que la importancia de una sola característica puede variar ampliamente en muchos árboles. Por lo tanto, no mire un subconjunto aleatorio, solo mire todas las características en cada nivel del árbol.fuente
sqrt(n_features)
olog2(n_features)
.max_features=None
ya no considera un subconjunto aleatorio de características. No estoy seguro de si esto afecta la solución propuesta anteriormente. Una posibilidad es que muchas características simplemente tienen una gran importancia y, por lo tanto, varían ampliamente en el conjunto de árboles. O tal vez no hay suficientes muestras y, por lo tanto, no se consideran todas las características cuando se toca una hoja.Una razón común para esto es que los parámetros que proporcionó (o los valores predeterminados)
RandomForestClassifier
no son adecuados para su conjunto de datos.Una forma común de abordar este problema es buscar en el espacio del hiperparámetro usando, por ejemplo
GridSearchCV
:param_grid
Aquí están las permutaciones de los parámetros en los que desea buscar ymake_scorer(accuracy_score)
la medida que desea optimizar.Tenga en cuenta que
accuracy_score
es adecuado para conjuntos equilibrados, pero no para conjuntos no equilibrados. Elija una métrica adecuada para su objetivo particular.fuente
Podría haber múltiples razones. La cantidad de árboles y la profundidad pueden cambiar sus resultados. Si su modelo no funciona bien después de seleccionar los parámetros (validación cruzada, etc.), probablemente sea porque sus características no son muy predictivas, por lo que se seleccionan casi "al azar", lo que conduce a desviaciones estándar altas de un árbol a otro. Pero hay otras posibilidades, por ejemplo, también podría ser que sus características estén altamente correlacionadas. Un poco más de información sería útil.
fuente