Не удалось загрузить сериализованный объект, сохраненный в хранилище 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'.
Мы пробовали использовать -
- Методы Dill, Joblib, cPickle, CloudPickle и Pickle для сериализации и десериализации вызвали ошибку ключа при загрузке объекта из файла, загруженного из Blob.
- Кодирование Base64 (при сериализации) и декодирование (при десериализации).. Это дает ошибку заполнения при загрузке.
Как лучше всего сохранять и повторно использовать такие объекты в Azure?