gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:20:16 28 4
gpt4 key购买 nike

我正在使用 sklearnPipelineFunctionTransformer带有自定义功能

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: module '__ main__' has no attribute 'f'



如何解决?

请注意,此问题也出现在 pickle 中。

最佳答案

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

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来自 pickle ,而不是 marshaling它的代码和它的名字。

dill 看起来也是编码的不错选择

关于python - 用它包装的函数保存一个 sklearn `FunctionTransformer`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54012769/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com