Эта статья знакомит вас с концепцией сериализации и десериализации объектов в Python с помощью библиотеки pickle. К тому времени, когда вы закончите читать эту статью, вы сможете беспрепятственно сериализовать/сохранить свою модель в виде файла рассола и десериализовать/открыть ее в том же или другом файле Python для последующего использования, устранить проблемы, с которыми вы можете столкнуться при работе с рассола .

Содержание

  • Базовое введение в рассол.
  • Работа с Пиклом.
  • Распространенные ошибки и их решения.
  • Заключение.

Базовое введение в рассол.

Pickle — одна из стандартных библиотек Python для сериализации/десериализации объектов. Сериализация Pickle сохраняет объекты в файл в байтовом формате, а десериализация — это обратная сериализация. При попытке сериализовать объект в файл pickle необходимо сначала указать байтовый/двоичный формат, иначе вы столкнетесь с ошибкой. Некоторые объекты, такие как списки, кортежи, словари, преобразователи, модели и многие другие, могут быть маринованы/сериализованы, однако в этой статье основное внимание уделяется сериализации и десериализации моделей машинного обучения.

Работа с Pickle: сериализация модели

Чтобы использовать библиотеку pickle, вы должны сначала импортировать библиотеку с помощью строки кода «import pickle», вы также можете использовать псевдоним, если хотите, в таком стиле « import pickle as pk”, как показано ниже:

# Import style 1 (Without Alias)
import pickle

# Import style 2 (With Alias)
import pickle as pk

После импорта библиотеки pickle с выбранным вами стилем пришло время открыть/создать файл и выгрузить объект в файл. При открытии файла необходимо указать текстовые режимы, которые запись (w) и бинарный режим (b)для сериализации операций. Я буду обсуждать два метода сериализации модели:

Способ 1

Чтобы сохранить файл, используя «длинный метод», вы делаете следующее:

# Saving model to pickle file
with open("desired-model-file-name.pkl", "wb") as file: # file is a variable for storing the newly created file, it can be anything.
    pickle.dump(model, file) # Dump function is used to write the object into the created file in byte format.

Первая строка открывает файл в режиме двоичной записи и сохраняет вновь созданный файл в переменной «file», вторая строка записывает объект модели в файл и сохраняет его по умолчанию в том же каталоге/папке, что и файл, в котором находится python. файл сохраняется, но вы всегда можете указать собственный путь к файлу в функции open вместе с желаемым именем-файла-модели.pkl.

Способ 2

Чтобы сохранить файл, используя сокращенный метод, вы делаете следующее:

pickle.dump(model, open("desired-model-file-name.pkl", "wb"))

Этот удивительный однострочный код делает все то же самое, что и предыдущий метод, но всего в одной строке кода. Как новичок, я советую вам придерживаться первого метода, пока вы не получите лучшее представление о создании файлов, прежде чем переходить к этому однострочному методу. Преимущество первого метода заключается в том, что функция with автоматически закрывает файл для вас после сохранения модели, тогда как при однострочном методе вы должны использовать функцию close( ), чтобы закрыть файл.

Работа с Pickle: десериализация модели

Десериализация, обратный процесс сериализации, так же проста. Чтобы десериализовать файл, также необходимо указать текстовые режимы, которые читаются (r) и двоичный режим (b) для операций десериализации . Режим чтения сообщает компилятору, что файл уже существует, и все, что нужно сделать, это прочитать двоичный текст и преобразовать его обратно в исходный объект. Для этого я также рассмотрю два метода.

Способ 1

# Opening saved model
with open("desired-model-file-name.pkl", "rb") as file:
    model = pickle.load(file)

# The model has now been deserialized, next is to make use of it as you normally would.
prediction = model.predict([[2,112,68,22,94,34.1,0.315,26]]) # Passing in variables for prediction
print("The result is",prediction[0]) # Printing result

Первая строка кода указывает файл для открытия в байтовом формате, а затем сохраняет файл в переменной «файл», вторая строка кода загружает содержимое файла, который является моделью, и сохраняет его в переменной «модель». который затем можно использовать в обычном режиме.

Способ 2

# Open saved model using 2nd method
model_mtd2 = pickle.load(open("desired-model-file-name.pkl", "rb"))

# Now, to make use of the model as you normally would
result = model_mtd2.predict([[3,193,70,31,0,34.9,0.241,25]])
print("The result is", result[0])

Как и прежде, этот удивительный однострочный код делает то же самое, что и первый метод, всего в одной строке кода, после чего модель можно использовать как обычно.

Распространенные ошибки и их решения

Распространенная ошибка 1: попытка сериализации без указания байтового/двоичного формата.

# Attempting to serialize without specifying byte/binary format.
with open("desired-model-file-name.pkl", "w") as file:
    pickle.dump(model, file)

