Обработка и хранение данных являются важными аспектами любого языка программирования, и Python не является исключением. При работе с Python вам часто нужно сохранять, передавать или совместно использовать сложные структуры данных, такие как списки, словари или пользовательские объекты. Но как этого добиться, сохранив при этом целостность и структуру ваших данных? Ответ кроется в концепциях сериализации и травления.
В этой статье мы углубимся в мир сериализации и травления в Python. Вы узнаете, что означают эти термины, когда их использовать и как встроенный в Python модуль pickle
может помочь вам с легкостью обрабатывать сложные структуры данных. К концу этой статьи вы будете иметь четкое представление об этих концепциях и сможете уверенно применять их в своих проектах Python.
Сериализация и травление в Python
Что такое сериализация?
Сериализация — это процесс преобразования состояния объекта в поток байтов, который можно сохранить или передать, а затем реконструировать. Другими словами, он преобразует сложные структуры данных, такие как списки, словари или пользовательские объекты, в формат, который можно легко сохранить в файл или отправить по сети. Противоположный процесс, называемый десериализацией, восстанавливает поток байтов обратно в исходную объектную форму.
Например, допустим, у нас есть словарь, который мы хотим сериализовать:
data = {"name": "John", "age": 30, "city": "New York"} import json serialized_data = json.dumps(data) print(serialized_data) # Output: '{"name": "John", "age": 30, "city": "New York"}'
Здесь мы использовали модуль json
для сериализации нашего словаря в строку в формате JSON.
Что такое травление?
Pickling — это особая форма сериализации в Python. Это процесс преобразования объекта Python в поток байтов, который можно сохранить в файл или передать по сети. Этот поток байтов позже можно преобразовать обратно в объект Python, используя процесс «распаковки». Модуль pickle
в стандартной библиотеке Python используется для травления и распаковывания.
Давайте посмотрим на пример травления словаря:
data = {"name": "John", "age": 30, "city": "New York"} import pickle pickled_data = pickle.dumps(data) print(pickled_data) # Output: b'\x80\x04\x95#\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x04John\x94\x8c\x03age\x94K\x1e\x8c\x04city\x94\x8c\x07New York\x94u.'
В этом случае мы использовали модуль pickle
для преобразования нашего словаря в поток байтов.
Когда использовать сериализацию и травление?
Сериализация и травление полезны в различных сценариях, таких как:
- Сохранение состояния программы или данных в файл для последующего использования.
- Передача данных по сети между разными программами.
- Хранение и извлечение объектов Python в базах данных.
- Кэширование данных в памяти для повышения производительности.
Модуль pickle для Python
Модуль pickle
является частью стандартной библиотеки Python и используется для сериализации и десериализации объектов Python. Две основные функции модуля pickle
:
pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)
: Эта функция записывает маринованное представление obj в открытый файловый объектный файл.`
pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)`: эта функция считывает выделенный объект из открытого файлового объекта file и возвращает указанную в нем восстановленную иерархию объектов .
Вот простой пример использования pickle.dump()
и pickle.load()
:
import pickle data = {"name": "John", "age": 30, "city": "New York"} # Pickle the data and write it to a file with open("data.pkl", "wb") as file: pickle.dump(data, file) # Read the pickled data from the file and unpickle it with open("data.pkl", "rb") as file: loaded_data = pickle.load(file) print(loaded_data) # Output: {'name': 'John', 'age': 30, 'city': 'New York'}
Как видите, мы смогли выбрать словарь data
и сохранить его в файл с именем data.pkl. Затем мы открыли файл, прочитали маринованные данные и распаковали их обратно в словарь.
Важно отметить, что модуль pickle
не защищен от вредоносных данных. Если вы загружаете обработанные данные из ненадежного источника, рассмотрите возможность использования альтернативных форматов сериализации, таких как JSON.
Сериализация и травление являются важными понятиями в программировании на Python, позволяя вам с легкостью обрабатывать сложные структуры данных, а также хранить, передавать или совместно использовать их. Модуль Python pickle
предоставляет удобный способ выбора и удаления объектов Python, что делает его ценным инструментом в вашем наборе инструментов Python. Однако будьте осторожны при загрузке обработанных данных из ненадежных источников и рассмотрите возможность использования альтернативных форматов сериализации, если вас беспокоит безопасность.
Теперь, когда у вас есть полное представление о сериализации, травлении и модуле Python pickle
, у вас есть все необходимое для применения этих концепций в ваших собственных проектах.
Реальный проект: сохранение и загрузка обученных моделей машинного обучения
В этом разделе мы познакомим вас с реальным проектом, в котором вы будете применять концепции сериализации и травления. Мы создадим простую модель машинного обучения, используя популярную библиотеку Scikit-learn, обучим ее на наборе данных, сохраним обученную модель с помощью травления, а затем загрузим модель, чтобы делать прогнозы на новых данных.
Обзор проекта
Проект состоит из следующих шагов:
- Подготовка набора данных
- Обучение модели
- Сохранение модели с помощью травления
- Загрузка модели и создание прогнозов
- Оценка модели
Давайте углубимся в каждый шаг.
Подготовка набора данных
Для этого проекта мы будем использовать известный набор данных Iris, доступный в библиотеке Scikit-learn. Набор данных состоит из 150 образцов цветков ириса с четырьмя признаками (длина чашелистика, ширина чашелистика, длина лепестка и ширина лепестка) и целевой переменной, указывающей вид ириса.
Во-первых, давайте импортируем необходимые библиотеки и загрузим набор данных:
from sklearn import datasets from sklearn.model_selection import train_test_split iris = datasets.load_iris() X, y = iris.data, iris.target # Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Обучение модели
Мы будем использовать алгоритм k-ближайших соседей (k-NN) для обучения нашей модели. Это простой и эффективный алгоритм классификации, который работает, находя k ближайших соседей точки данных и назначая наиболее распространенный класс среди этих соседей.
from sklearn.neighbors import KNeighborsClassifier # Create a k-NN classifier with 3 neighbors knn = KNeighborsClassifier(n_neighbors=3) # Train the model using the training data knn.fit(X_train, y_train)
Сохранение модели с помощью травления
Теперь, когда мы обучили нашу модель, давайте сохраним ее с помощью модуля pickle
. Это позволит нам повторно использовать модель позже без ее переобучения.
import pickle # Save the trained model to a file with open("knn_model.pkl", "wb") as file: pickle.dump(knn, file)
Загрузка модели и создание прогнозов
Затем давайте загрузим сохраненную модель и используем ее для прогнозирования данных тестирования.
# Load the saved model from the file with open("knn_model.pkl", "rb") as file: loaded_knn = pickle.load(file) # Make predictions using the loaded model y_pred = loaded_knn.predict(X_test)
Оценка модели
Наконец, давайте оценим производительность нашей модели, сравнив ее прогнозы с истинными метками данных тестирования. Мы будем использовать показатель точности, который измеряет долю правильно классифицированных выборок.
from sklearn.metrics import accuracy_score # Calculate the accuracy of the model accuracy = accuracy_score(y_test, y_pred) print(f"Model accuracy: {accuracy:.2f}") # Output: Model accuracy: 1.00
Использование модели машинного обучения с новыми данными
Теперь, когда у нас есть сохраненная и загруженная обученная модель машинного обучения, мы можем использовать ее для прогнозирования новых данных. В этом разделе мы покажем вам, как вызвать модель k-NN для прогнозирования видов цветов ириса на основе их характеристик.
Предположим, у нас есть следующие новые данные о цветке ириса:
[ [5.1, 3.5, 1.4, 0.2], # Example of Iris Setosa [6.3, 3.3, 4.7, 1.6], # Example of Iris Versicolor [6.3, 2.5, 5.0, 1.9], # Example of Iris Virginica ]
Мы будем использовать нашу загруженную модель k-NN (loaded_knn
), чтобы предсказать виды для каждой из этих выборок.
# New data samples new_data = [ [5.1, 3.5, 1.4, 0.2], # Example of Iris Setosa [6.3, 3.3, 4.7, 1.6], # Example of Iris Versicolor [6.3, 2.5, 5.0, 1.9], # Example of Iris Virginica ] # Make predictions using the loaded k-NN model new_predictions = loaded_knn.predict(new_data) # Map the predicted target values to their corresponding species names species_names = {0: "Iris Setosa", 1: "Iris Versicolor", 2: "Iris Virginica"} predicted_species = [species_names[pred] for pred in new_predictions] # Display the predictions for i, species in enumerate(predicted_species): print(f"Sample {i + 1}: {species}")
На выходе будут показаны предсказанные виды для каждого образца:
Sample 1: Iris Setosa Sample 2: Iris Versicolor Sample 3: Iris Virginica
Теперь вы узнали, как вызывать загруженную модель машинного обучения, чтобы делать прогнозы на основе новых данных. Это важный шаг при развертывании моделей машинного обучения в производственных средах или их использовании для принятия решений на основе реальных данных.
В этом примере наша модель достигла идеальной точности, правильно классифицировав все образцы в наборе тестовых данных. Имейте в виду, что это относительно простая задача, и для более сложных наборов данных могут потребоваться более сложные модели и методы предварительной обработки.
Работая над этим реальным проектом, вы успешно применили концепции сериализации и травления, чтобы сохранить обученную модель машинного обучения и загрузить ее для прогнозирования. Этот метод может быть полезен в различных приложениях, таких как развертывание моделей машинного обучения в производственных средах или
Упражнение-вызов: создание диспетчера наборов данных с контролем версий
В этом сложном упражнении вы создадите диспетчер наборов данных с контролем версий для Apple Inc. Цель состоит в том, чтобы хранить наборы данных в форматах JSON и Pickle, а затем десериализовать и распаковать их, сохраняя целостность данных на протяжении всего процесса.
Описание упражнения
- Создайте Pandas DataFrame со следующими столбцами: Product, Category, Price и Release_Year. Заполните DataFrame некоторыми примерами данных, связанных с продуктами Apple Inc.
- Сериализуйте DataFrame в формате JSON и сохраните его в файл.
- Сериализуйте DataFrame с помощью травления и сохраните его в другом файле.
- Десериализуйте файл в формате JSON обратно в DataFrame.
- Распакуйте маринованный файл обратно в DataFrame.
- Сравните десериализованные/незащищенные кадры данных с оригиналом, чтобы обеспечить целостность данных.
Советы и подсказки
- Используйте библиотеку
pandas
для создания фреймов данных и управления ими. - Не забудьте импортировать необходимые библиотеки, такие как
json
иpickle
, для сериализации и травления. - Используйте методы
to_json()
иread_json()
в Pandas для сериализации и десериализации JSON. - Используйте функции
pickle.dump()
иpickle.load()
для травления и растравливания. - Вы можете сравнить DataFrames, используя метод
equals()
в Pandas.
Поделитесь своим решением
Выполнив задание, не стесняйтесь поделиться своим решением с другими! Это отличная возможность поучиться у коллег и обсудить различные подходы к проблеме. Помните, что часто существует несколько способов решения проблемы в программировании, и обсуждение различных решений может помочь вам расти как программисту.
Удачи и получайте удовольствие от изучения сериализации и травления в этом реальном сценарии использования Apple Inc.!
Вот пошаговое решение задачи:
Шаг 1: Создайте Pandas DataFrame со следующими столбцами: Product, Category, Price и Release_Year. Заполните DataFrame некоторыми примерами данных, связанных с продуктами Apple Inc.
import pandas as pd data = { "Product": ["iPhone 12", "MacBook Pro", "iPad Pro", "Apple Watch"], "Category": ["Smartphone", "Laptop", "Tablet", "Wearable"], "Price": [799, 1299, 999, 399], "Release_Year": [2020, 2020, 2021, 2020], } df = pd.DataFrame(data) print(df)
Шаг 2: сериализуйте DataFrame в формате JSON и сохраните его в файл.
df.to_json("apple_data.json", orient="records")
Шаг 3: сериализуйте DataFrame с помощью травления и сохраните его в другом файле.
import pickle with open("apple_data.pkl", "wb") as file: pickle.dump(df, file)
Шаг 4: Десериализуйте файл в формате JSON обратно в DataFrame.
df_from_json = pd.read_json("apple_data.json", orient="records") print(df_from_json)
Шаг 5: Распаковать обработанный файл обратно в DataFrame.
with open("apple_data.pkl", "rb") as file: df_from_pickle = pickle.load(file) print(df_from_pickle)
Шаг 6: Сравните десериализованные/нераспакованные кадры данных с оригиналом, чтобы обеспечить целостность данных.
# Compare the DataFrames from JSON and Pickle with the original DataFrame print(df.equals(df_from_json)) # Output: True print(df.equals(df_from_pickle)) # Output: True
Вывод True
указывает, что как десериализованные, так и необработанные кадры данных равны исходному кадру данных, что обеспечивает целостность данных.
Теперь вы успешно выполнили задание, создав диспетчер наборов данных с контролем версий для Apple Inc., сохранив набор данных в форматах JSON и Pickle и поддерживая целостность данных на протяжении всего процесса.