2016-08-17 17 views
5

Jestem całkiem nowy dla potoków w sklearn i wpadam na ten problem: mam zbiór danych, który ma mieszankę tekstu i liczb, tj. Niektóre kolumny mają tylko tekst i odpoczynek mają liczby całkowite (lub liczby zmiennoprzecinkowe).sklearn pipeline - jak zastosować różne transformacje na różnych kolumnach

Zastanawiam się, czy możliwe było zbudowanie potoku, w którym mogę na przykład zadzwonić pod numer LabelEncoder() w funkcjach tekstowych i MinMaxScaler() w kolumnach liczb. Przykłady, które widziałem w Internecie, najczęściej wskazują na użycie LabelEncoder() w całym zestawie danych, a nie w kolumnach wyboru. czy to możliwe? Jeśli tak, wszelkie wskazówki byłyby bardzo mile widziane.

Odpowiedz

12

Sposób, w jaki zwykle to robię, to: FeatureUnion, używając FunctionTransformer do wyciągnięcia odpowiednich kolumn.

Ważne uwagi:

  • Trzeba zdefiniować swoje funkcje z def od irytująco nie można używać lambda lub partial w FunctionTransformer jeśli chcesz marynowane model

  • Trzeba zainicjować FunctionTransformer z validate=False

Coś takiego:

from sklearn.pipeline import make_union, make_pipeline 
from sklearn.preprocessing import FunctionTransformer 

def get_text_cols(df): 
    return df[['name', 'fruit']] 

def get_num_cols(df): 
    return df[['height','age']] 

vec = make_union(*[ 
    make_pipeline(FunctionTransformer(get_text_cols, validate=False), LabelEncoder()))), 
    make_pipeline(FunctionTransformer(get_num_cols, validate=False), MinMaxScaler()))) 
]) 
+0

Każdy pomysł, dlaczego otrzymuję "TypeError: Wszystkie estymatory powinny stosować dopasowanie i transformację". jeśli uruchomię twój kod? scikit-learn 0.19.1 –

+1

Nieważne, podpis został zmieniony widocznie - przesłałem zmianę –

Powiązane problemy