¿Cómo dejar columnas numéricas al utilizar OneHotEncoder sklearn?

Zolzaya Luvsandorj:

Ambiente:

import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.ensemble import RandomForestClassifier

Data de muestra:

X_train = pd.DataFrame({'A': ['a1', 'a3', 'a2'], 
                        'B': ['b2', 'b1', 'b3'],
                        'C': [1, 2, 3]})
y_train = pd.DataFrame({'Y': [1,0,1]})

Resultado deseado: Me gustaría incluir OneHotEncoder sklearn en mi oleoducto en este formato:

encoder = ### SOME CODE ###
scaler = StandardScaler()
model = RandomForestClassifier(random_state=0)

# This is my ideal pipeline
pipe = Pipeline([('OneHotEncoder', encoder),
                 ('Scaler', scaler),
                 ('Classifier', model)])
pipe.fit(X_train, y_train)

Desafío : OneHotEncoder está codificando todo, incluyendo las columnas numéricas. Quiero mantener columnas numéricas tal como es y codificar sólo las características categóricas de una manera eficiente que sea compatible con Pipeline ().

encoder = OneHotEncoder(drop='first', sparse=False) 
encoder.fit(X_train)
encoder.transform(X_train) # Columns C is encoded - this is what I want to avoid

En torno al trabajo (no ideal) : Me puede evitar el problema utilizando pd.get_dummies(). Sin embargo, esto significa que no puedo incluirlo en mi tubería. O ¿hay alguna manera?

X_train = pd.get_dummies(X_train, drop_first=True)
MaximeKan:

Mi solución preferida para este sería el uso de sklearn ColumnTransformer(ver aquí ).

Le permite dividir los datos en tantos grupos como desee (en su caso, categórica vs datos numéricos) y aplicar diferentes operaciones de procesamiento previo a estos grupos. Este transformador puede ser utilizado en una tubería como cualquier otra herramienta sklearn procesamiento previo. Aquí está un pequeño ejemplo:

import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier

X = pd.DataFrame({"a":[1,2,3],"b":["A","A","B"]})
y = np.array([0,1,1])

OHE = OneHotEncoder()
scaler = StandardScaler()
RFC = RandomForestClassifier()

cat_cols = ["b"]
num_cols = ["a"]

transformer = ColumnTransformer([('cat_cols', OHE, cat_cols),
                                ('num_cols', scaler, num_cols)])

pipe = Pipeline([("preprocessing", transformer),
                ("classifier", RFC)])
pipe.fit(X,y)

Nota: he tomado algunas libertades con su petición, porque esto sólo se aplica el escalador a los datos numéricos, que creo que tiene más sentido? Si desea aplicar el escalador a todas las columnas, puede hacerlo así mediante la modificación de este ejemplo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=351593&siteId=1
Recomendado
Clasificación