管道中的sklearn功能变压器

时间:2016-09-09 07:53:27

标签: python scikit-learn pipeline transformer

为sk-learn编写我的第一个管道我只发现了一些问题,只有一部分列被放入管道:

functionTransformer

我使用def extractSpecificColumn(X, columns): return X[columns] pipeline = Pipeline([ ('features', FeatureUnion([ ('continuous', Pipeline([ ('numeric', FunctionTransformer(columnsNumber)), ('scale', StandardScaler()) ])) ], n_jobs=1)), ('estimator', RandomForestClassifier(n_estimators=50, criterion='entropy', n_jobs=-1)) ]) cv.cross_val_score(pipeline, XoneColumn, y, cv=folds, scoring=kappaScore) 之类的:

TypeError: 'list' object is not callable

当启用函数转换器时,结果为:ColumnExtractor

编辑:

如果我在下面实例化functionTransformer,则不会返回错误。但class ColumnExtractor(TransformerMixin): def __init__(self, columns): self.columns = columns def transform(self, X, *_): return X[self.columns] def fit(self, *_): return self 是不是仅仅意味着像这样的简单案例而应该起作用?

{{1}}

1 个答案:

答案 0 :(得分:3)

FunctionTransformer用于将函数“提升”到转换,我认为这可以帮助完成一些数据清理步骤。想象一下,你有一个主要是数字的数组,你想用变换器转换它,如果它得到nan(如Normalize)则会出错。你可能会得到像

这样的东西
df.fillna(0, inplace=True)
...
cross_val_score(pipeline, ...)

但也许你fillna仅在一次转化时才需要,所以不要像上面那样fillna,而是

normalize = make_pipeline(
    FunctionTransformer(np.nan_to_num, validate=False),
    Normalize()
)

最终会根据需要对其进行标准化。然后,您可以在更多地方使用该代码段而不会使用.fillna(0)

乱丢您的代码

在您的示例中,您传递的['numeric1']list,而不是类似于类似df[['numeric1']]的提取器。您可能想要的更像是

FunctionTransformer(operator.itemgetter(columns))

但仍然无法正常工作,因为最终传递到FunctionTransformer的对象将是np.array而不是DataFrame

为了对DataFrame的特定列进行操作,您可能希望使用像sklearn-pandas这样的库,它允许您按列定义特定的变换器。