如何在sklearn中保存自定义转换器?

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会话中。

是否可以保存自定义转换器并在以后将其加载到其他地方?

Mat*_*rde 5

sklearn.preprocessing.StandardScaler之所以能够工作,是因为sklearn软件包安装中提供了类定义,joblib在您加载泡菜时将查找该类定义。

您必须CustomTransformer通过重新定义或导入课程,使课程在新会话中可用。