2017-04-19 2 views
6

Ich versuche, ein Tutorial über Pipeline für Studenten zu tun, aber ich blockiere. Ich bin kein Experte, aber ich versuche mich zu verbessern. Also vielen Dank für Ihren Genuss. Tatsächlich versuchen I in einer Pipeline mehrere Schritte auszuführen in einen Datenrahmen für einen Klassifikator vorbereiten:Mehrere benutzerdefinierte Klassen mit Pipeline sklearn (Python) verwenden

  • Schritt 1: Beschreibung der Datenrahmen
  • Schritt 2: Füllen NaN3
  • Schrittwerte: Transforming kategorische Werte in Zahlen

Hier ist mein Code:

class Descr_df(object): 

    def transform (self, X): 
     print ("Structure of the data: \n {}".format(X.head(5))) 
     print ("Features names: \n {}".format(X.columns)) 
     print ("Target: \n {}".format(X.columns[0])) 
     print ("Shape of the data: \n {}".format(X.shape)) 

    def fit(self, X, y=None): 
     return self 

class Fillna(object): 

    def transform(self, X): 
     non_numerics_columns = X.columns.difference(X._get_numeric_data().columns) 
     for column in X.columns: 
      if column in non_numerics_columns: 
       X[column] = X[column].fillna(df[column].value_counts().idxmax()) 
      else: 
       X[column] = X[column].fillna(X[column].mean())    
     return X 

    def fit(self, X,y=None): 
     return self 

class Categorical_to_numerical(object): 

    def transform(self, X): 
     non_numerics_columns = X.columns.difference(X._get_numeric_data().columns) 
     le = LabelEncoder() 
     for column in non_numerics_columns: 
      X[column] = X[column].fillna(X[column].value_counts().idxmax()) 
      le.fit(X[column]) 
      X[column] = le.transform(X[column]).astype(int) 
     return X 

    def fit(self, X, y=None): 
     return self 

Wenn ich Schritt 1 und 2 oder Schritt 1 und 3 ausführe, funktioniert es, aber wenn ich Schritt 1, 2 und 3 gleichzeitig ausführe. Ich habe diesen Fehler:

pipeline = Pipeline([('df_intropesction', Descr_df()), ('fillna',Fillna()), ('Categorical_to_numerical', Categorical_to_numerical())]) 
pipeline.fit(X, y) 
AttributeError: 'NoneType' object has no attribute 'columns' 
+0

Wahrscheinlich Keine einige von ihnen: 'X' oder 'Y'. Voller Stapel bitte. – sergzach

Antwort

3

Dieser Fehler tritt auf, weil in der Pipeline der Ausgang der ersten Schätzfunktion zum zweiten geht, dann ist der Ausgang des zweiten Schätzer geht an dritten und so weiter ...

Von der documentation of Pipeline:

Fit all the transforms one after the other and transform the data, then fit the transformed data using the final estimator.

Also für Ihre Pipeline

werden die Schritte der Ausführung folgende:

  1. Descr_df.fit (X) -> tut nichts und gibt selbst zurück
  2. newX = Descr_df.transform (X) -> sollte einen Wert zurückgeben, der newX zugewiesen wird, der an den nächsten Schätzer weitergeleitet werden sollte, aber Ihre Definition tut dies nichts zurückgeben (nur Drucke). So wird keine implizit zurück
  3. Fillna.fit (newX) -> nichts tun und gibt Selbst
  4. Fillna.transform (newX) -> Anrufe newX.columns. Aber newX = Keine aus Schritt2. Daher der Fehler.

Lösung: Ändern der Transformationsmethode von Descr_df die Datenrahmen zurückzukehren, wie es ist:

def transform (self, X): 
    print ("Structure of the data: \n {}".format(X.head(5))) 
    print ("Features names: \n {}".format(X.columns)) 
    print ("Target: \n {}".format(X.columns[0])) 
    print ("Shape of the data: \n {}".format(X.shape)) 
    return X 

Vorschlag: Machen Sie Ihre Klassen von Basis Estimator erben und Transformer-Klassen in scikit zu bestätigen die gute Praxis.

d. H. Ändern Sie die class Descr_df(object) zu class Descr_df(BaseEstimator, TransformerMixin), Fillna(object) zu Fillna(BaseEstimator, TransformerMixin) und so weiter.

Sehen Sie dieses Beispiel, um weitere Informationen zu benutzerdefinierten Klassen in Pipeline:

+0

Ich werde einen Blick darauf werfen und Sie wissen lassen. Ihre Antwort scheint sehr interessant und hilfreich. Danke !! –

+0

@ JeremieGuez Versuchen Sie die Lösung und wenn es für Sie funktioniert, bitte in Betracht ziehen, diese Antwort zu akzeptieren –

+0

Scheint in Ordnung zu sein !! Danke –

Verwandte Themen