管道中的sklearn功能变压器

Geo*_*ler 5 python pipeline transformer-model scikit-learn

编写我的第一个sk-learn管道时,我只是遇到一些问题,只有一部分列被放入管道:

mydf = pd.DataFrame({'classLabel':[0,0,0,1,1,0,0,0],
                   'categorical':[7,8,9,5,7,5,6,4],
                   'numeric1':[7,8,9,5,7,5,6,4],
                   'numeric2':[7,8,9,5,7,5,6,"N.A"]})
columnsNumber = ['numeric1']
XoneColumn = X[columnsNumber]
Run Code Online (Sandbox Code Playgroud)

我用的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)
Run Code Online (Sandbox Code Playgroud)

这导致: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
Run Code Online (Sandbox Code Playgroud)

Ale*_*ina 4

FunctionTransformer用于将函数“提升”为转换,我认为这可以帮助完成一些数据清理步骤。想象一下,您有一个主要是数字的数组,并且您想使用 Transformer 对其进行转换,如果它得到nan(如Normalize),则会出错。你最终可能会得到类似的东西

df.fillna(0, inplace=True)
...
cross_val_score(pipeline, ...)
Run Code Online (Sandbox Code Playgroud)

但也许你fillna只需要一次转换,所以fillna你不需要像上面那样,而是

normalize = make_pipeline(
    FunctionTransformer(np.nan_to_num, validate=False),
    Normalize()
)
Run Code Online (Sandbox Code Playgroud)

最终按照你想要的方式将其标准化。然后您可以在更多地方使用该代码片段,而不会乱七八糟地使用代码.fillna(0)

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

FunctionTransformer(operator.itemgetter(columns))
Run Code Online (Sandbox Code Playgroud)

但这仍然不起作用,因为最终传递到 FunctionTransformer 的对象将是 annp.array而不是 a DataFrame

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