访问`sklearn`管道中的变换器功能

Bor*_*lik 5 python scikit-learn

根据sklearn.pipeline.Pipeline文档,

管道具有管道中最后一个估计器具有的所有方法,即如果最后一个估计器是分类器,则管道可以用作分类器.如果最后一个估算器是变压器,那么管道也是如此.

以下示例使用自定义虚函数创建虚拟变换器f:

class C:
    def fit(self, X, y=None):
        print('fit')
        return self
    def transform(self, X):
        print('transform')
        return X

    def f(self):
        print('abc')

from sklearn.pipeline import Pipeline
ppl = Pipeline([('C', C())])
Run Code Online (Sandbox Code Playgroud)

我希望能够访问变压器的f功能C,但是调用会ppl.f()产生结果AttributeError: 'Pipeline' object has no attribute 'f'

我误解了文档吗?是否有一种良好可靠的方式来访问最后一个变压器的功能?

And*_*eus 5

Pipeline文档稍微夸大了事情。它具有其最后一个估计器的所有估计器方法。这些包括诸如predict(), fit_predict(), fit_transform(), transform(), decision_function(), predict_proba()....

它不能使用任何其他函数,因为它不知道如何处理管道中的所有其他步骤。对于大多数情况,您(X)可能会传递 或,并且 X 和/或 y 必须使用或(X,y)穿过管道中的每个链。fit_transform()transform()

访问最后一个估计器相当容易,如下所示:

ppl.steps[-1][1].f()
Run Code Online (Sandbox Code Playgroud)

但请记住,这样做会绕过管道中的先前步骤(即,如果您通过它X,它将不会与您的 StandardScaler 或您在管道中之前所做的任何操作一起缩放。)