sklearn columntransformer включает существующие функции (например, логическое значение), которые не нуждаются в преобразовании / предварительной обработке в конвейере

#python #scikit-learn

#python #scikit-learn

Вопрос:

у меня уже есть некоторые логические функции (1 или 0), но у меня есть некоторые категориальные переменные, которым требуется OHE, и некоторые числовые переменные, которые нуждаются в вменении / масштабировании… я могу добавить категориальные переменные числовые переменные в преобразователь столбца конвейера, но как мне добавить логические функции в конвейер, чтобы они были включены в модель? не могу найти никаких примеров или хорошей фразы для поиска такого рода дилеммы… есть идеи?

вот пример из sklearn, объединяющий конвейер num и cat, однако, что, если некоторые из моих функций уже находятся в логической форме (1/0) и не нуждаются в предварительной обработке / OHE … как мне сохранить эти функции (т. Е. Добавить их в конвейер с переменными num и cat)?

источник: https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html

 titanic_url = ('https://raw.githubusercontent.com/amueller/scipy-2017-sklearn/091d371/notebooks/datasets/titanic3.csv')

data = pd.read_csv(titanic_url)

numeric_features = ['age', 'fare']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())])

categorical_features = ['embarked', 'sex', 'pclass']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])

clf = Pipeline(steps=[('preprocessor', preprocessor),
                      ('classifier', LogisticRegression(solver='lbfgs'))])

X = data.drop('survived', axis=1)
y = data['survived']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

clf.fit(X_train, y_train)
print("model score: %.3f" % clf.score(X_test, y_test))
  

Ответ №1:

Я выяснил свой собственный вопрос здесь … с помощью ColumnTransformer я могу просто добавить дополнительные функции в список (т. Е. numeric_features и categorical_features, как в коде из моего вопроса), а с помощью FeatureUnion я могу использовать этот класс DF Selector для добавления функций в конвейер… подробности можно найти в этой записной книжке => https://github.com/ageron/handson-ml/blob/master/02_end_to_end_machine_learning_project.ipynb

 # Create a class to select numerical or categorical columns 
class PandasDataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names].values

# ex
feature_list = [...]
("num_features", Pipeline([
                    ("select_num_features", PandasDataFrameSelector(feature_list)),
                    ("scales", StandardScaler())
  

Ответ №2:

Используйте remainder='passthrough для прохождения по любым столбцам, не рассмотренным в вашем column_transformers списке. Тем не менее, ответ @thePurplePython может быть весьма полезным.

 preprocessor_pipeline = sklearn.compose.ColumnTransformer(column_transformers, remainder='passthrough')
  

В качестве альтернативы, передайте конвейерную тройку ‘passthrough’ вместо функции transformer и список столбцов для прохождения.

 ('passthrough','passthrough',passthrough_columns)