我在我的数据集上运行不同的机器学习模型。我正在使用 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)
我正在尝试一系列转换,但我也想测试没有对数字特征集执行任何转换的场景(即按原样使用特征)。有没有办法将其包含在管道中?像这样的东西:
pipe = Pipeline(steps=[('do nothing', do_nothing()), ('clf', RandomForestClassifier())])
最佳答案
是的,你可以简单地做
pipe = Pipeline(steps=[('clf', RandomForestClassifier())])
此外,如果您有一些您几乎一直想要的自定义基础转换,并且它也有某些超参数或添加的功能,您也可以做类似的事情(有点蹩脚的例子,但只是为了想法..)
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())])
以上是一种相互排斥的转换方式,即一个或另一个。相反,如果你有一堆转换并且你想按特定顺序应用它们,那么实现回调可能是正确的方法。查看如何在 sklearn、pytorch 或 fastai 等流行库中实现此类功能。
关于Python scikit 学习管道(无特征转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62922604/