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!?
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.
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.