【发布时间】:2018-02-15 02:19:12
【问题描述】:
我无法加载使用 sklearn.externals.joblib.dump 或 pickle.dump 保存的自定义转换器的实例,因为当前 python 会话中缺少自定义转换器的原始定义。
假设在一个 python 会话中,我定义、创建并保存了一个自定义转换器,它也可以在同一个会话中加载:
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 会话并从 'custom_transformer.pkl' 加载
from sklearn.externals import joblib
joblib.load('custom_transformer.pkl')
引发以下异常:
AttributeError: module '__main__' has no attribute 'CustomTransformer'
如果将joblib 替换为pickle,也会出现同样的情况。在一个会话中保存自定义转换器
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会话中加载。
是否可以保存自定义转换器并稍后在其他地方加载它?
【问题讨论】:
标签: python session scikit-learn pickle