Sklearn Pipeline: cómo aplicar diferentes transformaciones en diferentes columnas.

Soy bastante nuevo en las tuberías en sklearn y me estoy topando con este problema: tengo un conjunto de datos que tiene una mezcla de texto y números, es decir, ciertas columnas solo tienen texto y el rest tienen números enteros (o números de punto flotante).

Me preguntaba si era posible construir una tubería donde pueda, por ejemplo, llamar a LabelEncoder() en las funciones de texto y MinMaxScaler() en las columnas de números. Los ejemplos que he visto en la web apuntan principalmente hacia el uso de LabelEncoder() en todo el conjunto de datos y no en columnas seleccionadas. es posible? Si es así, cualquier puntero sería muy apreciado.

La forma en que normalmente lo hago es con FeatureUnion , utilizando un FunctionTransformer para extraer las columnas relevantes.

Notas importantes:

  • Tienes que definir tus funciones con def ya que molesta, no puedes usar lambda o partial en FunctionTransformer si quieres decapar tu modelo

  • Necesita inicializar FunctionTransformer con validate=False

Algo como esto:

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

Desde v0.20, puede utilizar ColumnTransformer para lograr esto.