Вопрос или проблема
Мне нужно, чтобы тип данных полярного Categorical
имел одинаковое физическое представление на разных машинах. На одной машине я могу использовать pl.StringCache
, чтобы получить такое же физическое представление:
with pl.StringCache():
s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)
Но мне нужно воспроизвести такое же физическое кодирование на совершенно другой машине:
with pl.StringCache():
s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
# Как-то сохранить кодирование здесь
# На другой машине
with pl.StringCache(): # Как-то загрузить кодирование здесь
s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)
На данный момент это, похоже, невозможно, но есть ли какие-либо обходные пути?
Мой случай использования – машинное обучение. Я обучаю модель на категориальных данных на одной машине, и мне нужно кодирование для инференса на других машинах. Хотя я мог бы технически использовать кодировщик меток Scikit learn, я бы хотел остаться в полярных данных.
Ответ или решение
Для обеспечения согласованного представления категориальных данных в библиотеке Polars на разных машинах можно использовать несколько методов. Ниже представлен пошаговый процесс, как сохранить и повторно загрузить кодировку категориальных данных с использованием pl.StringCache
.
Шаг 1: Сохранение кодировки
При создании категориального столбца на первой машине, вместо того, чтобы использовать просто pl.StringCache
, можно сохранить уникальные значения и их соответствующие индексы, чтобы затем повторно использовать их на другой машине. В следующем примере показано, как это сделать.
import polars as pl
import json
# Первая машина
with pl.StringCache():
s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
# Сохраняем уникальные значения и их индексы
unique_values = s1.cat.categories
encoding = {value: index for index, value in enumerate(unique_values)}
# Сохраняем кодировку в файл
with open('encoding.json', 'w') as f:
json.dump(encoding, f)
Шаг 2: Загрузка кодировки на другой машине
На другой машине необходимо загрузить сохранённые данные кодировки и использовать их для создания категориальной переменной с тем же представлением.
import polars as pl
import json
# Вторая машина
with pl.StringCache():
# Загружаем кодировку из файла
with open('encoding.json', 'r') as f:
encoding = json.load(f)
# Воссоздаем кодировку
categories = list(encoding.keys())
# Создаем новый столбец с требуемыми данными
s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)
# Преобразуем данные по загруженной кодировке
s2 = pl.Series("color", s2.to_list(), dtype=pl.Categorical, categories=categories)
# Для правильного отображения индексов используем .cast
s2 = s2.cast(pl.Categorical)
Заметки
-
Согласованность категорий: Убедитесь, что во время предположенного воссоздания категорий, категории из первой машины и данные, которые вы хотите закодировать на второй машине, используют одну и ту же кодировку.
-
Обработка новых категорий: Если на второй машине присутствуют новые категории, которые не были определены на первой, то вы можете решить это, добавив их в категориальный набор при создании.
-
Использование в машинном обучении: Если вы используете категориальные данные для обучения моделей, убедитесь, что вы применяете одну и ту же кодировку при предсказаниях на разных машинах.
Данный подход позволяет сохранить и загрузить кодировку категориальных данных, обеспечивая согласованность между различными машинами, и, следовательно, подходит для реализации в задачах машинного обучения, где важна предсказуемость и воспроизводимость.