>>> Output Below
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
c:\Users\samsung\Documents\Projects\Article specific\model-serialization-deserialization\model-serialization-deserialization.ipynb Cell 10 in <cell line: 2>()
      1 # Attempting to serialize without specifying byte/binary format.
      2 with open("desired-model-file-name.pkl", "w") as file:
----> 3     pickle.dump(model, file)

TypeError: write() argument must be str, not bytes

При попытке сериализовать объект, если вы забудете указать режим двоичного текста (b), компилятор выдаст ошибку выше. Простое решение — добавить b’ до или после w’ в режиме открытого текста.

Распространенная ошибка 2: попытка сериализации в режиме чтения текста

# Attempting to serialize with read text mode
with open("desired-model-file-name.pkl", "rb") as file:
    pickle.dump(model, file)

>>> Output Below
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
c:\Users\samsung\Documents\Projects\Article specific\model-serialization-deserialization\model-serialization-deserialization.ipynb Cell 11 in <cell line: 2>()
      1 # Attempting to serialize with read text mode
      2 with open("desired-model-file-name.pkl", "rb") as file:
----> 3     pickle.dump(model, file)

UnsupportedOperation: write

Использование режима чтения текста сообщает вашему компилятору, что вы пытаетесь получить, а не поместить информацию в файл, поэтому, когда такая ошибка допущена, компилятор просто предлагает вам использовать режим записи текста 'w'которые вы можете поместить до или после 'b'текстового режима.

Распространенная ошибка 3: Попытка сериализовать/десериализовать без текстового режима w/r

# Attempting to serialize without specifying write text mode
with open("desired-model-file-name.pkl", "b") as file:
    pickle.dump(model, file)

>>> Output Below
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
c:\Users\samsung\Documents\Projects\Article specific\model-serialization-deserialization\model-serialization-deserialization.ipynb Cell 12 in <cell line: 2>()
      1 # Attempting to serialize without specifying write text mode
----> 2 with open("desired-model-file-name.pkl", "b") as file:
      3     pickle.dump(model, file)

ValueError: Must have exactly one of create/read/write/append mode and at most one plus
# Attempting to deserialize without specifying read text mode
with open("desired-model-file-name.pkl", "b") as file:
    pickle.load(file)

>>> Output Below
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
c:\Users\samsung\Documents\Projects\Article specific\model-serialization-deserialization\model-serialization-deserialization.ipynb Cell 13 in <cell line: 2>()
      1 # Attempting to deserialize without specifying read text mode
----> 2 with open("desired-model-file-name.pkl", "b") as file:
      3     pickle.load(file)

ValueError: Must have exactly one of create/read/write/append mode and at most one plus

Попытка доступа к файлу без указания режима доступа вызовет ошибку значения. Вы не можете ни читать, не указав режим чтения, ни писать, не указав режим записи. Чтобы устранить эту проблему, просто укажите соответствующий режим для функции, которую вы хотите выполнять, до или после текстового режима b’.

Распространенная ошибка 4: попытка десериализовать недопустимый файл

# Attempting to deserialize invalid file
with open("desired-model-file-name.pkll", "rb") as file:
    pickle.load(file)

>>> Output Below
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
c:\Users\samsung\Documents\Projects\Article specific\model-serialization-deserialization\model-serialization-deserialization.ipynb Cell 14 in <cell line: 2>()
      1 # Attempting to deserialize invalid file
----> 2 with open("desired-model-file-name.pkll", "rb") as file:
      3     pickle.load(file)

FileNotFoundError: [Errno 2] No such file or directory: 'desired-model-file-name.pkll'

Очень легко забыть букву или символ при попытке ввести имя файла. Если вы получаете сообщение об ошибке «Нет такого файла», это просто означает, что вы допустили опечатку. Чтобы исправить это, вам нужно либо тщательно переписать путь/имя файла, либо, что еще лучше, скопировать и вставить точный путь/имя, чтобы избежать ошибок.

Заключение

Pickle — очень мощная библиотека Python, которая позволяет пользователям сохранять и позже открывать объекты. Он предоставляет вам возможность хранить несколько версий вашей модели и, что наиболее важно, упрощает интеграцию вашей модели в такие приложения, как веб-приложения. Сохраненная модель может быть легко десериализована в файл на стороне сервера, параметры модели собираются через форму на фронтенде или любым другим способом, передаются в модель в виде массива после какой-либо разработки признаков, если это необходимо, и результат будет предоставлен без проблем. Получите доступ к репозиторию GitHub здесь.

Прочитав эту статью, вы теперь знаете, как хранить и открывать свои модели и различные другие объекты в python с помощью библиотеки pickle.

Вы также можете прочитать мою статью о создании полнофункциональных веб-приложений для интеграции моделей машинного обучения с использованием Flask, HTML и CSS здесь.

На этом пока все, увидимся в следующий раз…