我无法加载使用 sklearn.externals.joblib.dump
保存的自定义转换器的实例或 pickle.dump
因为当前 python session 中缺少自定义转换器的原始定义。
假设在一个 python session 中,我定义、创建并保存了一个自定义转换器,它也可以在同一个 session 中加载:
from sklearn.base import TransformerMixin
from sklearn.base import BaseEstimator
from sklearn.externals import joblib
class CustomTransformer(BaseEstimator, TransformerMixin):
def __init__(self):
pass
def fit(self, X, y=None):
return self
def transform(self, X, y=None):
return X
custom_transformer = CustomTransformer()
joblib.dump(custom_transformer, 'custom_transformer.pkl')
loaded_custom_transformer = joblib.load('custom_transformer.pkl')
打开一个新的 python session 并从“custom_transformer.pkl”加载
from sklearn.externals import joblib
joblib.load('custom_transformer.pkl')
引发以下异常:
AttributeError: module '__main__' has no attribute 'CustomTransformer'
如果
joblib
观察到同样的事情替换为 pickle
.在一个 session 中保存自定义转换器with open('custom_transformer_pickle.pkl', 'wb') as f:
pickle.dump(custom_transformer, f, -1)
并将其加载到另一个中:
with open('custom_transformer_pickle.pkl', 'rb') as f:
loaded_custom_transformer_pickle = pickle.load(f)
引发相同的异常。
在上面,如果
CustomTransformer
被替换为,比如说,sklearn.preprocessing.StandardScaler
,然后发现可以在新的python session 中加载保存的实例。是否可以保存自定义变压器并稍后将其加载到其他地方?
最佳答案
sklearn.preprocessing.StandardScaler
之所以有效,是因为类定义在 sklearn 包安装中可用,其中 joblib
当您加载 pickle 时会查找。
您必须制作您的 CustomTransformer
新 session 中可用的类,通过重新定义或导入它。
关于python - 如何在sklearn中保存自定义转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077793/