2017-12-04 5 views
1

Ich versuche meine Hand auf dem Titanic-Datensatz.Scikit lernen Vorverarbeitung LabelBinalizer mit Lambda-Funktion

Ich möchte die LabelBinarizer auf ein paar Spalten verwenden, und ich möchte eine for-Schleife vermeiden.

Ich versuche, eine lambda Funktion zu verwenden, aber es funktioniert nicht:

from sklearn.preprocessing import LabelBinarizer 

pp = LabelBinarizer() 

X = df['sex', 'embarked', 'alive'] df.apply(lambda X: pp.fit_transform()) 

Und:

df[['sex','embarked','alive']]= df[['sex','embarked','alive']].apply(lambda x: pp.fit_transform(x)) 

Könnte mir jemand in die richtige Richtung zeigen, bitte?

+1

Beachten Sie, dass 'df.apply' für eine Python syntaktischer Zucker ist' for-loop'. Es gibt im Wesentlichen keinen Leistungsunterschied. – unutbu

+0

In Zukunft sollten Sie die Fehlermeldungen anzeigen, wenn etwas "nicht funktioniert"; Andernfalls wird Ihre Frage wahrscheinlich geschlossen. –

Antwort

0

Ich denke, das Problem ist, dass, weil Sie drei Spalten auf der linken Seite passieren, wird sklearn verwirrt.

Alternative

Aber wie @unutbu sagte, gibt es keinen Unterschied in der Leistung zwischen df.apply und for so würde ich nur verwenden:

for col in ['sex','embarked','alive']: 
    df[col] = pp.fit_transform(df[col]) 

Aber wenn Sie wirklich tun ein One Liner, hier ist, wie Sie es tun (Warnung, massiven Overkill):

Fügen Sie den Methoden fit, tranform und fit_transform eine weitere Einrückungsschicht hinzu, da die Formatierung nicht funktioniert (sollte mit der Einrückung der Methode übereinstimmen).

class MultiColumnLabelBinarizer: 
    def __init__(self,columns = None): 
     self.columns = columns # array of column names to encode` 

    def fit(self,X,y=None): 
     return self # not relevant here 

    def transform(self,X): 
     ''' 
     Transforms columns of X specified in self.columns using 
     LabelEncoder(). If no columns specified, transforms all 
     columns in X. 
     ''' 
     output = X.copy() 
     if self.columns is not None: 
      for col in self.columns: 
       output[col] = LabelBinarizer().fit_transform(output[col]) 
     else: 
      for colname,col in output.iteritems(): 
       output[colname] = LabelBinarizer().fit_transform(col) 
     return output 

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

df = MultiColumnLabelBinarizer(columns = ['embarked','alive']).fit_transform(df) 

Quelle: Label encoding across multiple columns in scikit-learn

+0

Vielen Dank für Ihre gründliche Antwort, sehr geschätzt! – choubix