Scikit-learn: como saber qual recurso é selecionado pelo FeatureUnion?

Criado em 6 jan. 2016  ·  4Comentários  ·  Fonte: scikit-learn/scikit-learn

eu corro o código de,
http://scikit-learn.org/stable/auto_examples/feature_stacker.html#example -feature-stacker-py
e com o seguinte código,

# Build estimator from PCA and Univariate selection:
combined_features = FeatureUnion([("pca", pca), ("univ_select", selection)])

# Use combined features to transform dataset:
X_features = combined_features.fit(X, y).transform(X)

com dados colocados em FeatureUnion, eu quero saber qual recurso está selecionado. no documento do FeatureUnion, existe uma função get_feature_names() que obtém todos os nomes de todos os transformadores. então basta chamar esta função e obter um erro como este,

AttributeError: Transformer pca does not provide get_feature_names.

na verdade, eu sei que o pca não tem função assim. mas por que FeatureUnion fornece essa função!?

Comentários muito úteis

Isso pode não resolver seu problema específico com o PCA diretamente, mas se eu ler sua pergunta corretamente, você está se perguntando em geral como filtrar atributos por meio do pipeline personalizado.

Tarde para a festa, mas você pode acessar elementos dentro do pipeline, independentemente de quão complicado, percorrendo a estrutura do pipeline, encontrando a etapa apropriada (mesmo dentro do featureunion) e, em seguida, usando o atributo apropriado. Aqui está um exemplo que acabei de executar:

pipeline = Pipeline([ ('union', FeatureUnion([ ('categoric', Pipeline([ ('f_cat', feature_type_split(type = 'categoric')), #returns categoric in array for vect ('vect', vect), ])), ('numeric', Pipeline([ ('f_num', feature_type_split(type = 'numeric')), ])), ])), ('select', ff), ('tree_clf', clf), ])

Mostrar o próprio objeto pipeline via print(pipeline) me dá um ponto de referência:

Pipeline(steps=[('union', FeatureUnion(n_jobs=1, transformer_list=[('categoric', Pipeline(steps=[('f_cat', feature_type_split(type='categoric')), ('vect', DictVectorizer(dtype=<type 'numpy.float64'>, separator='=', sort=True, sparse=True))])), ('numeric', Pipeline(steps=[('f_num', feature_type...it=2, min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter='best'))])

Então eu ando até a etapa de união via:

pipeline.named_steps['union']

Em seguida, caminhe para o próximo nível que é transformer_list (ou o pipeline categórico) por meio de:

pipeline.named_steps['union'].transformer_list[0]

Em seguida, caminhe para o próximo nível, que são as etapas do pipeline categórico por meio de:

pipeline.named_steps['union'].transformer_list[0][1]

O resultado acima gera uma estrutura de pipeline típica, onde agora podemos utilizar named_steps:
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect']

E, portanto, acesse o atributo que precisamos via:
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect'].get_feature_names()

TLDR;
Percorra a estrutura do pipeline peça por peça com seu pipeline personalizado e, em seguida, acesse o atributo como faria normalmente para essa peça de transformação/estimador.

Todos 4 comentários

Concordo que deve haver uma maneira de ver quais recursos pertencem a quais
componentes, e eu propus isso há muito tempo, mas não acho que seja
atualmente possível.

Em 6 de janeiro de 2016 às 18:23, genliu777 [email protected] escreveu:

eu corro o código de,

http://scikit-learnorg/stable/auto_examples/feature_stackerhtml#example -feature-stacker-py
e com o seguinte código,

Construir estimador de PCA e seleção Univariada:

combinado_features = FeatureUnion([("pca", pca), ("univ_select", selection)])

Use recursos combinados para transformar o conjunto de dados:

X_features = combinado_featuresfit(X, y)transform(X)

com dados colocados em FeatureUnion, eu quero saber qual recurso está selecionado
no documento do FeatureUnion, há uma função get_feature_names() que
obtém todos os nomes de todos os transformadores, então apenas chame esta função
e obter erro como este,
AttributeError: Transformer pca não fornece get_feature_names
na verdade, eu sei que o pca não tem função assim, mas por que FeatureUnion
fornecer esta função!?


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/6122.

por que atualmente impossível!? você sabe, FeatureUnion fornece a função get_feature_names() , e também deve funcionar!

tipo, talvez todos eles, models em sklearn, tenham a função fit e transform , ele deve fazer todos os modelos que podem ser colocados no FeatureUnion e funcionar bem , fornecer o atributo como fonte código de get_feature_names() chama if not hasattr(trans, 'get_feature_names'): . caso contrário, FeatureUnion não fornece necessariamente a função get_feature_names() !!

Isso pode não resolver seu problema específico com o PCA diretamente, mas se eu ler sua pergunta corretamente, você está se perguntando em geral como filtrar atributos por meio do pipeline personalizado.

Tarde para a festa, mas você pode acessar elementos dentro do pipeline, independentemente de quão complicado, percorrendo a estrutura do pipeline, encontrando a etapa apropriada (mesmo dentro do featureunion) e, em seguida, usando o atributo apropriado. Aqui está um exemplo que acabei de executar:

pipeline = Pipeline([ ('union', FeatureUnion([ ('categoric', Pipeline([ ('f_cat', feature_type_split(type = 'categoric')), #returns categoric in array for vect ('vect', vect), ])), ('numeric', Pipeline([ ('f_num', feature_type_split(type = 'numeric')), ])), ])), ('select', ff), ('tree_clf', clf), ])

Mostrar o próprio objeto pipeline via print(pipeline) me dá um ponto de referência:

Pipeline(steps=[('union', FeatureUnion(n_jobs=1, transformer_list=[('categoric', Pipeline(steps=[('f_cat', feature_type_split(type='categoric')), ('vect', DictVectorizer(dtype=<type 'numpy.float64'>, separator='=', sort=True, sparse=True))])), ('numeric', Pipeline(steps=[('f_num', feature_type...it=2, min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter='best'))])

Então eu ando até a etapa de união via:

pipeline.named_steps['union']

Em seguida, caminhe para o próximo nível que é transformer_list (ou o pipeline categórico) por meio de:

pipeline.named_steps['union'].transformer_list[0]

Em seguida, caminhe para o próximo nível, que são as etapas do pipeline categórico por meio de:

pipeline.named_steps['union'].transformer_list[0][1]

O resultado acima gera uma estrutura de pipeline típica, onde agora podemos utilizar named_steps:
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect']

E, portanto, acesse o atributo que precisamos via:
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect'].get_feature_names()

TLDR;
Percorra a estrutura do pipeline peça por peça com seu pipeline personalizado e, em seguida, acesse o atributo como faria normalmente para essa peça de transformação/estimador.

Por favor, tente eli5 's transform_feature_names que pode funcionar nos casos em que get_feature_names do scikit-learn não.

Esta página foi útil?
0 / 5 - 0 avaliações