Среда:
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.ensemble import RandomForestClassifier
Пример данных:
X_train = pd.DataFrame({'A': ['a1', 'a3', 'a2'],
'B': ['b2', 'b1', 'b3'],
'C': [1, 2, 3]})
y_train = pd.DataFrame({'Y': [1,0,1]})
Желаемый результат: Я бы хотел чтобы включить sklearn OneHotEncoder в мой конвейер в следующем формате:
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)
Challenge : OneHotEncoder кодирует все, включая числовые столбцы. Я хочу сохранить числовые столбцы как есть и эффективно кодировать только категориальные функции, совместимые с 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
Обойти (не идеально) : я могу получить вокруг проблемы, используя pd.get_dummies()
. Однако это означает, что я не могу включить его в свой конвейер. Или есть способ?
X_train = pd.get_dummies(X_train, drop_first=True)