加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:58:33 所属栏目:Python 来源:网络整理
导读:我刚刚发现了scikit-learn的 Pipeline特性,我发现它在训练模型之前测试预处理步骤的不同组合非常有用. 管道是实现拟合和转换方法的对象链.现在,如果我想添加一个新的预处理步骤,我曾经写过一个继承自sklearn.base.estimator的类.但是,我认为必须有一个更简单
我刚刚发现了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)

现在你可以做到

@TransformerWrapper
def foo(x):
  return x*2

这相当于做

def foo(x):
  return x*2

foo = TransformerWrapper(foo)

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

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

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

from sklearn.preprocessing import FunctionTransformer

@FunctionTransformer
def foo(x):
  return x*2

太.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读