【发布时间】:2019-04-10 04:04:52
【问题描述】:
我已经建立了一个自定义的sklearn管道,如下:
pipeline = make_pipeline(
SelectColumnsTransfomer(features_to_use),
ToDummiesTransformer('feature_0', prefix='feat_0', drop_first=True, dtype=bool), # Dummify customer_type
ToDummiesTransformer('feature_1', prefix='feat_1'), # Dummify the feature
ToDummiesTransformer('feature_2', prefix='feat_2'), # Dummify
ToDummiesTransformer('feature_3', prefix='feat_3'), # Dummify
)
pipeline.fit(df)
SelectColumnsTransfomer 和 ToDummiesTransformer 类是实现 BaseEstimator 和 TransformerMixin 的自定义 sklearn 步骤。
为了序列化这个对象,我使用
from sklearn.externals import joblib
joblib.dump(pipeline, 'data_pipeline.joblib')
但是当我反序列化时
pipeline = joblib.load('data_pipeline.joblib')
我收到AttributeError: module '__main__' has no attribute 'SelectColumnsTransfomer'。
我已阅读其他类似问题并按照此博文here 中的说明进行操作,但无法解决问题。
我正在复制粘贴类,并将它们导入代码中。如果我创建了这个练习的简化版本,整个事情就可以了,问题发生是因为我正在使用 pytest 运行一些测试,当我运行 pytest 时,它似乎没有看到我的自定义类,实际上还有其他部分的错误
self = <sklearn.externals.joblib.numpy_pickle.NumpyUnpickler object at 0x7f821508a588>, module = '__main__', name = 'SelectColumnsTransfomer' 暗示我 NumpyUnpickler 看不到 SelectColumnsTransfomer 即使在测试中它被导入。
我的测试代码
import pytest
from app.pipeline import * # the pipeline objects
# SelectColumnsTransfomer and ToDummiesTransformer
# are here!
@pytest.fixture(scope="module")
def clf():
pipeline = joblib.load("persistence/data_pipeline.joblib")
return clf
def test_fake(clf):
assert True
【问题讨论】:
标签: python scikit-learn pytest pickle joblib