Scikit-learn: ¿Cómo saber qué característica está seleccionada por FeatureUnion?

Creado en 6 ene. 2016  ·  4Comentarios  ·  Fuente: scikit-learn/scikit-learn

ejecuto el código de,
http://scikit-learn.org/stable/auto_examples/feature_stacker.html#example-feature-stacker-py
y con el siguiente 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)

con los datos puestos en FeatureUnion, quiero saber qué función está seleccionada. en el documento de FeatureUnion, hay una función get_feature_names() que obtiene todos los nombres de todos los transformadores. así que simplemente llame a esta función y obtenga un error como este,

AttributeError: Transformer pca does not provide get_feature_names.

en realidad, sé que pca no tiene una función como esta. pero ¿por qué FeatureUnion proporciona esta función?

Comentario más útil

Es posible que esto no resuelva su problema particular con PCA directamente, pero si leo su pregunta correctamente, en general se pregunta cómo filtrar atributos a través de la canalización personalizada.

Llegó tarde a la fiesta, pero puede acceder a los elementos dentro de la canalización, independientemente de cuán complicados sean, recorriendo la estructura de la canalización, encontrando el paso apropiado (incluso dentro de la unión de funciones) y luego usando el atributo apropiado. Aquí hay un ejemplo que acabo de ejecutar:

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 el objeto de canalización en sí mismo a través de print(pipeline) me da un punto de referencia:

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'))])

Así que camino hasta el paso de unión a través de:

pipeline.named_steps['union']

Luego camine al siguiente nivel que es transformer_list (o la canalización categórica) a través de:

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

Luego camine al siguiente nivel, que son los pasos dentro de la canalización categórica a través de:

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

Lo anterior genera una estructura de tubería típica, donde ahora podemos utilizar named_steps:
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect']

Y por lo tanto acceder al atributo que necesitamos a través de:
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect'].get_feature_names()

TLDR;
Recorra la estructura de la canalización pieza por pieza con su canalización personalizada y luego acceda al atributo como lo haría normalmente para esa pieza de transformación/estimador.

Todos 4 comentarios

Estoy de acuerdo en que debería haber una manera de ver qué funciones pertenecen a qué
componentes, y lo he propuesto hace mucho tiempo, pero no creo que sea
actualmente posible.

El 6 de enero de 2016 a las 18:23, genliu777 [email protected] escribió:

ejecuto el código de,

http://scikit-learnorg/stable/auto_examples/feature_stackerhtml#example -feature-stacker-py
y con el siguiente código,

Estimador de compilación a partir de PCA y selección univariada:

características_combinadas = FeatureUnion([("pca", pca), ("univ_select", selección)])

Use características combinadas para transformar el conjunto de datos:

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

con los datos puestos en FeatureUnion, quiero saber qué función está seleccionada
en el documento de FeatureUnion, hay una función get_feature_names() que
obtiene todos los nombres de todos los transformadores, así que simplemente llame a esta función
y obtener un error como este,
AttributeError: Transformer pca no proporciona get_feature_names
en realidad, sé que pca no tiene una función como esta, pero ¿por qué FeatureUnion?
proporcionar esta función!?


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/scikit-learn/scikit-learn/issues/6122.

¿¡Por qué actualmente es imposible!? ya sabes, FeatureUnion le da a la función get_feature_names() , ¡y también debería funcionar!

como, tal vez todos ellos, modelos en sklearn, tienen la función fit y transform , debería hacer que todos los modelos que se pueden poner en FeatureUnion funcionen bien, proporcione el atributo como fuente el código de get_feature_names() llama a if not hasattr(trans, 'get_feature_names'): . de lo contrario, FeatureUnion no proporciona necesariamente la función de get_feature_names() !!

Es posible que esto no resuelva su problema particular con PCA directamente, pero si leo su pregunta correctamente, en general se pregunta cómo filtrar atributos a través de la canalización personalizada.

Llegó tarde a la fiesta, pero puede acceder a los elementos dentro de la canalización, independientemente de cuán complicados sean, recorriendo la estructura de la canalización, encontrando el paso apropiado (incluso dentro de la unión de funciones) y luego usando el atributo apropiado. Aquí hay un ejemplo que acabo de ejecutar:

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 el objeto de canalización en sí mismo a través de print(pipeline) me da un punto de referencia:

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'))])

Así que camino hasta el paso de unión a través de:

pipeline.named_steps['union']

Luego camine al siguiente nivel que es transformer_list (o la canalización categórica) a través de:

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

Luego camine al siguiente nivel, que son los pasos dentro de la canalización categórica a través de:

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

Lo anterior genera una estructura de tubería típica, donde ahora podemos utilizar named_steps:
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect']

Y por lo tanto acceder al atributo que necesitamos a través de:
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect'].get_feature_names()

TLDR;
Recorra la estructura de la canalización pieza por pieza con su canalización personalizada y luego acceda al atributo como lo haría normalmente para esa pieza de transformación/estimador.

Pruebe eli5 's transform_feature_names que pueden funcionar en los casos en que scikit-learn's get_feature_names no lo hace.

¿Fue útil esta página
0 / 5 - 0 calificaciones