Как построить конвейер, чтобы найти наилучшую предварительную обработку для каждого столбца мелкозернистым способом?

#python #pandas #machine-learning #scikit-learn #data-preprocessing

Вопрос:

В sklearn мы можем использовать преобразователь столбцов в конвейере, чтобы применить выбор предварительной обработки к определенным столбцам, подобным этому:

 import pandas as pd from sklearn.preprocessing import MaxAbsScaler, MinMaxScaler, StandardScaler, ... from sklearn.compose import ColumnTransformer, make_column_transformer from sklearn.pipeline import Pipeline from sklearn.neural_network import MLPClassifier from sklearn.model_selection import GridSearchCV  # this is my x_data x_data = pd.DataFrame(..., columns=['Variable1', 'Variable2', 'Variable3'])  pipeline = Pipeline(steps=[('preprocessing1', make_column_transformer((StandardScaler(), ['Variable1']),  remainder='passthrough')),  ('preprocessing2', make_column_transformer((MaxAbsScaler(), ['Variable2']),  remainder='passthrough')),  ('preprocessing3', make_column_transformer((MinMaxScaler(), ['Variable3']),  remainder='passthrough')),  ('clf', MLPClassifier(...)  ]  )  

затем мы запустили бы GridSearchCV что-то вроде следующего:

 params = [{'preprocessing1': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], # lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt; How???  'preprocessing2': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], # lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt; How???  'preprocessing3': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], # lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt; How???  'ann__hidden_layer_sizes': [(100,), (200,)],  'ann__solver': ['adam', 'lbfs', 'sgd'],  ...  }]  cv = GridSearch(pipeline, params, cv=10, verbose=1, n_jobs=-1, refit=True)  

Что я хотел бы сделать, так это найти наилучшую предварительную обработку для каждого предиктора, потому что обычно одна предварительная обработка для всех предикторов работает не лучшим образом.

Комментарии:

1. Почему бы не просто один ColumnTransformer , если вы применяете разные масштабаторы к разным столбцам?

Ответ №1:

Соглашение об именовании в конвейере использует двойное подчеркивание __ для разделения шагов и их параметров.

Вы можете увидеть различные параметры вашего конвейера и их значение с помощью pipeline.get_params() .

В вашем случае параметр preprocessing1__standardscaler ссылается на предварительную обработку масштабирования, определенную для первого шага вашего конвейера, и это аргумент, который следует задать во время GridSearchCV .

Приведенный ниже пример иллюстрирует, как выполнить эту операцию:

 from sklearn.preprocessing import StandardScaler, MinMaxScaler, MaxAbsScaler from sklearn.datasets import make_classification from sklearn.pipeline import Pipeline from sklearn.compose import make_column_transformer from sklearn.model_selection import GridSearchCV from sklearn.neural_network import MLPClassifier  X, y = make_classification(  n_features=3, n_informative=3, n_redundant=0, random_state=42 )  pipeline = Pipeline(  steps=[  ("preprocessing1", make_column_transformer((StandardScaler(), [0]), remainder="passthrough")),  ("preprocessing2", make_column_transformer((StandardScaler(), [1]), remainder="passthrough")),  ("preprocessing3", make_column_transformer((StandardScaler(), [2]), remainder="passthrough")),  ("clf", MLPClassifier()),  ] )  param_grid = {  "preprocessing1__standardscaler": [StandardScaler(), MinMaxScaler(), MaxAbsScaler()],  "preprocessing2__standardscaler": [StandardScaler(), MinMaxScaler(), MaxAbsScaler()],  "preprocessing3__standardscaler": [StandardScaler(), MinMaxScaler(), MaxAbsScaler()], }  grid_search = GridSearchCV(pipeline, param_grid, cv=10, verbose=1, n_jobs=-1) grid_search.fit(X, y) grid_search.best_params_  

Это вернет следующий вывод:

 {'preprocessing1__standardscaler': MinMaxScaler(),  'preprocessing2__standardscaler': StandardScaler(),  'preprocessing3__standardscaler': MaxAbsScaler()}  

Комментарии:

1. большое спасибо! отличный ответ! жаль, что преобразователь столбцов должен быть доступен с помощью масштабатора по умолчанию __standardscaler , а не с помощью общей нейтральной формы … косметика, но ладно.

2. Всегда пожалуйста 🙂 Я думаю, что это было реализовано для обеспечения того, чтобы каждый препроцессор, оценщик и гиперпараметры имели уникальный ключ внутри конвейера.

3. @SkyWalker Вы могли бы использовать полное ColumnTransformer вместо make_column_transformer , и в этом случае вы можете, по крайней мере, указать свое собственное (более короткое) имя для трансформатора.