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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.