Scikit-learn: comment savoir quelle fonctionnalité est sélectionnée par FeatureUnion ?

Créé le 6 janv. 2016  ·  4Commentaires  ·  Source: scikit-learn/scikit-learn

je lance le code de,
http://scikit-learn.org/stable/auto_examples/feature_stacker.html#example-feature-stacker-py
et avec le code suivant,

# 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)

avec les données mises dans FeatureUnion, je veux savoir quelle fonctionnalité est sélectionnée. dans la doc de FeatureUnion, il y a une fonction get_feature_names() qui récupère tous les noms de tous les transformateurs. alors appelez simplement cette fonction et obtenez une erreur comme celle-ci,

AttributeError: Transformer pca does not provide get_feature_names.

en fait, je sais que pca n'a pas de fonction comme celle-ci. mais pourquoi FeatureUnion fournit cette fonction ! ?

Commentaire le plus utile

Cela peut ne pas résoudre directement votre problème particulier avec PCA, mais si j'ai bien lu votre question, vous vous demandez en général comment percoler les attributs via le pipeline personnalisé.

En retard à la fête, mais vous pouvez accéder aux éléments du pipeline, quelle que soit leur complexité, en parcourant la structure du pipeline, en trouvant l'étape appropriée (même dans featureunion), puis en utilisant l'attribut approprié. Voici un exemple que je viens d'exécuter :

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

Afficher l'objet pipeline lui-même via print(pipeline) me donne un point de référence :

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

Je passe donc à l'étape de l'union via:

pipeline.named_steps['union']

Passez ensuite au niveau suivant qui est transformer_list (ou le pipeline catégoriel) via :

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

Passez ensuite au niveau suivant qui correspond aux étapes du pipeline catégoriel via :

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

Ce qui précède génère une structure de pipeline typique, où nous pouvons maintenant utiliser named_steps :
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect']

Et donc accéder à l'attribut dont nous avons besoin via :
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect'].get_feature_names()

TLDR ;
Parcourez la structure du pipeline pièce par pièce avec votre pipeline personnalisé, puis accédez à l'attribut comme vous le feriez normalement pour cette pièce de transformation/estimateur.

Tous les 4 commentaires

Je suis d'accord qu'il devrait y avoir un moyen de voir quelles fonctionnalités appartiennent à quelles
composants, et j'ai proposé cela il y a longtemps, mais je ne pense pas que ce soit
actuellement possible.

Le 6 janvier 2016 à 18h23, genliu777 [email protected] a écrit :

je lance le code de,

http://scikit-learnorg/stable/auto_examples/feature_stackerhtml#example -feature-stacker-py
et avec le code suivant,

Construire un estimateur à partir de l'ACP et de la sélection univariée :

Combined_features = FeatureUnion([("pca", pca), ("univ_select", sélection)])

Utilisez des fonctionnalités combinées pour transformer l'ensemble de données :

X_caractéristiques = combinaisons_caractéristiquesfit(X, y)transformer(X)

avec les données mises dans FeatureUnion, je veux savoir quelle fonctionnalité est sélectionnée
dans la doc de FeatureUnion, il y a une fonction get_feature_names() qui
obtient tous les noms de tous les transformateurs, il suffit donc d'appeler cette fonction
et obtenir une erreur comme celle-ci,
AttributeError : Transformer pca ne fournit pas get_feature_names
en fait, je sais que pca n'a pas de fonction comme celle-ci, mais pourquoi FeatureUnion
fournir cette fonction ! ?


Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/scikit-learn/scikit-learn/issues/6122.

pourquoi actuellement impossible!? vous savez, FeatureUnion donne la fonction get_feature_names() , et cela devrait également fonctionner !

comme, peut-être tous, les modèles dans sklearn, ont la fonction fit et transform , cela devrait faire en sorte que tous les modèles puissent être mis dans FeatureUnion et fonctionnent bien, fournissez l'attribut comme source code de get_feature_names() appelle if not hasattr(trans, 'get_feature_names'): . sinon, FeatureUnion ne fournit pas nécessairement la fonction de get_feature_names() !!

Cela peut ne pas résoudre directement votre problème particulier avec PCA, mais si j'ai bien lu votre question, vous vous demandez en général comment percoler les attributs via le pipeline personnalisé.

En retard à la fête, mais vous pouvez accéder aux éléments du pipeline, quelle que soit leur complexité, en parcourant la structure du pipeline, en trouvant l'étape appropriée (même dans featureunion), puis en utilisant l'attribut approprié. Voici un exemple que je viens d'exécuter :

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

Afficher l'objet pipeline lui-même via print(pipeline) me donne un point de référence :

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

Je passe donc à l'étape de l'union via:

pipeline.named_steps['union']

Passez ensuite au niveau suivant qui est transformer_list (ou le pipeline catégoriel) via :

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

Passez ensuite au niveau suivant qui correspond aux étapes du pipeline catégoriel via :

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

Ce qui précède génère une structure de pipeline typique, où nous pouvons maintenant utiliser named_steps :
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect']

Et donc accéder à l'attribut dont nous avons besoin via :
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect'].get_feature_names()

TLDR ;
Parcourez la structure du pipeline pièce par pièce avec votre pipeline personnalisé, puis accédez à l'attribut comme vous le feriez normalement pour cette pièce de transformation/estimateur.

Veuillez essayer eli5 transform_feature_names qui peut fonctionner dans les cas où get_feature_names scikit-learn ne fonctionne pas.

Cette page vous a été utile?
0 / 5 - 0 notes