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

标签 python session scikit-learn pickle

我无法加载使用 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/

相关文章:

python - 在 R 中打开 pickled sklearn 文件

python - 如何在sklearn中调整score_func(特征选择)的超参数?

python - 为什么子图的大小不同?

python - 在 PIL 中打开图像文件时出错

python - 用python解析dns配置文件

php - 如何在 cakephp 中获取 $_SESSION 值

python - 如何在 matplotlib 中制作分组箱线图

php - CodeIgniter session 和常规 session 可以共存吗?

internet-explorer - Zend Framework - Internet Explorer - phpsessid cookie 问题

python - 带有预处理器和小写字母的 sklearn CountVectorizer 中的错误?