如果我同时使用简单的编码器和基于目标的编码器,我对如何组装最佳的pipeline感到困惑。我找到了这个例子,它说明了问题在于必须将目标变量与要编码的变量一起传递。
from examples.source_data.loaders import get_mushroom_datafrom sklearn.compose import ColumnTransformerfrom category_encoders import TargetEncoder# 从蘑菇数据集获取数据X, y, _ = get_mushroom_data()# 编码指定的列ct = ColumnTransformer( [ ('Target encoding', TargetEncoder(), ['bruises', 'odor']) ], remainder='passthrough')encoded = ct.fit_transform(X=X, y=y)
然而,我不想直接使用fit_transform
,而是希望将其添加到我的pipeline中,以便在交叉验证方案中使用它。
所以,以下代码是行不通的:
pipeline_ordinal = Pipeline(steps=[('imputer', SimpleImputer(strategy='constant', fill_value='missing')) ,('ord encoding', ce.ordinal.OrdinalEncoder())])pipeline_loo = Pipeline(steps=[('imputer', SimpleImputer(strategy='constant', fill_value='missing')) ,('loo encoding', ce.LeaveOneOutEncoder())])preprocessor = ColumnTransformer( transformers=[('simple', pipeline_ordinal, ['x1','x2','x3']), ('targetbased', pipeline_loo, ['x4','x5','y']) ])rf = RandomForestRegressor()pipe = Pipeline(steps=[('preprocessor', preprocessor),('regression', rf)])gs = GridSearchCV(pipe, param_grid=params, cv = cv)gs.fit(X, y)
有没有更好的方法来整合这些代码呢?
编辑:
问题在于将X传递给gs.fit()。目前,上面的代码会报错:ValueError: A given column is not a column of the dataframe
如果我尝试聪明地将’y’也发送到X中,它会告诉我ValueError: cannot reindex from a duplicate axis
回答:
目标变量y
会在gs.fit(X, y)
中被传递并特别处理。你不需要(也不应该)在ColumnTransformer
中将其指定为列。
(尽管pipeline_ordinal
和pipeline_loo
都可以访问y
,但前者实际上不会使用它。)