Seleção de recursos usando importâncias de recursos em florestas aleatórias com o scikit-learn

12

Eu plotei as importâncias do recurso em florestas aleatórias com o scikit-learn . Para melhorar a previsão usando florestas aleatórias, como posso usar as informações da plotagem para remover recursos? Ou seja, como descobrir se um recurso é inútil ou pior ainda, o desempenho das florestas aleatórias, com base nas informações da parcela? O gráfico é baseado no atributo feature_importances_e eu uso o classificador sklearn.ensemble.RandomForestClassifier.

Estou ciente de que existem outras técnicas para a seleção de recursos , mas nesta questão quero focar em como usar o recurso feature_importances_.


Exemplos de tais gráficos de importância de recursos:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Franck Dernoncourt
fonte

Respostas:

14

Você pode simplesmente usar o feature_importances_atributo para selecionar os recursos com a pontuação de maior importância. Por exemplo, você pode usar a seguinte função para selecionar os K melhores recursos de acordo com a importância.

def selectKImportance(model, X, k=5):
     return X[:,model.feature_importances_.argsort()[::-1][:k]]

Ou se você estiver usando um pipeline, a seguinte classe

class ImportanceSelect(BaseEstimator, TransformerMixin):
    def __init__(self, model, n=1):
         self.model = model
         self.n = n
    def fit(self, *args, **kwargs):
         self.model.fit(*args, **kwargs)
         return self
    def transform(self, X):
         return X[:,self.model.feature_importances_.argsort()[::-1][:self.n]]

Então, por exemplo:

>>> from sklearn.datasets import load_iris
>>> from sklearn.ensemble import RandomForestClassifier
>>> iris = load_iris()
>>> X = iris.data
>>> y = iris.target
>>> 
>>> model = RandomForestClassifier()
>>> model.fit(X,y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)
>>> 
>>> newX = selectKImportance(model,X,2)
>>> newX.shape
(150, 2)
>>> X.shape
(150, 4)

E claramente, se você quiser selecionar com base em outros critérios que não sejam os "principais recursos da k", basta ajustar as funções de acordo.

David
fonte
Obrigado David. Alguma idéia de como escolher o limite acima de quais recursos são úteis? (deixar de lado de remover o recurso menos útil, executando a RF novamente e ver como ele afeta o desempenho de previsão)
Franck Dernoncourt
1
Como na maioria das seleções automatizadas de recursos, eu diria que a maioria das pessoas usa uma grade de ajuste. Mas usar o conhecimento do domínio ao selecionar (e projetar) recursos é provavelmente o mais valioso - mas não é realmente automatizável.
David