imm*_*ied 9 python session pickle scikit-learn
我无法加载使用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')
Run Code Online (Sandbox Code Playgroud)
打开一个新的python会话并从'custom_transformer.pkl'加载
from sklearn.externals import joblib
joblib.load('custom_transformer.pkl')
Run Code Online (Sandbox Code Playgroud)
引发以下异常:
AttributeError: module '__main__' has no attribute 'CustomTransformer'
Run Code Online (Sandbox Code Playgroud)
如果joblib
将替换为,则会观察到相同的结果pickle
。在一个会话中保存自定义转换器
with open('custom_transformer_pickle.pkl', 'wb') as f:
pickle.dump(custom_transformer, f, -1)
Run Code Online (Sandbox Code Playgroud)
并加载到另一个:
with open('custom_transformer_pickle.pkl', 'rb') as f:
loaded_custom_transformer_pickle = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)
引发相同的异常。
在上面,如果CustomTransformer
将替换为,sklearn.preprocessing.StandardScaler
则发现可以将保存的实例加载到新的python会话中。
是否可以保存自定义转换器并在以后将其加载到其他地方?
sklearn.preprocessing.StandardScaler
之所以能够工作,是因为sklearn软件包安装中提供了类定义,joblib
在您加载泡菜时将查找该类定义。
您必须CustomTransformer
通过重新定义或导入课程,使课程在新会话中可用。
归档时间: |
|
查看次数: |
1817 次 |
最近记录: |