Estou usando o Classificador Aleatório de Floresta scikit-learn e quero plotar a importância do recurso, como neste exemplo .
No entanto, meu resultado é completamente diferente, no sentido de que o desvio padrão da importância da característica é quase sempre maior do que a própria importância da característica (ver imagem em anexo).
É possível ter esse tipo de comportamento ou estou cometendo alguns erros ao traçá-lo?
Meu código é o seguinte:
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()
python
random-forest
gc5
fonte
fonte
predictors
retorna umnumpy array
que você está fazendo referência a umpandas Dataframe
objeto por ele é colunas que é incorreto comonumpy arrays
não tem o atributocolumns
.pandas DataFrame
com formam x n
em x 1
. Deve ficar claro agora.tsfresh
que me ajudou a identificar recursos relevantes e reduzir meus recursos de mais de 600 para cerca de 400. ! [Meus 35 principais recursos ] ( i.stack.imgur.com/0MROZ.png ) Mesmo com isso, o algoritmo está funcionando bem para mim. Eu tenho uma classificação binária, sucesso / fracasso. Não tenho praticamente nenhum sucesso falso, mas sinto falta de uma porcentagem considerável de sucesso. Todas as suposições acima parecem razoáveis. Pode ser que exista um conjunto maior de treinamento e teste. Eu tenho menosRespostas:
Você está usando o RandomForest com o número padrão de árvores, que é 10. Para cerca de 30 recursos, isso é muito pouco. Portanto, o desvio padrão é grande. Tente pelo menos 100 ou até 1000 árvores, como
Para uma análise mais refinada, você também pode verificar o tamanho da correlação entre seus recursos.
fonte
min_samples_split
) porque não posso divulgar os dados em que estou trabalhando. No entanto, é devido ao número de árvores, além de outros parâmetros, ou estou cometendo alguns erros aqui?Seu resultado não é tão estranho. Como afirma o lanenok , você deve, em um primeiro passo, aumentar o número de árvores para garantir um resultado 'estatístico' referente às importâncias do recurso.
No entanto, como este artigo de Genuer et al. (2010) mostra, você pode realmente usar os desvios padrão para eliminar recursos. Para citar: " Podemos ver que o desvio padrão das variáveis verdadeiras é grande comparado às variáveis barulhentas, próximas a zero " .
fonte
Tente
clf = RandomForestClassifier(max_features=None)
. Omax_features
padrão do parâmetro'auto'
é equivalente asqrt(n_features)
.max_features
é descrito como "O número de recursos a serem considerados ao procurar a melhor divisão". Observar apenas um pequeno número de recursos em qualquer ponto da árvore de decisão significa que a importância de um único recurso pode variar amplamente em várias árvores. Portanto, não olhe para um subconjunto aleatório, apenas observe todos os recursos em todos os níveis da árvore.fonte
sqrt(n_features)
oulog2(n_features)
.max_features=None
não considera mais um subconjunto aleatório de recursos. Não tenho certeza se isso afeta a solução proposta acima. Uma possibilidade é que muitos recursos simplesmente tenham uma grande importância e, portanto, variam amplamente entre o conjunto de árvores. Ou talvez não haja amostras suficientes e, portanto, nem todos os recursos são considerados no momento em que você atinge uma folha.Um motivo comum para isso é que os parâmetros que você forneceu (ou padronizou)
RandomForestClassifier
não são adequados para o seu conjunto de dados.Uma maneira comum de resolver esse problema é pesquisar o espaço do hiperparâmetro usando, por exemplo
GridSearchCV
:param_grid
aqui estão as permutações dos parâmetros que você deseja pesquisar e essamake_scorer(accuracy_score)
é a medida que você deseja otimizar.Observe que
accuracy_score
é adequado para conjuntos balanceados, mas não para conjuntos não balanceados. Escolha uma métrica adequada para seu objetivo específico.fonte
Pode haver vários motivos. O número de árvores e a profundidade podem alterar seus resultados. Se o seu modelo não tiver um bom desempenho após a seleção dos parâmetros (validação cruzada etc.), provavelmente é porque seus recursos não são muito preditivos, por isso são escolhidos quase que aleatoriamente, o que leva a altos desvios padrão de árvore para árvore. Mas existem outras possibilidades, por exemplo, também pode ser que seus recursos sejam altamente correlacionados. Um pouco mais de informação seria útil.
fonte