#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
, и в этом случае вы можете, по крайней мере, указать свое собственное (более короткое) имя для трансформатора.