python – scikit-learn:将任意函数应用为管道的一部分

python – scikit-learn:将任意函数应用为管道的一部分,第1张

概述我刚刚发现了scikit-learn的 Pipeline特性,我发现它在训练模型之前测试预处理步骤的不同组合非常有用. 管道是实现拟合和转换方法的对象链.现在,如果我想添加一个新的预处理步骤,我曾经写过一个继承自sklearn.base.estimator的类.但是,我认为必须有一个更简单的方法.我是否真的需要在估算器类中包含我想要应用的每个函数? 例: class Categorizer(skl 我刚刚发现了scikit-learn的 Pipeline特性,我发现它在训练模型之前测试预处理步骤的不同组合非常有用.

管道是实现拟合和转换方法的对象链.现在,如果我想添加一个新的预处理步骤,我曾经写过一个继承自sklearn.base.estimator的类.但是,我认为必须有一个更简单的方法.我是否真的需要在估算器类中包含我想要应用的每个函数?

例:

class Categorizer(sklearn.base.BaseEstimator):    """    Converts given columns into pandas dtype 'category'.    """    def __init__(self,columns):        self.columns = columns    def fit(self,X,y):        return self    def transform(self,X):        for column in self.columns:            X[column] = X[column].astype("category")        return X
解决方法 对于一般解决方案(适用于许多其他用例,不仅仅是变换器,还有简单模型等),如果你有无状态函数(没有实现拟合),你可以编写自己的装饰器,例如:

class transformerWrapper(sklearn.base.BaseEstimator):    def __init__(self,func):        self._func = func    def fit(self,*args,**kwargs):        return self    def transform(self,**kwargs):        return self._func(X,**kwargs)

现在你可以做到

@transformerWrapperdef foo(x):  return x*2

这相当于做

def foo(x):  return x*2foo = transformerWrapper(foo)

这就是sklearn.preprocessing.Functiontransformer正在做什么.

我个人认为装饰更简单,因为你的预处理器与其余的代码有很好的分离,但是由你决定遵循哪条路径.

实际上你应该可以用sklearn函数来装饰

from sklearn.preprocessing import Functiontransformer@Functiontransformerdef foo(x):  return x*2

太.

总结

以上是内存溢出为你收集整理的python – scikit-learn:将任意函数应用为管道的一部分全部内容,希望文章能够帮你解决python – scikit-learn:将任意函数应用为管道的一部分所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1193877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存