Включить Custom Class при сериализации "травления" Sklearn Model? ... модуль __main__ не имеет атрибута - PullRequest
0 голосов
/ 20 мая 2019

AttributeError: module '__main__' has no attribute 'PandasDataFrameSelector'

Как это исправить, чтобы при включении модели включался пользовательский класс?

У меня есть пользовательский класс sklearn длявыбрав логические столбцы в моем конвейере и хочу вызвать его через конечную точку API, но получаю ошибку AttributeError: module '__main__' has no attribute 'PandasDataFrameSelector'.

При тестировании в ноутбуке Jupyter у меня нет проблем, но когда у меня есть .py, я получаю сообщение об ошибке, когда конечная точка API пытается прочитать .pkl, потому что пользовательский класс не включен в.pkl )

Нужно ли добавлять if __name__ == '__main__': до или после выбора модели?

Я новичок в развертывании Python dev ops,и мог найти только эту статью => https://www.stefaanlippens.net/python-pickling-and-dealing-with-attributeerror-module-object-has-no-attribute-thing.html

from sklearn.externals import joblib
from sklearn.base import BaseEstimator, TransformerMixin
import numpy as np
import pandas as pd

# model training here + custom class ...

class PandasDataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names].values

# export model
joblib.dump(pl, "model.pkl")

# read model
class PandasDataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names].values

model = joblib.load("model.pkl")

...