Не удалось загрузить сериализованный объект, сохраненный в хранилище BLOB-объектов Azure.

Мы используем Scikit-learn Pipeline для создания конвейера Feature Engineering

from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
import numpy as np

rooms_ix, bedrooms_ix, population_ix, households_ix = 3, 4, 5, 6
class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
    def __init__(self, add_bedrooms_per_room=True):  # no *args or **kargs
        self.add_bedrooms_per_room = add_bedrooms_per_room

    def fit(self, X, y=None):
        return self  # nothing else to do

    def transform(self, X):
        rooms_per_household = X[:, rooms_ix] / X[:, households_ix]
        population_per_household = X[:, population_ix] / X[:, households_ix]
        if self.add_bedrooms_per_room:
            bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix]
            return np.c_[X, rooms_per_household, population_per_household,
                             bedrooms_per_room]
        else:
            return np.c_[X, rooms_per_household, population_per_household]

def create_new_features(housing):
    """
    Function to create new features using the cleansed data
    clean_df (DataFrame)    : DataFrame which is used to create new features
    return (DataFrame)      : DataFrame with the derived features
    """
    housing_num = housing.drop("ocean_proximity", axis=1)
    num_pipeline = Pipeline([
        ('imputer', SimpleImputer(strategy="median")),
        ('attribs_adder', CombinedAttributesAdder()),
        ('std_scaler', StandardScaler()), ])
    #housing_num_tr = num_pipeline.fit_transform(housing_num)
    num_attribs = list(housing_num)
    cat_attribs = ["ocean_proximity"]

    full_pipeline = ColumnTransformer([
        ("num", num_pipeline, num_attribs),
        ("cat", OneHotEncoder(), cat_attribs), ])
    #housing_prepared = full_pipeline.fit_transform(housing)
    #return housing_prepared
    return full_pipeline

Затем мы подгоняем его к обучающим данным и сериализуем этот объект конвейера и сохраняем его в хранилище BLOB-объектов Azure, чтобы использовать его для преобразования данных во время вывода.

pipeline = create_new_features(train.drop("median_house_value", axis=1))
pipeline = pipeline.fit(train[cols])
with open("feg_pipeline.pkl", 'wb') as f:
    dill.dump(pipeline, f, protocol=pickle.HIGHEST_PROTOCOL)
blob_service_client = BlobServiceClient.from_connection_string(conn_str=‘XXX’)
container_name = ‘YYY’
blob_service_client.create_container(container_name, public_access=PublicAccess.Container)
blob_client = blob_service_client.get_blob_client(
            container=container_name, blob='feg_pipeline.pkl')
blob_client.upload_blob('feg_pipeline.pkl')

В функции Score мы читаем это из хранилища BLOB-объектов следующим образом

blob = BlobClient(account_url='https://fhghjhjh’,
                 container_name=‘YYY’,
                   blob_name='feg_pipeline.pkl’,
                   credential=‘XXX’)
feg_from_blob = None
with open("feg_pipeline.pkl”, "wb") as f:
    data = blob.download_blob()
    data.readinto(f)
with open("feg_pipeline.pkl”, "rb") as f:
    feg_from_blob = dill.load(f)

Для этого мы получаем

UnpicklingError: invalid load key, 'f'.

Мы пробовали использовать -

  1. Методы Dill, Joblib, cPickle, CloudPickle и Pickle для сериализации и десериализации вызвали ошибку ключа при загрузке объекта из файла, загруженного из Blob.
  2. Кодирование Base64 (при сериализации) и декодирование (при десериализации).. Это дает ошибку заполнения при загрузке.

Как лучше всего сохранять и повторно использовать такие объекты в Azure?

0 ответов

Другие вопросы по тегам