pipelin中的sklearn函数变换器

2024-09-26 22:55:29 发布

您现在位置:Python中文网/ 问答频道 /正文

在为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]

我使用functionTransformer类似于:

^{pr2}$

这将导致: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

Tags: columnsselfdataframereturn管道deflearnpd
1条回答
网友
1楼 · 发布于 2024-09-26 22:55:29

FunctionTransformer用于将函数“提升”为转换,我认为这有助于执行一些数据清理步骤。假设你有一个主要是数字数组,你想用一个转换器来转换它,如果它得到一个nan(比如Normalize),这个转换器就会出错。你可能会有类似的结果

df.fillna(0, inplace=True)
...
cross_val_score(pipeline, ...)

但是也许你认为fillna只在一个转换中被需要,所以你不需要像上面那样使用fillna,而是

^{pr2}$

最终按你的要求进行规范化。然后您可以在更多的地方使用该代码片段,而不必在代码中使用.fillna(0)

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

FunctionTransformer(operator.itemgetter(columns))

但这仍然行不通,因为最终传递到FunctionTransformer的对象将是np.array,而不是DataFrame。在

为了对DataFrame的特定列执行操作,您可能需要使用类似sklearn-pandas的库,该库允许您按列定义特定的转换器。在

相关问题 更多 >

    热门问题