用它包装的函数保存一个sklearn`FunctionTransformer`

乌里·戈伦(Uri Goren):

我使用sklearnPipeline,并FunctionTransformer用自定义功能

from sklearn.externals import joblib
from sklearn.preprocessing import FunctionTransformer
from sklearn.pipeline import Pipeline

这是我的代码:

def f(x):
    return x*2
pipe = Pipeline([("times_2", FunctionTransformer(f))])
joblib.dump(pipe, "pipe.joblib")
del pipe
del f
pipe = joblib.load("pipe.joblib") # Causes an exception

我得到这个错误:

AttributeError:模块“ __ main__”没有属性“ f”

如何解决呢?

请注意,也会在 pickle

乌里·戈伦(Uri Goren):

我能够使用marshal模块(除了pickle破解解决方案并覆盖魔术方法getstatesetstate所使用pickle

import marshal
from types import FunctionType
from sklearn.base import BaseEstimator, TransformerMixin

class MyFunctionTransformer(BaseEstimator, TransformerMixin):
    def __init__(self, f):
        self.func = f
    def __call__(self, X):
        return self.func(X)
    def __getstate__(self):
        self.func_name = self.func.__name__
        self.func_code = marshal.dumps(self.func.__code__)
        del self.func
        return self.__dict__
    def __setstate__(self, d):
        d["func"] = FunctionType(marshal.loads(d["func_code"]), globals(), d["func_name"])
        del d["func_name"]
        del d["func_code"]
        self.__dict__ = d
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return self.func(X)

现在,如果我们使用MyFunctionTransformer而不是FunctionTransformer,代码将按预期工作:

from sklearn.externals import joblib
from sklearn.pipeline import Pipeline

@MyFunctionTransformer
def my_transform(x):
    return x*2
pipe = Pipeline([("times_2", my_transform)])
joblib.dump(pipe, "pipe.joblib")
del pipe
del my_transform
pipe = joblib.load("pipe.joblib")

它的工作方式是f从泡菜中删除该函数,然后删除marshaling其代码和名称。

dill 看起来也像封送处理的不错选择

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否总是一个很好的做法来包装一个递归函数?

C ++ 11/14:包装一个函数(如果存在)

反应:当prop函数在另一个函数内部时,不能调用它吗?

Python保存一个评估函数

编写一个函数,该函数接受包装的常量,但仅深一层

如何将一个函数的另一个对象的属性传递给一个函数,并在javascript中调用它?

如何保存字符串并在另一个类中使用它?

我可以在构造函数中创建一个局部函数并调用它吗

我想将查询返回的结果保存在变量中,并在另一个函数中使用它

如何包装一个函数以适合另一个函数的所需类型

包装一个函数并通过将modulename传递给一个函数将其包装到一个闭包中

尝试将一个函数包装到另一个函数中时出现打字稿错误

存储参数和函数并在另一个函数中使用它们

当目标函数有一个包装函数时,该如何包装该包装函数以保留默认值?

保存ListView项目并在另一个ListView中使用它吗?

将一个函数包装在另一个函数中

包装一个接收JS对象(记录)的OCaml函数

在函数中创建数组,并在另一个函数中使用它

如何在函数内定义变量并使用它来调用另一个函数

ReactJS 导出多个包装函数一个组件

用另一个函数包装一个函数的参数并用一些超时时间调用它

从一个函数返回所有可能的输出,然后在另一个函数中使用它

无法在从另一个函数调用它的函数中设置变量

类方法包装一个函数 - 参数问题

当我在另一个函数中调用它时函数不起作用

如何保存 JSON 对象并在另一个请求中使用它?

从一个函数中获取信息并在另一个函数中使用它

打字稿键入一个包装函数,假定被包装的函数的类型

在java中创建一个包装类接受函数