Erste feature-Namen in einem FeatureUnion + Pipeline

Ich bin mit einem FeatureUnion beitreten features aus dem Titel und der Beschreibung der Ereignisse:

union = FeatureUnion(
    transformer_list=[
    # Pipeline for pulling features from the event's title
        ('title', Pipeline([
            ('selector', TextSelector(key='title')),
            ('count', CountVectorizer(stop_words='english')),
        ])),

        # Pipeline for standard bag-of-words model for description
        ('description', Pipeline([
            ('selector', TextSelector(key='description_snippet')),
            ('count', TfidfVectorizer(stop_words='english')),
        ])),
    ],

    transformer_weights ={
            'title': 1.0,
            'description': 0.2
    },
)

Jedoch Berufung union.get_feature_names() gibt mir eine Fehlermeldung: „Transformer-Titel (Typ Pipeline) nicht get_feature_names.“ Ich würde gerne sehen, einige der features, die generiert werden, durch meine verschiedenen Vectorizers. Wie mache ich das?

  • Sind Sie immer Fehler beim Aufruf union.get_feature_names()?
  • Dies ist der Fehler: „Transformer-Titel (Typ Pipeline) nicht get_feature_names.“
  • Vielleicht möchten Sie sich auf diese Antwort von einer anderen, ähnlichen Frage: stackoverflow.com/questions/28822756/…
InformationsquelleAutor Huey | 2017-02-27



2 Replies
  1. 8

    Sein, weil Sie einen benutzerdefinierten Transformer genannt TextSelector. Implementieren Sie get_feature_names im TextSelector?

    Sind Sie gehen zu müssen, implementieren Sie diese Methode in Ihre benutzerdefinierte Transformation, wenn Sie funktionieren soll.

    Hier ist ein konkretes Beispiel für Sie:

    from sklearn.datasets import load_boston
    from sklearn.pipeline import FeatureUnion, Pipeline
    from sklearn.base import TransformerMixin
    import pandas as pd
    
    dat = load_boston()
    X = pd.DataFrame(dat['data'], columns=dat['feature_names'])
    y = dat['target']
    
    # define first custom transformer
    class first_transform(TransformerMixin):
        def transform(self, df):
            return df
    
        def get_feature_names(self):
            return df.columns.tolist()
    
    
    class second_transform(TransformerMixin):
        def transform(self, df):
            return df
    
        def get_feature_names(self):
            return df.columns.tolist()
    
    
    
    pipe = Pipeline([
           ('features', FeatureUnion([
                        ('custom_transform_first', first_transform()),
                        ('custom_transform_second', second_transform())
                    ])
            )])
    
    >>> pipe.named_steps['features']_.get_feature_names()
    ['custom_transform_first__CRIM',
     'custom_transform_first__ZN',
     'custom_transform_first__INDUS',
     'custom_transform_first__CHAS',
     'custom_transform_first__NOX',
     'custom_transform_first__RM',
     'custom_transform_first__AGE',
     'custom_transform_first__DIS',
     'custom_transform_first__RAD',
     'custom_transform_first__TAX',
     'custom_transform_first__PTRATIO',
     'custom_transform_first__B',
     'custom_transform_first__LSTAT',
     'custom_transform_second__CRIM',
     'custom_transform_second__ZN',
     'custom_transform_second__INDUS',
     'custom_transform_second__CHAS',
     'custom_transform_second__NOX',
     'custom_transform_second__RM',
     'custom_transform_second__AGE',
     'custom_transform_second__DIS',
     'custom_transform_second__RAD',
     'custom_transform_second__TAX',
     'custom_transform_second__PTRATIO',
     'custom_transform_second__B',
     'custom_transform_second__LSTAT']

    Beachten Sie, dass Feature Union wird zum verketten von zwei Listen, emittiert von der jeweiligen get_feature_names von jedem der Transformatoren. dies ist, warum Sie bekommen eine Fehlermeldung, wenn eine oder mehrere der Transformatoren nicht mit dieser Methode.

    Jedoch, ich kann sehen, dass dies allein wird nicht dein problem lösen, als Pipeline-Objekte keine get_feature_names Methode in Ihnen, und Sie haben geschachtelten Rohrleitungen (pipelines innerhalb der Funktion der Gewerkschaften.). So haben Sie zwei Möglichkeiten:

    1. Unterklasse Rohrleitung und fügen Sie es get_feature_names Methode selbst, die bekommt die Funktion Namen aus dem letzten Trafo in der Kette.

    2. Extrahieren Sie den feature-Namen, die sich von jeder der Transformatoren, die verlangen, dass Sie greifen diese Transformatoren aus der pipeline selbst und rufen Sie get_feature_names auf Sie.

    Beachten Sie auch, dass viele sklearn eingebauten Transformatoren betreiben, auf DataFrame aber pass numpy-arrays um, also, just watch out für Sie, wenn Sie gehen, um die lose Verkettung von Transformatoren zusammen. Aber ich denke, dies gibt Ihnen genügend Informationen, um Ihnen eine Vorstellung von dem, was passiert ist.

    Eins noch, haben Sie einen Blick auf sklearn-pandas. Ich habe nicht verwendet es selbst, aber es könnte eine Lösung für Sie.

  2. 2

    Rufen Sie Ihre verschiedenen Vectorizers als eine verschachtelte Funktion, die durch diese (Dank edesz):

    pipevect= dict(pipeline.named_steps['union'].transformer_list).get('title').named_steps['count']

    Und dann hast du den TfidfVectorizer () – Instanz übergeben in eine andere Funktion:

    Show_most_informative_features(pipevect,
           pipeline.named_steps['classifier'], n=MostIF)
    # or direct   
    print(pipevect.get_feature_names())

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.