如何构建细粒度管道以筛选每个特征列的最佳preprocessing方案
实现细粒度列级预处理最优方案筛选的方法
你原来拆分多步ColumnTransformer的写法虽然可行,但参数配置路径不对,更推荐将所有列的预处理逻辑合并到同一个ColumnTransformer中,再配置网格搜索参数,结构更清晰且易维护:
1. 核心原理
sklearn的网格搜索支持通过双下划线__逐层定位嵌套对象的参数,我们可以直接在参数网格中为ColumnTransformer里绑定不同列的转换器,指定独立的可选预处理方法。
2. 正确配置步骤
首先简化管道结构,无需拆分多个preprocessing步骤:
import pandas as pd from sklearn.preprocessing import MaxAbsScaler, MinMaxScaler, StandardScaler from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.neural_network import MLPClassifier from sklearn.model_selection import GridSearchCV # 替换为你的实际数据 x_data = pd.DataFrame(..., columns=['Variable1', 'Variable2', 'Variable3']) y_data = ... # 定义单步列转换器,初始转换器随便指定即可,后续网格搜索会自动替换 col_transformer = ColumnTransformer( transformers=[ ('trans_var1', StandardScaler(), ['Variable1']), ('trans_var2', StandardScaler(), ['Variable2']), ('trans_var3', StandardScaler(), ['Variable3']) ], remainder='passthrough' ) # 组装管道:仅包含预处理+分类器两步 pipeline = Pipeline(steps=[ ('preprocess', col_transformer), ('clf', MLPClassifier()) ])
接着配置参数网格,通过[列转换器前缀]__[绑定列的转换器名]的路径,为每个列指定独立的可选预处理方法:
params = { # 三个列的预处理选项完全独立,互不影响 'preprocess__trans_var1': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], 'preprocess__trans_var2': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], 'preprocess__trans_var3': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], # 分类器参数注意前缀要和管道里的分类器命名对应 'clf__hidden_layer_sizes': [(100,), (200,)], 'clf__solver': ['adam', 'lbfgs', 'sgd'] } # 运行网格搜索 cv = GridSearchCV(pipeline, params, cv=10, verbose=1, n_jobs=-1, refit=True) cv.fit(x_data, y_data)
3. 结果查看
搜索完成后通过cv.best_params_即可直接查看每一列对应的最优预处理方法,以及分类器的最优参数。
如果你一定要保留原来拆分多步preprocessing的写法,调整参数路径即可,但可读性远低于上述方案:
params = { 'preprocessing1__columntransformer__transformers__0__1': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], 'preprocessing2__columntransformer__transformers__0__1': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], 'preprocessing3__columntransformer__transformers__0__1': [MinMaxScaler(), MaxAbsScaler(), StandardScaler()], # 后续接分类器参数 }
内容的提问来源于stack exchange,提问作者SkyWalker
相关产品推荐
相关产品推荐

