Importância do recurso com a floresta aleatória scikit-learn mostra desvio padrão muito alto

13

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).

importância do recurso

É 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()
gc5
fonte
IIUC, predictorsretorna um numpy arrayque você está fazendo referência a um pandas Dataframeobjeto por ele é colunas que é incorreto como numpy arraysnão tem o atributo columns.
Nickil Maveli
Desculpe, foi um erro de digitação no código. preditores e resultado são dois pandas DataFramecom forma m x ne m x 1. Deve ficar claro agora.
Gc5
2
Eu encontrei as mesmas descobertas há algum tempo. Pode ser que isso se deva ao fato de vários recursos serem importantes, mas como os recursos podem ser altos ou baixos na árvore de decisão (como apenas um subconjunto aleatório é oferecido ao fazer uma divisão), sua importância varia muito de uma árvore para outra. árvore, o que resulta em um desvio padrão alto.
Archie
Ótimo post, encontrei um problema idêntico, como você pode ver na foto. Existe um pacote tsfreshque 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 menos
super

Respostas:

3

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

clf = RandomForestClassifier(n_estimators=1000)

Para uma análise mais refinada, você também pode verificar o tamanho da correlação entre seus recursos.

lanenok
fonte
Desculpe lanenok, o número de árvores não é o padrão. Eu coloquei um código de exemplo (e isso é verdade para todos os parâmetros, por exemplo 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?
Gc5
2

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 " .

Archie
fonte
Usar o desvio padrão neste exemplo para eliminar recursos eliminaria todos os recursos. xD
Jorge Leitao 07/02
Haha, não tenho certeza, acho que você pode descartar com segurança os recursos da extrema direita? De qualquer forma, o ponto principal que estou tentando destacar é que os desvios de alto padrão não são tão estranhos e que você pode realmente usá-los em sua estratégia para eliminar recursos.
Archie
1

Tente clf = RandomForestClassifier(max_features=None). O max_featurespadrão do parâmetro 'auto'é equivalente a sqrt(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.

jamis
fonte
1
Observe que isso é equivalente a árvores ensacadas simples. O "aleatório" em florestas aleatórias significa considerar um subconjunto aleatório de recursos em cada divisão, geralmente sqrt(n_features)ou log2(n_features). max_features=Nonenã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.
Jamis
1

Um motivo comum para isso é que os parâmetros que você forneceu (ou padronizou) RandomForestClassifiernã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:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_gridaqui estão as permutações dos parâmetros que você deseja pesquisar e essa make_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.

Jorge Leitao
fonte
0

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.

oW_
fonte