Python scikit 学习管道(没有特征转换)

arq*_*ago 3 python scikit-learn

我在我的数据集上运行不同的机器学习模型。我正在使用 sklearn 管道尝试对数字特征进行不同的转换,以评估一种转换是否能提供更好的结果。我使用的基本结构很简单:

from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScalar

pipe = Pipeline(steps=[('stdscaler', StandardScaler()), ('clf', RandomForestClassifier())])

pipe.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

我正在尝试一系列转换,但我还想测试不对数字特征集执行任何转换的场景(即按原样使用特征)。有没有办法将其包含在管道中?就像是:

pipe = Pipeline(steps=[('do nothing', do_nothing()), ('clf', RandomForestClassifier())])
Run Code Online (Sandbox Code Playgroud)

And*_*ren 5

是的,你可以简单地做

pipe = Pipeline(steps=[('clf', RandomForestClassifier())])
Run Code Online (Sandbox Code Playgroud)

另外,如果您有一些您几乎一直想要的自定义基础转换,并且它还具有某些超参数或添加的功能,您也可以执行类似的操作(有点蹩脚的示例,但仅用于想法..)

from sklearn.base import TransformerMixin

class Transform(TransformerMixin):
    def __init__(self, **kwargs):
        print(kwargs)
        self.hyperparam = kwargs

    def fit(self, X, y=None):
        return self

    def transform(self, X):
        if self.hyperparam["square"]:
            X = [x**2 for x in X]
        # elif "other_transform" in self.hyperparam:
            # pass_val = self.hyperparam['other_transform']
            # X = other_transform(X, pass_val)
        return X  # default to no transform if no hyperparameter is provided as argument of Transform()

pass_pipe = Pipeline(steps=[('do nothing', Transform()),
                            ('clf', RandomForestClassifier())])
square_pipe = Pipeline(steps=[('square', Transform(square=True)),
                              ('clf', RandomForestClassifier())])

Run Code Online (Sandbox Code Playgroud)

上述是一种互斥的转换方式,即一个或另一个。相反,如果您有一堆转换并且想要按特定顺序应用它们,那么实现回调可能是正确的方法。看看这种事情是如何在 sklearn、pytorch 或 fastai 等流行库中实现的。