python - 管道中的 sklearn 函数转换器

标签 python scikit-learn pipeline transformer-model

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

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

最佳答案

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 的库这允许您按列定义特定的转换器。

关于python - 管道中的 sklearn 函数转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39406539/

相关文章:

python - 如何在Python 3中避免 "no module installed"

python - class_weight = 'balanced' 相当于朴素贝叶斯

python - 如何在python中声明变量类型,C风格

python - 在 bash 中使用 xargs 进行并行处理

python - JPype 无法正确编译

python - sklearn : How to speed up a vectorizer (eg Tfidfvectorizer)

python - 我遇到了 OnehotEncoder 的问题

cypress - GitHub 操作管道中的 yml 文件中的意外值 "with"

git - 尝试执行多次 checkout 时,Azure Pipeline 会创建第二个源代码文件夹 (Build.SourcesDirectory)

powershell - 在powershell中获取管道的最后一个元素